Beginning work on FDF parser

This commit is contained in:
Retera 2020-05-17 23:57:07 -04:00
parent 9bf38e0268
commit 29d72eac48
17 changed files with 663 additions and 1 deletions

21
LICENSE Normal file
View File

@ -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.

View File

@ -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"
}

317
fdfparser/antlr-src/FDF.g4 Normal file
View File

@ -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 ;

49
fdfparser/build.gradle Normal file
View File

@ -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")
}

View File

@ -0,0 +1,5 @@
package com.etheller.warsmash.fdfparser;
public interface FDFParserBuilder {
FDFParser build(String path);
}

View File

@ -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<FDFStatement> {
@Override
public FDFStatement visitStringListStatement(final StringListStatementContext ctx) {
final List<FDFNamedString> namedStrings = new ArrayList<>();
final List<TerminalNode> ids = ctx.ID();
final List<TerminalNode> 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);
}
}

View File

@ -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<Void> {
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<TerminalNode> ids = ctx.ID();
final List<TerminalNode> 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;
}
}

View File

@ -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: <Filename>");
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());
}
}
}

View File

@ -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));
}
}

View File

@ -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;
}
}

View File

@ -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);
}

View File

@ -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<FDFNamedString> namedStrings;
public FDFStringListStatement(final List<FDFNamedString> namedStrings) {
this.namedStrings = namedStrings;
}
@Override
public void loadTemplate(final FrameTemplateEnvironment frameDef) {
for (final FDFNamedString string : this.namedStrings) {
frameDef.addDecoratedString(string.getName(), string.getValue());
}
}
}

View File

@ -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
}

View File

@ -0,0 +1,13 @@
package com.etheller.warsmash.parsers.fdf.templates;
public enum FramePoint {
TOPLEFT,
TOP,
TOPRIGHT,
LEFT,
CENTER,
RIGHT,
BOTTOMLEFT,
BOTTOM,
BOTTOMRIGHT;
}

View File

@ -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<String, String> 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;
}
}

View File

@ -0,0 +1,10 @@
package com.etheller.warsmash.parsers.fdf.templates;
public enum TextJustify {
TOP,
MIDDLE,
BOTTOM,
LEFT,
CENTER,
RIGHT;
}

View File

@ -1 +1 @@
include 'desktop', 'core'
include 'desktop', 'core', 'fdfparser'