Key value pair parser for FDF, new design

This commit is contained in:
Retera 2020-05-20 08:21:29 -04:00
parent 6034509ebe
commit 2ca02df71b
23 changed files with 632 additions and 170 deletions

View File

@ -0,0 +1,48 @@
package com.etheller.warsmash.parsers.fdf;
import java.io.IOException;
import org.antlr.v4.runtime.BaseErrorListener;
import org.antlr.v4.runtime.CharStreams;
import org.antlr.v4.runtime.CommonTokenStream;
import org.antlr.v4.runtime.RecognitionException;
import org.antlr.v4.runtime.Recognizer;
import com.etheller.warsmash.datasources.DataSource;
import com.etheller.warsmash.fdfparser.FDFLexer;
import com.etheller.warsmash.fdfparser.FDFParser;
import com.etheller.warsmash.fdfparser.FDFParserBuilder;
public class DataSourceFDFParserBuilder implements FDFParserBuilder {
private final DataSource dataSource;
public DataSourceFDFParserBuilder(final DataSource dataSource) {
this.dataSource = dataSource;
}
@Override
public FDFParser build(final String path) {
FDFLexer lexer;
try {
lexer = new FDFLexer(CharStreams.fromStream(this.dataSource.getResourceAsStream(path)));
}
catch (final IOException e) {
throw new RuntimeException(e);
}
final FDFParser fdfParser = new FDFParser(new CommonTokenStream(lexer));
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) {
String sourceName = path;
if (!sourceName.isEmpty()) {
sourceName = String.format("%s:%d:%d: ", sourceName, line, charPositionInLine);
}
System.err.println(sourceName + "line " + line + ":" + charPositionInLine + " " + msg);
}
};
fdfParser.addErrorListener(errorListener);
return fdfParser;
}
}

View File

@ -0,0 +1,55 @@
package com.etheller.warsmash.parsers.fdf;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import com.etheller.warsmash.datasources.CompoundDataSourceDescriptor;
import com.etheller.warsmash.datasources.DataSource;
import com.etheller.warsmash.datasources.DataSourceDescriptor;
import com.etheller.warsmash.datasources.FolderDataSourceDescriptor;
import com.etheller.warsmash.fdfparser.FDFParser;
import com.etheller.warsmash.fdfparser.FrameDefinitionVisitor;
import com.etheller.warsmash.parsers.fdf.datamodel.FrameDefinition;
import com.etheller.warsmash.parsers.fdf.datamodel.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 FolderDataSourceDescriptor war3mpq = new FolderDataSourceDescriptor(
"E:\\Backups\\Warcraft\\Data\\127");
final FolderDataSourceDescriptor testingFolder = new FolderDataSourceDescriptor(
"E:\\Backups\\Warsmash\\Data");
final FolderDataSourceDescriptor currentFolder = new FolderDataSourceDescriptor(".");
final DataSource dataSource = new CompoundDataSourceDescriptor(
Arrays.<DataSourceDescriptor>asList(war3mpq, testingFolder, currentFolder)).createDataSource();
final FrameTemplateEnvironment templates = new FrameTemplateEnvironment();
final DataSourceFDFParserBuilder dataSourceFDFParserBuilder = new DataSourceFDFParserBuilder(dataSource);
final FrameDefinitionVisitor fdfVisitor = new FrameDefinitionVisitor(templates, dataSourceFDFParserBuilder);
try (BufferedReader reader = new BufferedReader(
new InputStreamReader(dataSource.getResourceAsStream("UI\\FrameDef\\FrameDef.toc")))) {
String line;
while ((line = reader.readLine()) != null) {
final FDFParser firstFileParser = dataSourceFDFParserBuilder.build(line);
fdfVisitor.visit(firstFileParser.program());
}
}
final FrameDefinition bnetChat = templates.getFrame("ConsoleUI");
System.out.println("Value of ConsoleUI: " + bnetChat);
}
catch (final Exception exc) {
exc.printStackTrace();
System.err.println(exc.getMessage());
}
}
}

View File

