From 29d72eac4883f4b5eee1f55d05c3a96e4b110bc5 Mon Sep 17 00:00:00 2001 From: Retera Date: Sun, 17 May 2020 23:57:07 -0400 Subject: [PATCH] Beginning work on FDF parser --- LICENSE | 21 ++ build.gradle | 11 + fdfparser/antlr-src/FDF.g4 | 317 ++++++++++++++++++ fdfparser/build.gradle | 49 +++ .../warsmash/fdfparser/FDFParserBuilder.java | 5 + .../fdfparser/FDFStatementVisitor.java | 36 ++ .../fdfparser/FrameDefinitionVisitor.java | 41 +++ .../com/etheller/warsmash/fdfparser/Main.java | 46 +++ .../fdfparser/TestFDFParserBuilder.java | 27 ++ .../warsmash/parsers/fdf/FDFNamedString.java | 19 ++ .../warsmash/parsers/fdf/FDFStatement.java | 7 + .../parsers/fdf/FDFStringListStatement.java | 20 ++ .../parsers/fdf/templates/FrameEvent.java | 20 ++ .../parsers/fdf/templates/FramePoint.java | 13 + .../templates/FrameTemplateEnvironment.java | 20 ++ .../parsers/fdf/templates/TextJustify.java | 10 + settings.gradle | 2 +- 17 files changed, 663 insertions(+), 1 deletion(-) create mode 100644 LICENSE create mode 100644 fdfparser/antlr-src/FDF.g4 create mode 100644 fdfparser/build.gradle create mode 100644 fdfparser/src/com/etheller/warsmash/fdfparser/FDFParserBuilder.java create mode 100644 fdfparser/src/com/etheller/warsmash/fdfparser/FDFStatementVisitor.java create mode 100644 fdfparser/src/com/etheller/warsmash/fdfparser/FrameDefinitionVisitor.java create mode 100644 fdfparser/src/com/etheller/warsmash/fdfparser/Main.java create mode 100644 fdfparser/src/com/etheller/warsmash/fdfparser/TestFDFParserBuilder.java create mode 100644 fdfparser/src/com/etheller/warsmash/parsers/fdf/FDFNamedString.java create mode 100644 fdfparser/src/com/etheller/warsmash/parsers/fdf/FDFStatement.java create mode 100644 fdfparser/src/com/etheller/warsmash/parsers/fdf/FDFStringListStatement.java create mode 100644 fdfparser/src/com/etheller/warsmash/parsers/fdf/templates/FrameEvent.java create mode 100644 fdfparser/src/com/etheller/warsmash/parsers/fdf/templates/FramePoint.java create mode 100644 fdfparser/src/com/etheller/warsmash/parsers/fdf/templates/FrameTemplateEnvironment.java create mode 100644 fdfparser/src/com/etheller/warsmash/parsers/fdf/templates/TextJustify.java diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..825ef4b --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 DrSuperGood + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/build.gradle b/build.gradle index 5a5d981..c0bc5fb 100644 --- a/build.gradle +++ b/build.gradle @@ -30,6 +30,7 @@ allprojects { box2DLightsVersion = '1.4' ashleyVersion = '1.7.0' aiVersion = '1.8.0' + antlrVersion = '4.7' } repositories { @@ -64,6 +65,7 @@ project(":core") { dependencies { + compile project(":fdfparser") compile "com.badlogicgames.gdx:gdx:$gdxVersion" compile "com.badlogicgames.gdx:gdx-box2d:$gdxVersion" compile "com.badlogicgames.gdx:gdx-freetype:$gdxVersion" @@ -74,6 +76,15 @@ project(":core") { } } +project(":fdfparser") { + apply plugin: "antlr" + + + dependencies { + antlr "org.antlr:antlr4:$antlrVersion" // use antlr version 4 + } +} + tasks.eclipse.doLast { delete ".project" } \ No newline at end of file diff --git a/fdfparser/antlr-src/FDF.g4 b/fdfparser/antlr-src/FDF.g4 new file mode 100644 index 0000000..8aa9c02 --- /dev/null +++ b/fdfparser/antlr-src/FDF.g4 @@ -0,0 +1,317 @@ +/** + * Define a grammar called FDF + */ +grammar FDF; + +@header { + package com.etheller.warsmash.fdfparser; +} + +program : + (statement)* + ; + +statement: + STRING_LIST OPEN_CURLY (ID STRING_LITERAL COMMA)*? CLOSE_CURLY # StringListStatement + | + INCLUDE_FILE STRING_LITERAL COMMA # IncludeStatement + | + frame # FrameStatement + ; + +frame: + FRAME STRING_LITERAL STRING_LITERAL OPEN_CURLY frame_element* CLOSE_CURLY # SimpleFrameDefinition + | + FRAME STRING_LITERAL STRING_LITERAL INHERITS STRING_LITERAL OPEN_CURLY frame_element* CLOSE_CURLY # FrameDefinition + | + FRAME STRING_LITERAL STRING_LITERAL INHERITS WITHCHILDREN STRING_LITERAL OPEN_CURLY frame_element* CLOSE_CURLY # FrameDefinitionWithChildren + ; + +frame_element: + frame # FrameFrameElement + | + HEIGHT FLOAT COMMA # HeightElement + | + WIDTH FLOAT COMMA # WidthElement + | + CONTROL_STYLE STRING_LITERAL COMMA # ControlStyleElement + | + CONTROL_BACKDROP STRING_LITERAL COMMA # ControlBackdropElement + | + CONTROL_PUSHED_BACKDROP STRING_LITERAL COMMA # ControlPushedBackdropElement + | + CONTROL_DISABLED_BACKDROP STRING_LITERAL COMMA # ControlDisabledBackdropElement + | + CONTROL_FOCUS_HIGHLIGHT STRING_LITERAL COMMA # ControlFocusHighlightElement + | + CONTROL_MOUSE_OVER_HIGHLIGHT STRING_LITERAL COMMA # ControlMouseOverHighlightElement + | + HIGHLIGHT_TYPE STRING_LITERAL COMMA # HighlightTypeElement + | + HIGHLIGHT_ALPHA_FILE STRING_LITERAL COMMA # HighlightAlphaFileElement + | + HIGHLIGHT_ALPHA_MODE STRING_LITERAL COMMA # HighlightAlphaModeElement + | + BUTTON_PUSHED_TEXT_OFFSET FLOAT FLOAT COMMA # ButtonPushedTextOffsetElement + | + DIALOG_BACKDROP STRING_LITERAL COMMA # DialogBackdropElement + | + BACKDROP_TILE_BACKGROUND COMMA # BackdropTileBackgroundElement + | + DECORATE_FILE_NAMES COMMA # DecorateFileNamesElement + | + BACKDROP_HALF_SIDES COMMA # BackdropHalfSidesElement + | + BACKDROP_BACKGROUND STRING_LITERAL COMMA # BackdropBackgroundElement + | + BACKDROP_CORNER_FLAGS STRING_LITERAL COMMA # BackdropCornerFlagsElement + | + BACKDROP_CORNER_SIZE FLOAT COMMA # BackdropCornerSizeElement + | + BACKDROP_BACKGROUND_SIZE FLOAT COMMA # BackdropBackgroundSizeElement + | + BACKDROP_BACKGROUND_INSETS FLOAT FLOAT FLOAT FLOAT COMMA # BackdropBackgroundInsetsElement + | + BACKDROP_EDGE_FILE STRING_LITERAL COMMA # BackdropEdgeFileElement + | + BACKDROP_BACKGROUND STRING_LITERAL COMMA # BackdropBackgroundElement + | + BACKDROP_BLEND_ALL COMMA # BackdropBlendAllElement + | + BUTTON_TEXT STRING_LITERAL COMMA #ButtonTextElement + | + TEXT STRING_LITERAL COMMA # TextElement + | + SETPOINT frame_point COMMA STRING_LITERAL COMMA frame_point COMMA FLOAT COMMA FLOAT COMMA # SetPointElement + | + BACKDROP_CORNER_FILE STRING_LITERAL COMMA # BackdropCornerFileElement + | + BACKDROP_LEFT_FILE STRING_LITERAL COMMA # BackdropLeftFileElement + | + BACKDROP_RIGHT_FILE STRING_LITERAL COMMA # BackdropRightFileElement + | + BACKDROP_TOP_FILE STRING_LITERAL COMMA # BackdropTopFileElement + | + BACKDROP_BOTTOM_FILE STRING_LITERAL COMMA # BackdropBottomFileElement + | + FRAME_FONT STRING_LITERAL COMMA FLOAT COMMA STRING_LITERAL COMMA # DecorateFileNamesElement + | + FONT_FLAGS STRING_LITERAL COMMA # FontFlagsElement + | + FONT_COLOR color COMMA # FontColorElement + | + FONT_HIGHLIGHT_COLOR color COMMA # FontHighlightColorElement + | + FONT_DISABLED_COLOR color COMMA # FontDisabledColorElement + | + FONT_SHADOW_COLOR color COMMA # FontShadowColorElement + | + FONT_SHADOW_OFFSET FLOAT FLOAT COMMA # FontShadowOffsetElement + | + FONT_JUSTIFICATION_H text_justify COMMA # FontJustificationHElement + | + FONT_JUSTIFICATION_V text_justify COMMA # FontJustificationVElement + | + FONT_JUSTIFICATION_OFFSET FLOAT FLOAT COMMA # FontJustificationOffsetElement + | + SLIDER_LAYOUT_HORIZONTAL COMMA # SliderLayoutHorizontalElement + | + SLIDER_LAYOUT_VERTICAL COMMA # SliderLayoutVerticalElement + | + SCROLL_BAR_INC_BUTTON_FRAME STRING_LITERAL COMMA # ScrollBarIncButtonFrameElement + | + SCROLL_BAR_DEC_BUTTON_FRAME STRING_LITERAL COMMA # ScrollBarDecButtonFrameElement + | + SLIDER_THUMB_BUTTON_FRAME STRING_LITERAL COMMA # SliderThumbButtonFrameElement + | + LIST_BOX_BORDER FLOAT COMMA # ListBoxBorderElement + | + LIST_BOX_SCROLL_BAR STRING_LITERAL COMMA # ListBoxScrollBarElement + | + EDIT_BORDER_SIZE FLOAT COMMA # EditBorderSizeElement + | + EDIT_CURSOR_COLOR color COMMA # EditCursorColorElement + | + MENU_TEXT_HIGHLIGHT_COLOR color COMMA # MenuTextHighlightColorElement + | + MENU_ITEM_HEIGHT FLOAT COMMA # MenuItemHighlightElement + | + MENU_BORDER FLOAT COMMA # MenuBorderElement + | + POPUP_BUTTON_INSET FLOAT COMMA # PopupButtonInsetElement + | + POPUP_TITLE_FRAME STRING_LITERAL COMMA # PopupTitleFrameElement + | + POPUP_ARROW_FRAME STRING_LITERAL COMMA # PopupArrowFrameElement + | + POPUP_MENU_FRAME STRING_LITERAL COMMA # PopupMenuFrameElement + | + CHECK_BOX_CHECK_HIGHLIGHT STRING_LITERAL COMMA # CheckBoxCheckHighlightElement + | + CHECK_BOX_DISABLED_CHECK_HIGHLIGHT STRING_LITERAL COMMA # CheckBoxDisabledCheckHighlightElement + | + TEXT_AREA_LINE_HEIGHT FLOAT COMMA # TextAreaLineHeightElement + | + TEXT_AREA_LINE_GAP FLOAT COMMA # TextAreaLineGapElement + | + TEXT_AREA_INSET FLOAT COMMA # TextAreaInsetElement + | + TEXT_AREA_SCROLL_BAR STRING_LITERAL COMMA # TextAreaScrollBarElement + | + CHAT_DISPLAY_LINE_HEIGHT FLOAT COMMA # ChatDisplayLineHeightElement + | + CHAT_DISPLAY_BORDER_SIZE FLOAT COMMA # ChatDisplayBorderSize + | + CHAT_DISPLAY_SCROLL_BAR STRING_LITERAL COMMA # ChatDisplayScrollBarElement + | + CHAT_DISPLAY_EDIT_BOX STRING_LITERAL COMMA # ChatDisplayEditBoxElement + ; + +text_justify: + JUSTIFYTOP | JUSTIFYMIDDLE | JUSTIFYBOTTOM | JUSTIFYLEFT | JUSTIFYCENTER | JUSTIFYRIGHT; + +frame_point: + FRAMEPOINT_TOPLEFT + | FRAMEPOINT_TOP + | FRAMEPOINT_TOPRIGHT + | FRAMEPOINT_LEFT + | FRAMEPOINT_CENTER + | FRAMEPOINT_RIGHT + | FRAMEPOINT_BOTTOMLEFT + | FRAMEPOINT_BOTTOM + | FRAMEPOINT_BOTTOMRIGHT; + +color: + FLOAT FLOAT FLOAT + | + FLOAT FLOAT FLOAT FLOAT + ; + +OPEN_CURLY : '{'; + +CLOSE_CURLY : '}'; + +STRING_LIST : 'StringList' ; + +INCLUDE_FILE : 'IncludeFile' ; + +FRAME : 'Frame' ; + +INHERITS : 'INHERITS' ; + +WITHCHILDREN : 'WITHCHILDREN' ; + +DECORATE_FILE_NAMES : 'DecorateFileNames'; + +HEIGHT : 'Height'; + +WIDTH : 'Width'; + +HIGHLIGHT_TYPE : 'HighlightType'; +HIGHLIGHT_ALPHA_FILE : 'HighlightAlphaFile'; +HIGHLIGHT_ALPHA_MODE : 'HighlightAlphaMode'; + +CONTROL_STYLE : 'ControlStyle'; +CONTROL_BACKDROP : 'ControlBackdrop'; +CONTROL_PUSHED_BACKDROP : 'ControlPushedBackdrop'; +CONTROL_DISABLED_BACKDROP : 'ControlDisabledBackdrop'; +CONTROL_FOCUS_HIGHLIGHT : 'ControlFocusHighlight'; +CONTROL_MOUSE_OVER_HIGHLIGHT : 'ControlMouseOverHighlight'; + +DIALOG_BACKDROP : 'DialogBackdrop'; + +BACKDROP_TILE_BACKGROUND : 'BackdropTileBackground'; +BACKDROP_HALF_SIDES : 'BackdropHalfSides'; +BACKDROP_BACKGROUND : 'BackdropBackground'; +BACKDROP_BLEND_ALL : 'BackdropBlendAll'; +BACKDROP_CORNER_FLAGS : 'BackdropCornerFlags'; +BACKDROP_CORNER_SIZE : 'BackdropCornerSize'; +BACKDROP_BACKGROUND_SIZE : 'BackdropBackgroundSize'; +BACKDROP_BACKGROUND_INSETS : 'BackdropBackgroundInsets'; +BACKDROP_EDGE_FILE : 'BackdropEdgeFile'; +BACKDROP_CORNER_FILE : 'BackdropCornerFile'; +BACKDROP_LEFT_FILE : 'BackdropLeftFile'; +BACKDROP_RIGHT_FILE : 'BackdropRightFile'; +BACKDROP_TOP_FILE : 'BackdropTopFile'; +BACKDROP_BOTTOM_FILE : 'BackdropBottomFile'; + +FRAME_FONT : 'FrameFont'; +FONT_FLAGS : 'FontFlags'; +FONT_COLOR : 'FontColor'; +FONT_HIGHLIGHT_COLOR : 'FontHighlightColor'; +FONT_DISABLED_COLOR : 'FontDisabledColor'; +FONT_SHADOW_COLOR : 'FontShadowColor'; +FONT_SHADOW_OFFSET : 'FontShadowOffset'; +FONT_JUSTIFICATION_H : 'FontJustificationH'; +FONT_JUSTIFICATION_V : 'FontJustificationV'; +FONT_JUSTIFICATION_OFFSET : 'FontJustificationOffset'; + +SLIDER_LAYOUT_HORIZONTAL : 'SliderLayoutHorizontal'; +SLIDER_LAYOUT_VERTICAL : 'SliderLayoutVertical'; +SLIDER_THUMB_BUTTON_FRAME : 'SliderThumbButtonFrame'; +SCROLL_BAR_DEC_BUTTON_FRAME : 'ScrollBarDecButtonFrame'; +SCROLL_BAR_INC_BUTTON_FRAME : 'ScrollBarIncButtonFrame'; + +LIST_BOX_BORDER : 'ListBoxBorder'; +LIST_BOX_SCROLL_BAR : 'ListBoxScrollBar'; + +EDIT_BORDER_SIZE : 'EditBorderSize'; +EDIT_CURSOR_COLOR : 'EditCursorColor'; + +MENU_TEXT_HIGHLIGHT_COLOR : 'MenuTextHighlightColor'; +MENU_ITEM_HEIGHT : 'MenuItemHeight'; +MENU_BORDER : 'MenuBorder'; + +POPUP_BUTTON_INSET : 'PopupButtonInset'; +POPUP_TITLE_FRAME : 'PopupTitleFrame'; +POPUP_ARROW_FRAME : 'PopupArrowFrame'; +POPUP_MENU_FRAME : 'PopupMenuFrame'; +CHECK_BOX_CHECK_HIGHLIGHT : 'CheckBoxCheckHighlight'; +CHECK_BOX_DISABLED_CHECK_HIGHLIGHT : 'CheckBoxDisabledCheckHighlight'; + +TEXT_AREA_LINE_HEIGHT : 'TextAreaLineHeight'; +TEXT_AREA_LINE_GAP : 'TextAreaLineGap'; +TEXT_AREA_INSET : 'TextAreaInset'; +TEXT_AREA_SCROLL_BAR : 'TextAreaScrollBar'; + +CHAT_DISPLAY_LINE_HEIGHT : 'ChatDisplayLineHeight'; +CHAT_DISPLAY_BORDER_SIZE : 'ChatDisplayBorderSize'; +CHAT_DISPLAY_SCROLL_BAR : 'ChatDisplayScrollBar'; +CHAT_DISPLAY_EDIT_BOX : 'ChatDisplayEditBox'; + +BUTTON_TEXT : 'ButtonText'; +BUTTON_PUSHED_TEXT_OFFSET : 'ButtonPushedTextOffset'; + +TEXT : 'Text'; + +SETPOINT : 'SetPoint'; + +JUSTIFYTOP : 'JUSTIFYTOP'; +JUSTIFYMIDDLE : 'JUSTIFYMIDDLE'; +JUSTIFYBOTTOM : 'JUSTIFYBOTTOM'; +JUSTIFYLEFT : 'JUSTIFYLEFT'; +JUSTIFYCENTER : 'JUSTIFYCENTER'; +JUSTIFYRIGHT : 'JUSTIFYRIGHT'; + +FRAMEPOINT_TOPLEFT : 'TOPLEFT'; +FRAMEPOINT_TOP : 'TOP'; +FRAMEPOINT_TOPRIGHT : 'TOPRIGHT'; +FRAMEPOINT_LEFT : 'LEFT'; +FRAMEPOINT_CENTER : 'CENTER'; +FRAMEPOINT_RIGHT : 'RIGHT'; +FRAMEPOINT_BOTTOMLEFT : 'BOTTOMLEFT'; +FRAMEPOINT_BOTTOM : 'BOTTOM'; +FRAMEPOINT_BOTTOMRIGHT : 'BOTTOMRIGHT'; + +ID : ([a-zA-Z_][a-zA-Z_0-9]*) ; + +COMMA : ','; + +STRING_LITERAL : ('"'.*?'"'); + +WS : [ \t\r\n]+ -> skip ; + +FLOAT : '-'?([0]|([1-9][0-9]*))('.'([0-9]*)?)?'f'? ; + +MULTI_LINE_COMMENT : '/*'.*?'*/' -> skip ; +COMMENT : '//'.*?'\n' -> skip ; diff --git a/fdfparser/build.gradle b/fdfparser/build.gradle new file mode 100644 index 0000000..679dff9 --- /dev/null +++ b/fdfparser/build.gradle @@ -0,0 +1,49 @@ +apply plugin: "antlr" + +sourceCompatibility = 1.8 +[compileJava, compileTestJava]*.options*.encoding = 'UTF-8' + +sourceSets.main.java.srcDirs = [ "src/", "build/generated-src" ] +sourceSets.main.antlr.srcDirs = [ "antlr-src/" ] + +project.ext.mainClassName = "com.etheller.warsmash.fdfparser.Main" + +task run(dependsOn: classes, type: JavaExec) { + main = project.mainClassName + classpath = sourceSets.main.runtimeClasspath + standardInput = System.in + ignoreExitValue = true +} + +task dist(type: Jar) { + from files(sourceSets.main.output.classesDir) + from files(sourceSets.main.output.resourcesDir) + from {configurations.compile.collect {zipTree(it)}} + + manifest { + attributes 'Main-Class': project.mainClassName + } +} + +dist.dependsOn classes + +eclipse.project { + name = appName + "-fdfparser" +} + +task afterEclipseImport(description: "Post processing after project generation", group: "IDE") { + doLast { + def classpath = new XmlParser().parse(file(".classpath")) + def writer = new FileWriter(file(".classpath")) + def printer = new XmlNodePrinter(new PrintWriter(writer)) + printer.setPreserveWhitespace(true) + printer.print(classpath) + } +} + + +generateGrammarSource { + maxHeapSize = "64m" + arguments += ["-visitor", "-no-listener"] + outputDirectory = file("build/generated-src/com/etheller/warsmash/fdfparser") +} \ No newline at end of file diff --git a/fdfparser/src/com/etheller/warsmash/fdfparser/FDFParserBuilder.java b/fdfparser/src/com/etheller/warsmash/fdfparser/FDFParserBuilder.java new file mode 100644 index 0000000..66c2df4 --- /dev/null +++ b/fdfparser/src/com/etheller/warsmash/fdfparser/FDFParserBuilder.java @@ -0,0 +1,5 @@ +package com.etheller.warsmash.fdfparser; + +public interface FDFParserBuilder { + FDFParser build(String path); +} diff --git a/fdfparser/src/com/etheller/warsmash/fdfparser/FDFStatementVisitor.java b/fdfparser/src/com/etheller/warsmash/fdfparser/FDFStatementVisitor.java new file mode 100644 index 0000000..3b33223 --- /dev/null +++ b/fdfparser/src/com/etheller/warsmash/fdfparser/FDFStatementVisitor.java @@ -0,0 +1,36 @@ +package com.etheller.warsmash.fdfparser; + +import java.util.ArrayList; +import java.util.List; + +import org.antlr.v4.runtime.tree.TerminalNode; + +import com.etheller.warsmash.fdfparser.FDFParser.IncludeStatementContext; +import com.etheller.warsmash.fdfparser.FDFParser.StringListStatementContext; +import com.etheller.warsmash.parsers.fdf.FDFNamedString; +import com.etheller.warsmash.parsers.fdf.FDFStatement; +import com.etheller.warsmash.parsers.fdf.FDFStringListStatement; + +public class FDFStatementVisitor extends FDFBaseVisitor { + + @Override + public FDFStatement visitStringListStatement(final StringListStatementContext ctx) { + final List namedStrings = new ArrayList<>(); + final List ids = ctx.ID(); + final List strings = ctx.STRING_LITERAL(); + for (int i = 0; i < ids.size(); i++) { + final String id = ids.get(i).getText(); + String value = strings.get(i).getText(); + value = value.substring(1, value.length() - 1); + namedStrings.add(new FDFNamedString(id, value)); + } + return new FDFStringListStatement(namedStrings); + } + + @Override + public FDFStatement visitIncludeStatement(final IncludeStatementContext ctx) { + String includeFilePath = ctx.STRING_LITERAL().getText(); + includeFilePath = includeFilePath.substring(1, includeFilePath.length() - 1); + return super.visitIncludeStatement(ctx); + } +} diff --git a/fdfparser/src/com/etheller/warsmash/fdfparser/FrameDefinitionVisitor.java b/fdfparser/src/com/etheller/warsmash/fdfparser/FrameDefinitionVisitor.java new file mode 100644 index 0000000..c56cb63 --- /dev/null +++ b/fdfparser/src/com/etheller/warsmash/fdfparser/FrameDefinitionVisitor.java @@ -0,0 +1,41 @@ +package com.etheller.warsmash.fdfparser; + +import java.util.List; + +import org.antlr.v4.runtime.tree.TerminalNode; + +import com.etheller.warsmash.fdfparser.FDFParser.IncludeStatementContext; +import com.etheller.warsmash.fdfparser.FDFParser.StringListStatementContext; +import com.etheller.warsmash.parsers.fdf.templates.FrameTemplateEnvironment; + +public class FrameDefinitionVisitor extends FDFBaseVisitor { + private final FrameTemplateEnvironment templates; + private final FDFParserBuilder fdfParserBuilder; + + public FrameDefinitionVisitor(final FrameTemplateEnvironment templates, final FDFParserBuilder fdfParserBuilder) { + this.templates = templates; + this.fdfParserBuilder = fdfParserBuilder; + } + + @Override + public Void visitStringListStatement(final StringListStatementContext ctx) { + final List ids = ctx.ID(); + final List strings = ctx.STRING_LITERAL(); + for (int i = 0; i < ids.size(); i++) { + final String id = ids.get(i).getText(); + String value = strings.get(i).getText(); + value = value.substring(1, value.length() - 1); + this.templates.addDecoratedString(id, value); + } + return null; + } + + @Override + public Void visitIncludeStatement(final IncludeStatementContext ctx) { + String includeFilePath = ctx.STRING_LITERAL().getText(); + includeFilePath = includeFilePath.substring(1, includeFilePath.length() - 1); + final FDFParser parser = this.fdfParserBuilder.build(includeFilePath); + visit(parser.program()); + return null; + } +} diff --git a/fdfparser/src/com/etheller/warsmash/fdfparser/Main.java b/fdfparser/src/com/etheller/warsmash/fdfparser/Main.java new file mode 100644 index 0000000..be42bff --- /dev/null +++ b/fdfparser/src/com/etheller/warsmash/fdfparser/Main.java @@ -0,0 +1,46 @@ +package com.etheller.warsmash.fdfparser; + +import org.antlr.v4.runtime.BaseErrorListener; +import org.antlr.v4.runtime.RecognitionException; +import org.antlr.v4.runtime.Recognizer; + +import com.etheller.warsmash.parsers.fdf.templates.FrameTemplateEnvironment; + +public class Main { + public static final boolean REPORT_SYNTAX_ERRORS = true; + + public static void main(final String[] args) { + if (args.length < 1) { + System.err.println("Usage: "); + return; + } + try { + final BaseErrorListener errorListener = new BaseErrorListener() { + @Override + public void syntaxError(final Recognizer recognizer, final Object offendingSymbol, final int line, + final int charPositionInLine, final String msg, final RecognitionException e) { + if (!REPORT_SYNTAX_ERRORS) { + return; + } + + String sourceName = recognizer.getInputStream().getSourceName(); + if (!sourceName.isEmpty()) { + sourceName = String.format("%s:%d:%d: ", sourceName, line, charPositionInLine); + } + + System.err.println(sourceName + "line " + line + ":" + charPositionInLine + " " + msg); + } + }; + final FrameTemplateEnvironment templates = new FrameTemplateEnvironment(); + final TestFDFParserBuilder testFDFParserBuilder = new TestFDFParserBuilder(errorListener); + final FrameDefinitionVisitor fdfVisitor = new FrameDefinitionVisitor(templates, testFDFParserBuilder); + final FDFParser firstFileParser = testFDFParserBuilder.build(args[0]); + fdfVisitor.visit(firstFileParser.program()); + System.out.println("Value of MONTH_12: " + templates.getDecoratedString("MONTH_12")); + } + catch (final Exception exc) { + System.err.println(exc.getMessage()); + } + } + +} diff --git a/fdfparser/src/com/etheller/warsmash/fdfparser/TestFDFParserBuilder.java b/fdfparser/src/com/etheller/warsmash/fdfparser/TestFDFParserBuilder.java new file mode 100644 index 0000000..df363f1 --- /dev/null +++ b/fdfparser/src/com/etheller/warsmash/fdfparser/TestFDFParserBuilder.java @@ -0,0 +1,27 @@ +package com.etheller.warsmash.fdfparser; + +import java.io.IOException; + +import org.antlr.v4.runtime.BaseErrorListener; +import org.antlr.v4.runtime.CharStreams; +import org.antlr.v4.runtime.CommonTokenStream; + +public class TestFDFParserBuilder implements FDFParserBuilder { + private final BaseErrorListener errorListener; + + public TestFDFParserBuilder(final BaseErrorListener errorListener) { + this.errorListener = errorListener; + } + + @Override + public FDFParser build(final String path) { + FDFLexer lexer; + try { + lexer = new FDFLexer(CharStreams.fromFileName(path)); + } + catch (final IOException e) { + throw new RuntimeException(e); + } + return new FDFParser(new CommonTokenStream(lexer)); + } +} diff --git a/fdfparser/src/com/etheller/warsmash/parsers/fdf/FDFNamedString.java b/fdfparser/src/com/etheller/warsmash/parsers/fdf/FDFNamedString.java new file mode 100644 index 0000000..46a8e0c --- /dev/null +++ b/fdfparser/src/com/etheller/warsmash/parsers/fdf/FDFNamedString.java @@ -0,0 +1,19 @@ +package com.etheller.warsmash.parsers.fdf; + +public class FDFNamedString { + private final String name; + private final String value; + + public FDFNamedString(final String name, final String value) { + this.name = name; + this.value = value; + } + + public String getName() { + return this.name; + } + + public String getValue() { + return this.value; + } +} diff --git a/fdfparser/src/com/etheller/warsmash/parsers/fdf/FDFStatement.java b/fdfparser/src/com/etheller/warsmash/parsers/fdf/FDFStatement.java new file mode 100644 index 0000000..720e500 --- /dev/null +++ b/fdfparser/src/com/etheller/warsmash/parsers/fdf/FDFStatement.java @@ -0,0 +1,7 @@ +package com.etheller.warsmash.parsers.fdf; + +import com.etheller.warsmash.parsers.fdf.templates.FrameTemplateEnvironment; + +public interface FDFStatement { + void loadTemplate(FrameTemplateEnvironment frameDef); +} diff --git a/fdfparser/src/com/etheller/warsmash/parsers/fdf/FDFStringListStatement.java b/fdfparser/src/com/etheller/warsmash/parsers/fdf/FDFStringListStatement.java new file mode 100644 index 0000000..7e65385 --- /dev/null +++ b/fdfparser/src/com/etheller/warsmash/parsers/fdf/FDFStringListStatement.java @@ -0,0 +1,20 @@ +package com.etheller.warsmash.parsers.fdf; + +import java.util.List; + +import com.etheller.warsmash.parsers.fdf.templates.FrameTemplateEnvironment; + +public class FDFStringListStatement implements FDFStatement { + private final List namedStrings; + + public FDFStringListStatement(final List namedStrings) { + this.namedStrings = namedStrings; + } + + @Override + public void loadTemplate(final FrameTemplateEnvironment frameDef) { + for (final FDFNamedString string : this.namedStrings) { + frameDef.addDecoratedString(string.getName(), string.getValue()); + } + } +} diff --git a/fdfparser/src/com/etheller/warsmash/parsers/fdf/templates/FrameEvent.java b/fdfparser/src/com/etheller/warsmash/parsers/fdf/templates/FrameEvent.java new file mode 100644 index 0000000..1c8d85d --- /dev/null +++ b/fdfparser/src/com/etheller/warsmash/parsers/fdf/templates/FrameEvent.java @@ -0,0 +1,20 @@ +package com.etheller.warsmash.parsers.fdf.templates; + +public enum FrameEvent { + CONTROL_CLICK, + MOUSE_ENTER, + MOUSE_LEAVE, + MOUSE_UP, + MOUSE_DOWN, + MOUSE_WHEEL, + CHECKBOX_CHECKED, + CHECKBOX_UNCHECKED, + EDITBOX_TEXT_CHANGED, + POPUPMENU_ITEM_CHANGED, + MOUSE_DOUBLECLICK, + SPRITE_ANIM_UPDATE, + SLIDER_VALUE_CHANGED, + DIALOG_CANCEL, + DIALOG_ACCEPT, + EDITBOX_ENTER +} diff --git a/fdfparser/src/com/etheller/warsmash/parsers/fdf/templates/FramePoint.java b/fdfparser/src/com/etheller/warsmash/parsers/fdf/templates/FramePoint.java new file mode 100644 index 0000000..ec66f90 --- /dev/null +++ b/fdfparser/src/com/etheller/warsmash/parsers/fdf/templates/FramePoint.java @@ -0,0 +1,13 @@ +package com.etheller.warsmash.parsers.fdf.templates; + +public enum FramePoint { + TOPLEFT, + TOP, + TOPRIGHT, + LEFT, + CENTER, + RIGHT, + BOTTOMLEFT, + BOTTOM, + BOTTOMRIGHT; +} diff --git a/fdfparser/src/com/etheller/warsmash/parsers/fdf/templates/FrameTemplateEnvironment.java b/fdfparser/src/com/etheller/warsmash/parsers/fdf/templates/FrameTemplateEnvironment.java new file mode 100644 index 0000000..f632619 --- /dev/null +++ b/fdfparser/src/com/etheller/warsmash/parsers/fdf/templates/FrameTemplateEnvironment.java @@ -0,0 +1,20 @@ +package com.etheller.warsmash.parsers.fdf.templates; + +import java.util.HashMap; +import java.util.Map; + +public class FrameTemplateEnvironment { + private final Map idToDecoratedString = new HashMap<>(); + + public void addDecoratedString(final String id, final String value) { + this.idToDecoratedString.put(id, value); + } + + public String getDecoratedString(final String id) { + final String decoratedString = this.idToDecoratedString.get(id); + if (decoratedString != null) { + return decoratedString; + } + return id; + } +} diff --git a/fdfparser/src/com/etheller/warsmash/parsers/fdf/templates/TextJustify.java b/fdfparser/src/com/etheller/warsmash/parsers/fdf/templates/TextJustify.java new file mode 100644 index 0000000..c793401 --- /dev/null +++ b/fdfparser/src/com/etheller/warsmash/parsers/fdf/templates/TextJustify.java @@ -0,0 +1,10 @@ +package com.etheller.warsmash.parsers.fdf.templates; + +public enum TextJustify { + TOP, + MIDDLE, + BOTTOM, + LEFT, + CENTER, + RIGHT; +} diff --git a/settings.gradle b/settings.gradle index 74fc652..c398e3a 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1 @@ -include 'desktop', 'core' \ No newline at end of file +include 'desktop', 'core', 'fdfparser' \ No newline at end of file