mirror of
https://github.com/Retera/WarsmashModEngine.git
synced 2022-07-31 17:38:59 +02:00
Beginning work on FDF parser
This commit is contained in:
parent
9bf38e0268
commit
29d72eac48
21
LICENSE
Normal file
21
LICENSE
Normal 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.
|
11
build.gradle
11
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"
|
||||
}
|
317
fdfparser/antlr-src/FDF.g4
Normal file
317
fdfparser/antlr-src/FDF.g4
Normal 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
49
fdfparser/build.gradle
Normal 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")
|
||||
}
|
@ -0,0 +1,5 @@
|
||||
package com.etheller.warsmash.fdfparser;
|
||||
|
||||
public interface FDFParserBuilder {
|
||||
FDFParser build(String path);
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
46
fdfparser/src/com/etheller/warsmash/fdfparser/Main.java
Normal file
46
fdfparser/src/com/etheller/warsmash/fdfparser/Main.java
Normal 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());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -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));
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
@ -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());
|
||||
}
|
||||
}
|
||||
}
|
@ -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
|
||||
}
|
@ -0,0 +1,13 @@
|
||||
package com.etheller.warsmash.parsers.fdf.templates;
|
||||
|
||||
public enum FramePoint {
|
||||
TOPLEFT,
|
||||
TOP,
|
||||
TOPRIGHT,
|
||||
LEFT,
|
||||
CENTER,
|
||||
RIGHT,
|
||||
BOTTOMLEFT,
|
||||
BOTTOM,
|
||||
BOTTOMRIGHT;
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
@ -0,0 +1,10 @@
|
||||
package com.etheller.warsmash.parsers.fdf.templates;
|
||||
|
||||
public enum TextJustify {
|
||||
TOP,
|
||||
MIDDLE,
|
||||
BOTTOM,
|
||||
LEFT,
|
||||
CENTER,
|
||||
RIGHT;
|
||||
}
|
@ -1 +1 @@
|
||||
include 'desktop', 'core'
|
||||
include 'desktop', 'core', 'fdfparser'
|
Loading…
Reference in New Issue
Block a user