@ -1,19 +1,156 @@
package com.etheller.warsmash.fdfparser;
import com.etheller.warsmash.fdfparser.FDFParser.BackdropBackgroundElementContext;
import com.etheller.warsmash.parsers.fdf.datamodel.FrameDefintion;
import com.etheller.warsmash.fdfparser.FDFParser.AnchorElementContext;
import com.etheller.warsmash.fdfparser.FDFParser.FlagElementContext;
import com.etheller.warsmash.fdfparser.FDFParser.FloatElementContext;
import com.etheller.warsmash.fdfparser.FDFParser.FontElementContext;
import com.etheller.warsmash.fdfparser.FDFParser.FrameFrameElementContext;
import com.etheller.warsmash.fdfparser.FDFParser.SetPointElementContext;
import com.etheller.warsmash.fdfparser.FDFParser.SimpleFontElementContext;
import com.etheller.warsmash.fdfparser.FDFParser.StringElementContext;
import com.etheller.warsmash.fdfparser.FDFParser.StringPairElementContext;
import com.etheller.warsmash.fdfparser.FDFParser.TextJustifyElementContext;
import com.etheller.warsmash.fdfparser.FDFParser.Vector2ElementContext;
import com.etheller.warsmash.fdfparser.FDFParser.Vector3ElementContext;
import com.etheller.warsmash.fdfparser.FDFParser.Vector4CommaElementContext;
import com.etheller.warsmash.fdfparser.FDFParser.Vector4ElementContext;
import com.etheller.warsmash.parsers.fdf.datamodel.AnchorDefinition;
import com.etheller.warsmash.parsers.fdf.datamodel.FontDefinition;
import com.etheller.warsmash.parsers.fdf.datamodel.FrameDefinition;
import com.etheller.warsmash.parsers.fdf.datamodel.FramePoint;
import com.etheller.warsmash.parsers.fdf.datamodel.SetPointDefinition;
import com.etheller.warsmash.parsers.fdf.datamodel.TextJustify;
import com.etheller.warsmash.parsers.fdf.datamodel.Vector2Definition;
import com.etheller.warsmash.parsers.fdf.datamodel.Vector4Definition;
import com.etheller.warsmash.parsers.fdf.datamodel.fields.FloatFrameDefinitionField;
import com.etheller.warsmash.parsers.fdf.datamodel.fields.FontFrameDefinitionField;
import com.etheller.warsmash.parsers.fdf.datamodel.fields.StringFrameDefinitionField;
import com.etheller.warsmash.parsers.fdf.datamodel.fields.StringPairFrameDefinitionField;
import com.etheller.warsmash.parsers.fdf.datamodel.fields.TextJustifyFrameDefinitionField;
import com.etheller.warsmash.parsers.fdf.datamodel.fields.Vector2FrameDefinitionField;
import com.etheller.warsmash.parsers.fdf.datamodel.fields.Vector4FrameDefinitionField;
public class FrameDefinitionFieldVisitor extends FDFBaseVisitor<Void> {
private final FrameDefintion frameDefintion;
private static final int JUSTIFY_OFFSET = "JUSTIFY".length();
private final FrameDefinition frameDefinition;
private final FrameDefinitionVisitor frameDefinitionVisitor;
public FrameDefinitionFieldVisitor(final FrameDefintion frameDefintion,
public FrameDefinitionFieldVisitor(final FrameDefinition frameDefinition,
final FrameDefinitionVisitor frameDefinitionVisitor) {
this.frameDefintion = frameDefintion;
this.frameDefinition = frameDefinition;
this.frameDefinitionVisitor = frameDefinitionVisitor;
}
@Override
public Void visitBackdropBackgroundElement(final BackdropBackgroundElementContext ctx) {
this.frameDefintion.set("BackdropBackground", value);
public Void visitStringElement(final StringElementContext ctx) {
String text = ctx.STRING_LITERAL().getText();
text = text.substring(1, text.length() - 1);
this.frameDefinition.set(ctx.ID().getText(), new StringFrameDefinitionField(text));
return null;
}
@Override
public Void visitStringPairElement(final StringPairElementContext ctx) {
String first = ctx.STRING_LITERAL(0).getText();
first = first.substring(1, first.length() - 1);
String second = ctx.STRING_LITERAL(1).getText();
second = second.substring(1, second.length() - 1);
this.frameDefinition.set(ctx.ID().getText(), new StringPairFrameDefinitionField(first, second));
return super.visitStringPairElement(ctx);
}
@Override
public Void visitFloatElement(final FloatElementContext ctx) {
this.frameDefinition.set(ctx.ID().getText(),
new FloatFrameDefinitionField(Float.parseFloat(ctx.FLOAT().getText())));
return null;
}
@Override
public Void visitFlagElement(final FlagElementContext ctx) {
this.frameDefinition.add(ctx.ID().getText());
return null;
}
@Override
public Void visitVector2Element(final Vector2ElementContext ctx) {
this.frameDefinition.set(ctx.ID().getText(),
new Vector2FrameDefinitionField(new Vector2Definition(Float.parseFloat(ctx.FLOAT(0).getText()),
Float.parseFloat(ctx.FLOAT(1).getText()))));
return null;
}
@Override
public Void visitVector3Element(final Vector3ElementContext ctx) {
this.frameDefinition.set(ctx.ID().getText(),
new Vector4FrameDefinitionField(new Vector4Definition(Float.parseFloat(ctx.FLOAT(0).getText()),
Float.parseFloat(ctx.FLOAT(1).getText()), Float.parseFloat(ctx.FLOAT(2).getText()), 1.0f)));
return null;
}
@Override
public Void visitVector4Element(final Vector4ElementContext ctx) {
this.frameDefinition.set(ctx.ID().getText(),
new Vector4FrameDefinitionField(new Vector4Definition(Float.parseFloat(ctx.FLOAT(0).getText()),
Float.parseFloat(ctx.FLOAT(1).getText()), Float.parseFloat(ctx.FLOAT(2).getText()),
Float.parseFloat(ctx.FLOAT(3).getText()))));
return null;
}
@Override
public Void visitVector4CommaElement(final Vector4CommaElementContext ctx) {
this.frameDefinition.set(ctx.ID().getText(),
new Vector4FrameDefinitionField(new Vector4Definition(Float.parseFloat(ctx.FLOAT(0).getText()),
Float.parseFloat(ctx.FLOAT(1).getText()), Float.parseFloat(ctx.FLOAT(2).getText()),
Float.parseFloat(ctx.FLOAT(3).getText()))));
return null;
}
@Override
public Void visitSetPointElement(final SetPointElementContext ctx) {
String other = ctx.STRING_LITERAL().getText();
other = other.substring(1, other.length() - 1);
final SetPointDefinition setPointDefinition = new SetPointDefinition(
FramePoint.valueOf(ctx.frame_point(0).getText()), other,
FramePoint.valueOf(ctx.frame_point(1).getText()), Float.parseFloat(ctx.FLOAT(0).getText()),
Float.parseFloat(ctx.FLOAT(1).getText()));
this.frameDefinition.add(setPointDefinition);
return null;
}
@Override
public Void visitAnchorElement(final AnchorElementContext ctx) {
final AnchorDefinition anchorDefinition = new AnchorDefinition(FramePoint.valueOf(ctx.frame_point().getText()),
Float.parseFloat(ctx.FLOAT(0).getText()), Float.parseFloat(ctx.FLOAT(1).getText()));
this.frameDefinition.add(anchorDefinition);
return null;
}
@Override
public Void visitTextJustifyElement(final TextJustifyElementContext ctx) {
final TextJustify justify = TextJustify.valueOf(ctx.text_justify().getText().substring(JUSTIFY_OFFSET));
this.frameDefinition.set(ctx.ID().getText(), new TextJustifyFrameDefinitionField(justify));
return null;
}
@Override
public Void visitFontElement(final FontElementContext ctx) {
this.frameDefinition.set(ctx.ID().getText(),
new FontFrameDefinitionField(new FontDefinition(ctx.STRING_LITERAL(0).getText(),
Float.parseFloat(ctx.FLOAT().getText()), ctx.STRING_LITERAL(1).getText())));
return null;
}
@Override
public Void visitSimpleFontElement(final SimpleFontElementContext ctx) {
this.frameDefinition.set(ctx.ID().getText(), new FontFrameDefinitionField(
new FontDefinition(ctx.STRING_LITERAL().getText(), Float.parseFloat(ctx.FLOAT().getText()), null)));
return null;
}
@Override
public Void visitFrameFrameElement(final FrameFrameElementContext ctx) {
this.frameDefinition.add(this.frameDefinitionVisitor.visit(ctx));
return null;
}
}

View File

@ -4,18 +4,23 @@ import java.util.List;
import org.antlr.v4.runtime.tree.TerminalNode;
import com.etheller.warsmash.fdfparser.FDFParser.AnonymousCompDefinitionContext;
import com.etheller.warsmash.fdfparser.FDFParser.AnonymousCompSubTypeDefinitionContext;
import com.etheller.warsmash.fdfparser.FDFParser.AnonymousCompSubTypeDefinitionWithChildrenContext;
import com.etheller.warsmash.fdfparser.FDFParser.CompDefinitionContext;
import com.etheller.warsmash.fdfparser.FDFParser.CompSubTypeDefinitionContext;
import com.etheller.warsmash.fdfparser.FDFParser.CompSubTypeDefinitionWithChildrenContext;
import com.etheller.warsmash.fdfparser.FDFParser.FrameDefinitionContext;
import com.etheller.warsmash.fdfparser.FDFParser.FrameSubTypeDefinitionContext;
import com.etheller.warsmash.fdfparser.FDFParser.FrameSubTypeDefinitionWithChildrenContext;
import com.etheller.warsmash.fdfparser.FDFParser.Frame_elementContext;
import com.etheller.warsmash.fdfparser.FDFParser.IncludeStatementContext;
import com.etheller.warsmash.fdfparser.FDFParser.StringListStatementContext;
import com.etheller.warsmash.parsers.fdf.datamodel.FrameDefintion;
import com.etheller.warsmash.parsers.fdf.datamodel.FrameClass;
import com.etheller.warsmash.parsers.fdf.datamodel.FrameDefinition;
import com.etheller.warsmash.parsers.fdf.datamodel.FrameTemplateEnvironment;
public class FrameDefinitionVisitor extends FDFBaseVisitor<FrameDefintion> {
public class FrameDefinitionVisitor extends FDFBaseVisitor<FrameDefinition> {
private final FrameTemplateEnvironment templates;
private final FDFParserBuilder fdfParserBuilder;
@ -25,57 +30,195 @@ public class FrameDefinitionVisitor extends FDFBaseVisitor<FrameDefintion> {
}
@Override
public FrameDefintion visitStringListStatement(final StringListStatementContext ctx) {
public FrameDefinition 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);
value = unquote(value);
this.templates.addDecoratedString(id, value);
}
return null;
}
@Override
public FrameDefintion visitIncludeStatement(final IncludeStatementContext ctx) {
String includeFilePath = ctx.STRING_LITERAL().getText();
includeFilePath = includeFilePath.substring(1, includeFilePath.length() - 1);
public FrameDefinition visitIncludeStatement(final IncludeStatementContext ctx) {
final String includeFilePath = unquote(ctx.STRING_LITERAL().getText());
final FDFParser parser = this.fdfParserBuilder.build(includeFilePath);
visit(parser.program());
return null;
}
@Override
public FrameDefintion visitFrameDefinition(final FrameDefinitionContext ctx) {
return super.visitFrameDefinition(ctx);
private String unquote(String includeFilePath) {
includeFilePath = includeFilePath.substring(1, includeFilePath.length() - 1);
return includeFilePath;
}
@Override
public FrameDefintion visitFrameSubTypeDefinition(final FrameSubTypeDefinitionContext ctx) {
return super.visitFrameSubTypeDefinition(ctx);
public FrameDefinition visitFrameDefinition(final FrameDefinitionContext ctx) {
final String type = unquote(ctx.STRING_LITERAL(0).getText());
final String name = unquote(ctx.STRING_LITERAL(1).getText());
final FrameDefinition frameDefinition = new FrameDefinition(FrameClass.Frame, type, name);
final FrameDefinitionFieldVisitor fieldVisitor = new FrameDefinitionFieldVisitor(frameDefinition, this);
for (final Frame_elementContext element : ctx.frame_element()) {
fieldVisitor.visit(element);
}
this.templates.put(name, frameDefinition);
return frameDefinition;
}
@Override
public FrameDefintion visitFrameSubTypeDefinitionWithChildren(final FrameSubTypeDefinitionWithChildrenContext ctx) {
return super.visitFrameSubTypeDefinitionWithChildren(ctx);
public FrameDefinition visitFrameSubTypeDefinition(final FrameSubTypeDefinitionContext ctx) {
final String type = unquote(ctx.STRING_LITERAL(0).getText());
final String name = unquote(ctx.STRING_LITERAL(1).getText());
final String parent = unquote(ctx.STRING_LITERAL(2).getText());
final FrameDefinition frameDefinition = new FrameDefinition(FrameClass.Frame, type, name);
// INHERITS
final FrameDefinition inheritParent = this.templates.getFrame(parent);
if (inheritParent == null) {
throw new IllegalStateException(
"\"" + name + "\" cannot inherit from \"" + parent + "\" because it does not exist!");
}
frameDefinition.inheritFrom(inheritParent, false);
final FrameDefinitionFieldVisitor fieldVisitor = new FrameDefinitionFieldVisitor(frameDefinition, this);
for (final Frame_elementContext element : ctx.frame_element()) {
fieldVisitor.visit(element);
}
this.templates.put(name, frameDefinition);
return frameDefinition;
}
@Override
public FrameDefintion visitCompDefinition(final CompDefinitionContext ctx) {
// TODO Auto-generated method stub
return super.visitCompDefinition(ctx);
public FrameDefinition visitFrameSubTypeDefinitionWithChildren(
final FrameSubTypeDefinitionWithChildrenContext ctx) {
final String type = unquote(ctx.STRING_LITERAL(0).getText());
final String name = unquote(ctx.STRING_LITERAL(1).getText());
final String parent = unquote(ctx.STRING_LITERAL(2).getText());
final FrameDefinition frameDefinition = new FrameDefinition(FrameClass.Frame, type, name);
// INHERITS
final FrameDefinition inheritParent = this.templates.getFrame(parent);
if (inheritParent == null) {
throw new IllegalStateException(
"\"" + name + "\" cannot inherit from \"" + parent + "\" because it does not exist!");
}
frameDefinition.inheritFrom(inheritParent, true);
final FrameDefinitionFieldVisitor fieldVisitor = new FrameDefinitionFieldVisitor(frameDefinition, this);
for (final Frame_elementContext element : ctx.frame_element()) {
fieldVisitor.visit(element);
}
this.templates.put(name, frameDefinition);
return frameDefinition;
}
@Override
public FrameDefintion visitCompSubTypeDefinition(final CompSubTypeDefinitionContext ctx) {
// TODO Auto-generated method stub
return super.visitCompSubTypeDefinition(ctx);
public FrameDefinition visitAnonymousCompDefinition(final AnonymousCompDefinitionContext ctx) {
final FrameDefinition frameDefinition = new FrameDefinition(
FrameClass.valueOf(ctx.frame_type_qualifier().getText()), null, null);
final FrameDefinitionFieldVisitor fieldVisitor = new FrameDefinitionFieldVisitor(frameDefinition, this);
for (final Frame_elementContext element : ctx.frame_element()) {
fieldVisitor.visit(element);
}
return frameDefinition;
}
@Override
public FrameDefintion visitCompSubTypeDefinitionWithChildren(final CompSubTypeDefinitionWithChildrenContext ctx) {
// TODO Auto-generated method stub
return super.visitCompSubTypeDefinitionWithChildren(ctx);
public FrameDefinition visitAnonymousCompSubTypeDefinition(final AnonymousCompSubTypeDefinitionContext ctx) {
final String parent = unquote(ctx.STRING_LITERAL().getText());
final FrameClass frameClass = FrameClass.valueOf(ctx.frame_type_qualifier().getText());
final FrameDefinition frameDefinition = new FrameDefinition(frameClass, null, null);
// INHERITS
final FrameDefinition inheritParent = this.templates.getFrame(parent);
if (inheritParent == null) {
throw new IllegalStateException(
"" + frameClass + " cannot inherit from \"" + parent + "\" because it does not exist!");
}
frameDefinition.inheritFrom(inheritParent, false);
final FrameDefinitionFieldVisitor fieldVisitor = new FrameDefinitionFieldVisitor(frameDefinition, this);
for (final Frame_elementContext element : ctx.frame_element()) {
fieldVisitor.visit(element);
}
return frameDefinition;
}
@Override
public FrameDefinition visitAnonymousCompSubTypeDefinitionWithChildren(
final AnonymousCompSubTypeDefinitionWithChildrenContext ctx) {
final String parent = unquote(ctx.STRING_LITERAL().getText());
final FrameClass frameClass = FrameClass.valueOf(ctx.frame_type_qualifier().getText());
final FrameDefinition frameDefinition = new FrameDefinition(frameClass, null, null);
// INHERITS
final FrameDefinition inheritParent = this.templates.getFrame(parent);
if (inheritParent == null) {
throw new IllegalStateException(
"" + frameClass + " cannot inherit from \"" + parent + "\" because it does not exist!");
}
frameDefinition.inheritFrom(inheritParent, true);
final FrameDefinitionFieldVisitor fieldVisitor = new FrameDefinitionFieldVisitor(frameDefinition, this);
for (final Frame_elementContext element : ctx.frame_element()) {
fieldVisitor.visit(element);
}
return frameDefinition;
}
@Override
public FrameDefinition visitCompDefinition(final CompDefinitionContext ctx) {
final String name = unquote(ctx.STRING_LITERAL().getText());
final FrameDefinition frameDefinition = new FrameDefinition(
FrameClass.valueOf(ctx.frame_type_qualifier().getText()), null, name);
final FrameDefinitionFieldVisitor fieldVisitor = new FrameDefinitionFieldVisitor(frameDefinition, this);
for (final Frame_elementContext element : ctx.frame_element()) {
fieldVisitor.visit(element);
}
this.templates.put(name, frameDefinition);
return frameDefinition;
}
@Override
public FrameDefinition visitCompSubTypeDefinition(final CompSubTypeDefinitionContext ctx) {
final String name = unquote(ctx.STRING_LITERAL(0).getText());
final String parent = unquote(ctx.STRING_LITERAL(1).getText());
final FrameDefinition frameDefinition = new FrameDefinition(
FrameClass.valueOf(ctx.frame_type_qualifier().getText()), null, name);
// INHERITS
final FrameDefinition inheritParent = this.templates.getFrame(parent);
if (inheritParent == null) {
throw new IllegalStateException(
"\"" + name + "\" cannot inherit from \"" + parent + "\" because it does not exist!");
}
frameDefinition.inheritFrom(inheritParent, false);
final FrameDefinitionFieldVisitor fieldVisitor = new FrameDefinitionFieldVisitor(frameDefinition, this);
for (final Frame_elementContext element : ctx.frame_element()) {
fieldVisitor.visit(element);
}
this.templates.put(name, frameDefinition);
return frameDefinition;
}
@Override
public FrameDefinition visitCompSubTypeDefinitionWithChildren(final CompSubTypeDefinitionWithChildrenContext ctx) {
final String name = unquote(ctx.STRING_LITERAL(0).getText());
final String parent = unquote(ctx.STRING_LITERAL(1).getText());
final FrameDefinition frameDefinition = new FrameDefinition(
FrameClass.valueOf(ctx.frame_type_qualifier().getText()), null, name);
// INHERITS
final FrameDefinition inheritParent = this.templates.getFrame(parent);
if (inheritParent == null) {
throw new IllegalStateException(
"\"" + name + "\" cannot inherit from \"" + parent + "\" because it does not exist!");
}
frameDefinition.inheritFrom(inheritParent, true);
final FrameDefinitionFieldVisitor fieldVisitor = new FrameDefinitionFieldVisitor(frameDefinition, this);
for (final Frame_elementContext element : ctx.frame_element()) {
fieldVisitor.visit(element);
}
this.templates.put(name, frameDefinition);
return frameDefinition;
}
}

View File

@ -4,6 +4,7 @@ import org.antlr.v4.runtime.BaseErrorListener;
import org.antlr.v4.runtime.RecognitionException;
import org.antlr.v4.runtime.Recognizer;
import com.etheller.warsmash.parsers.fdf.datamodel.FrameDefinition;
import com.etheller.warsmash.parsers.fdf.datamodel.FrameTemplateEnvironment;
public class Main {
@ -36,7 +37,8 @@ public class Main {
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"));
final FrameDefinition bnetChat = templates.getFrame("BattleNetTextAreaTemplate");
System.out.println("Value of BattleNetTextAreaTemplate: " + bnetChat);
}
catch (final Exception exc) {
System.err.println(exc.getMessage());

View File

@ -1,28 +0,0 @@
package com.etheller.warsmash.parsers.fdf.datamodel;
public class ColorDefinition {
private final float red, green, blue, alpha;
public ColorDefinition(final float red, final float green, final float blue, final float alpha) {
this.red = red;
this.green = green;
this.blue = blue;
this.alpha = alpha;
}
public float getRed() {
return this.red;
}
public float getGreen() {
return this.green;
}
public float getBlue() {
return this.blue;
}
public float getAlpha() {
return this.alpha;
}
}

View File

@ -0,0 +1,8 @@
package com.etheller.warsmash.parsers.fdf.datamodel;
public enum FrameClass {
Frame,
String,
Texture,
Layer;
}

View File

@ -14,16 +14,23 @@ import com.etheller.warsmash.parsers.fdf.datamodel.fields.FrameDefinitionField;
* everything class might help get a prototype running fast until I have a
* better understanding of how I want these classes designed.
*/
public class FrameDefintion {
private String frameType;
private String name;
private final List<FrameDefintion> innerFrames = new ArrayList<>();
public class FrameDefinition {
private final FrameClass frameClass;
private final String frameType;
private final String name;
private final List<FrameDefinition> innerFrames = new ArrayList<>();
private final Set<String> flags = new HashSet<>();
private final Map<String, FrameDefinitionField> nameToField = new HashMap<>();
private final List<SetPointDefinition> setPoints = new ArrayList<>();
private final List<AnchorDefinition> anchors = new ArrayList<>();
public void inheritFrom(final FrameDefintion other, final boolean withChildren) {
public FrameDefinition(final FrameClass frameClass, final String frameType, final String name) {
this.frameClass = frameClass;
this.frameType = frameType;
this.name = name;
}
public void inheritFrom(final FrameDefinition other, final boolean withChildren) {
this.flags.addAll(other.flags);
this.nameToField.putAll(other.nameToField);
if (withChildren) {
@ -35,6 +42,10 @@ public class FrameDefintion {
this.nameToField.put(fieldName, value);
}
public void add(final FrameDefinition childDefition) {
this.innerFrames.add(childDefition);
}
public void add(final SetPointDefinition setPointDefinition) {
this.setPoints.add(setPointDefinition);
}
@ -42,4 +53,16 @@ public class FrameDefintion {
public void add(final AnchorDefinition anchorDefinition) {
this.anchors.add(anchorDefinition);
}
public void add(final String flag) {
this.flags.add(flag);
}
@Override
public String toString() {
return "FrameDefinition [frameClass=" + this.frameClass + ", frameType=" + this.frameType + ", name="
+ this.name + ", innerFrames=" + this.innerFrames + ", flags=" + this.flags + ", nameToField="
+ this.nameToField + ", setPoints=" + this.setPoints + ", anchors=" + this.anchors + "]";
}
}

View File

@ -5,6 +5,7 @@ import java.util.Map;
public class FrameTemplateEnvironment {
private final Map<String, String> idToDecoratedString = new HashMap<>();
private final Map<String, FrameDefinition> idToFrame = new HashMap<>();
public void addDecoratedString(final String id, final String value) {
this.idToDecoratedString.put(id, value);
@ -17,4 +18,12 @@ public class FrameTemplateEnvironment {
}
return id;
}
public void put(final String id, final FrameDefinition frame) {
this.idToFrame.put(id, frame);
}
public FrameDefinition getFrame(final String id) {
return this.idToFrame.get(id);
}
}

View File

@ -1,41 +0,0 @@
package com.etheller.warsmash.parsers.fdf.datamodel;
public class Insets {
private float top;
private float left;
private float bottom;
private float right;
public float getTop() {
return this.top;
}
public float getLeft() {
return this.left;
}
public float getBottom() {
return this.bottom;
}
public float getRight() {
return this.right;
}
public void setTop(final float top) {
this.top = top;
}
public void setLeft(final float left) {
this.left = left;
}
public void setBottom(final float bottom) {
this.bottom = bottom;
}
public void setRight(final float right) {
this.right = right;
}
}

View File

@ -1,9 +1,14 @@
package com.etheller.warsmash.parsers.fdf.datamodel;
public class Offset {
public class Vector2Definition {
private float x;
private float y;
public Vector2Definition(final float x, final float y) {
this.x = x;
this.y = y;
}
public float getX() {
return this.x;
}

View File

@ -0,0 +1,23 @@
package com.etheller.warsmash.parsers.fdf.datamodel;
public class Vector3Definition {
private final float x, y, z;
public Vector3Definition(final float x, final float y, final float z) {
this.x = x;
this.y = y;
this.z = z;
}
public float getX() {
return this.x;
}
public float getY() {
return this.y;
}
public float getZ() {
return this.z;
}
}

View File

@ -0,0 +1,28 @@
package com.etheller.warsmash.parsers.fdf.datamodel;
public class Vector4Definition {
private final float x, y, z, w;
public Vector4Definition(final float x, final float y, final float z, final float w) {
this.x = x;
this.y = y;
this.z = z;
this.w = w;
}
public float getX() {
return this.x;
}
public float getY() {
return this.y;
}
public float getZ() {
return this.z;
}
public float getW() {
return this.w;
}
}

View File

@ -1,21 +0,0 @@
package com.etheller.warsmash.parsers.fdf.datamodel.fields;
import com.etheller.warsmash.parsers.fdf.datamodel.ColorDefinition;
public class ColorFrameDefinitionField implements FrameDefinitionField {
private final ColorDefinition value;
public ColorFrameDefinitionField(final ColorDefinition value) {
this.value = value;
}
public ColorDefinition getValue() {
return this.value;
}
@Override
public <TYPE> TYPE visit(final FrameDefinitionFieldVisitor<TYPE> visitor) {
return visitor.accept(this);
}
}

View File

@ -15,4 +15,5 @@ public class FloatFrameDefinitionField implements FrameDefinitionField {
public <TYPE> TYPE visit(final FrameDefinitionFieldVisitor<TYPE> visitor) {
return visitor.accept(this);
}
}

View File

@ -3,13 +3,17 @@ package com.etheller.warsmash.parsers.fdf.datamodel.fields;
public interface FrameDefinitionFieldVisitor<TYPE> {
TYPE accept(StringFrameDefinitionField field);
TYPE accept(StringPairFrameDefinitionField field);
TYPE accept(FloatFrameDefinitionField field);
TYPE accept(ColorFrameDefinitionField field);
TYPE accept(Vector3FrameDefinitionField field);
TYPE accept(InsetsFrameDefinitionField field);
TYPE accept(Vector4FrameDefinitionField field);
TYPE accept(OffsetFrameDefinitionField field);
TYPE accept(Vector2FrameDefinitionField field);
TYPE accept(FontFrameDefinitionField field);
TYPE accept(TextJustifyFrameDefinitionField field);
}

View File

@ -1,20 +0,0 @@
package com.etheller.warsmash.parsers.fdf.datamodel.fields;
import com.etheller.warsmash.parsers.fdf.datamodel.Insets;
public class InsetsFrameDefinitionField implements FrameDefinitionField {
private final Insets value;
public InsetsFrameDefinitionField(final Insets value) {
this.value = value;
}
public Insets getValue() {
return this.value;
}
@Override
public <TYPE> TYPE visit(final FrameDefinitionFieldVisitor<TYPE> visitor) {
return visitor.accept(this);
}
}

View File

@ -1,20 +0,0 @@
package com.etheller.warsmash.parsers.fdf.datamodel.fields;
import com.etheller.warsmash.parsers.fdf.datamodel.Offset;
public class OffsetFrameDefinitionField implements FrameDefinitionField {
private final Offset value;
public OffsetFrameDefinitionField(final Offset value) {
this.value = value;
}
public Offset getValue() {
return this.value;
}
@Override
public <TYPE> TYPE visit(final FrameDefinitionFieldVisitor<TYPE> visitor) {
return visitor.accept(this);
}
}

View File

@ -0,0 +1,24 @@
package com.etheller.warsmash.parsers.fdf.datamodel.fields;
public class StringPairFrameDefinitionField implements FrameDefinitionField {
private final String first;
private final String second;
public StringPairFrameDefinitionField(final String first, final String second) {
this.first = first;
this.second = second;
}
public String getFirst() {
return this.first;
}
public String getSecond() {
return this.second;
}
@Override
public <TYPE> TYPE visit(final FrameDefinitionFieldVisitor<TYPE> visitor) {
return visitor.accept(this);
}
}

View File

@ -0,0 +1,21 @@
package com.etheller.warsmash.parsers.fdf.datamodel.fields;
import com.etheller.warsmash.parsers.fdf.datamodel.TextJustify;
public class TextJustifyFrameDefinitionField implements FrameDefinitionField {
private final TextJustify value;
public TextJustifyFrameDefinitionField(final TextJustify value) {
this.value = value;
}
public TextJustify getValue() {
return this.value;
}
@Override
public <TYPE> TYPE visit(final FrameDefinitionFieldVisitor<TYPE> visitor) {
return visitor.accept(this);
}
}

View File

@ -0,0 +1,20 @@
package com.etheller.warsmash.parsers.fdf.datamodel.fields;
import com.etheller.warsmash.parsers.fdf.datamodel.Vector2Definition;
public class Vector2FrameDefinitionField implements FrameDefinitionField {
private final Vector2Definition value;
public Vector2FrameDefinitionField(final Vector2Definition value) {
this.value = value;
}
public Vector2Definition getValue() {
return this.value;
}
@Override
public <TYPE> TYPE visit(final FrameDefinitionFieldVisitor<TYPE> visitor) {
return visitor.accept(this);
}
}

View File

@ -0,0 +1,21 @@
package com.etheller.warsmash.parsers.fdf.datamodel.fields;
import com.etheller.warsmash.parsers.fdf.datamodel.Vector3Definition;
public class Vector3FrameDefinitionField implements FrameDefinitionField {
private final Vector3Definition value;
public Vector3FrameDefinitionField(final Vector3Definition value) {
this.value = value;
}
public Vector3Definition getValue() {
return this.value;
}
@Override
public <TYPE> TYPE visit(final FrameDefinitionFieldVisitor<TYPE> visitor) {
return visitor.accept(this);
}
}

View File

@ -0,0 +1,20 @@
package com.etheller.warsmash.parsers.fdf.datamodel.fields;
import com.etheller.warsmash.parsers.fdf.datamodel.Vector4Definition;
public class Vector4FrameDefinitionField implements FrameDefinitionField {
private final Vector4Definition value;
public Vector4FrameDefinitionField(final Vector4Definition value) {
this.value = value;
}
public Vector4Definition getValue() {
return this.value;
}
@Override
public <TYPE> TYPE visit(final FrameDefinitionFieldVisitor<TYPE> visitor) {
return visitor.accept(this);
}
}