diff --git a/.idea/misc.xml b/.idea/misc.xml index 017964a..dd87222 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,5 +1,21 @@ + + + diff --git a/fx2j-parser/build.gradle.kts b/fx2j-parser/build.gradle.kts index 266bbe0..e26f9fb 100644 --- a/fx2j-parser/build.gradle.kts +++ b/fx2j-parser/build.gradle.kts @@ -1,4 +1,8 @@ plugins { id("io.github.sheikah45.fx2j.conventions-publish") id("io.github.sheikah45.fx2j.conventions-library") +} + +dependencies { + implementation("org.antlr:antlr4:4.13.1") } \ No newline at end of file diff --git a/fx2j-parser/src/main/antlr4/io/github/sheikah45/fx2j/parser/expression/BindExpression.g4 b/fx2j-parser/src/main/antlr4/io/github/sheikah45/fx2j/parser/expression/BindExpression.g4 new file mode 100644 index 0000000..7b069b3 --- /dev/null +++ b/fx2j-parser/src/main/antlr4/io/github/sheikah45/fx2j/parser/expression/BindExpression.g4 @@ -0,0 +1,68 @@ +grammar BindExpression; +@header { +package io.github.sheikah45.fx2j.parser.antlr; +} + +expression + : base=expression '.' property=Identifier # propertyRead + | base=expression '.' method=Identifier + '(' + (args+=expression (',' args+=expression)*)? + ')' # methodCall + | collection=expression '[' accessor=expression ']' # collectionAccess + | '!' base=expression # invert + | '-' base=expression # negate + | left=expression '*' right=expression # multiply + | left=expression '/' right=expression # divide + | left=expression '%' right=expression # remainder + | left=expression '+' right=expression # add + | left=expression '-' right=expression # subtract + | left=expression '>' right=expression # greaterThan + | left=expression '>=' right=expression # greaterThanEqual + | left=expression '<' right=expression # lessThan + | left=expression '<=' right=expression # lessThanEqual + | left=expression '==' right=expression # equality + | left=expression '!=' right=expression # inequality + | left=expression '&&' right=expression # and + | left=expression '||' right=expression # or + | '(' inside=expression ')' # enclosed + | Identifier # variable + | String # stringLiteral + | Decimal # decimalLiteral + | Fractional # fractionalLiteral + | 'null' # nullLiteral + | 'true' # trueLiteral + | 'false' # falseLiteral + ; + +String + : ('"' StringCharacters? '"') + | ('\'' StringCharacters? '\'') + ; + +Decimal + : [0-9]+ + ; + +Fractional + : Decimal '.' Decimal? ExponentPart? + | '.' Decimal ExponentPart? + | Decimal ExponentPart + | Decimal + ; + +Identifier + : [a-zA-Z][a-zA-Z0-9]* + ; + +fragment +StringCharacters + : ~["'\\]+ + ; + +fragment +ExponentPart + : [eE][+-]?Decimal + ; + +Whitespace: [ \n\t\r]+ -> skip; \ No newline at end of file diff --git a/fx2j-parser/src/main/java/io/github/sheikah45/fx2j/parser/FxmlParser.java b/fx2j-parser/src/main/java/io/github/sheikah45/fx2j/parser/FxmlParser.java index 603baee..5a86621 100644 --- a/fx2j-parser/src/main/java/io/github/sheikah45/fx2j/parser/FxmlParser.java +++ b/fx2j-parser/src/main/java/io/github/sheikah45/fx2j/parser/FxmlParser.java @@ -1,10 +1,14 @@ package io.github.sheikah45.fx2j.parser; +import io.github.sheikah45.fx2j.parser.antlr.BindExpressionLexer; +import io.github.sheikah45.fx2j.parser.antlr.BindExpressionParser; +import io.github.sheikah45.fx2j.parser.antlr.BindExpressionVisitorImpl; import io.github.sheikah45.fx2j.parser.attribute.ControllerAttribute; import io.github.sheikah45.fx2j.parser.attribute.EventHandlerAttribute; import io.github.sheikah45.fx2j.parser.attribute.FxmlAttribute; import io.github.sheikah45.fx2j.parser.attribute.IdAttribute; import io.github.sheikah45.fx2j.parser.attribute.InstancePropertyAttribute; +import io.github.sheikah45.fx2j.parser.attribute.NameSpaceAttribute; import io.github.sheikah45.fx2j.parser.attribute.StaticPropertyAttribute; import io.github.sheikah45.fx2j.parser.element.ClassInstanceElement; import io.github.sheikah45.fx2j.parser.element.ConstantElement; @@ -24,6 +28,9 @@ import io.github.sheikah45.fx2j.parser.element.ValueElement; import io.github.sheikah45.fx2j.parser.property.Value; import io.github.sheikah45.fx2j.parser.utils.StringUtils; +import org.antlr.v4.runtime.CharStreams; +import org.antlr.v4.runtime.CodePointCharStream; +import org.antlr.v4.runtime.CommonTokenStream; import org.w3c.dom.Attr; import org.w3c.dom.Document; import org.w3c.dom.Element; @@ -35,6 +42,7 @@ import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; +import java.net.URI; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.nio.file.Path; @@ -96,11 +104,11 @@ private static Value createPropertyValue(Element element) { } return commonAttribute; - }).map(Value.Attribute::new).forEach(values::add); + }).map(io.github.sheikah45.fx2j.parser.property.Value.Attribute::new).forEach(values::add); createChildren(element) .stream() - .map(Value.Element::new) + .map(io.github.sheikah45.fx2j.parser.property.Value.Element::new) .forEach(values::add); Value.Single innerValue = createPropertyValue(retrieveInnerText(element)); @@ -126,7 +134,6 @@ private static List createAttributes(Element element) { .mapToObj(attributesNodeMap::item) .filter(Attr.class::isInstance) .map(Attr.class::cast) - .filter(attr -> !attr.getNodeName().startsWith("xmlns")) .map(FxmlParser::createFxmlAttribute) .toList(); } @@ -239,10 +246,32 @@ private static IncludeElement createIncludeElement(Element element) { return new IncludeElement(source, resources, charset, createContent(element)); } + private static Value.Single createPropertyValue(String value) { + return switch (value) { + case String val when val.startsWith("@") -> new Value.Location(Path.of(val.substring(1))); + case String val when val.startsWith("%") -> new Value.Resource(val.substring(1)); + case String val when val.matches("\\$\\{.*}") -> createExpressionValue(val); + case String val when val.startsWith("$") -> new Value.Reference(val.substring(1)); + case String val when val.startsWith("\\") -> new Value.Literal(val.substring(1)); + case String val when val.isBlank() -> new Value.Empty(); + case String val -> new Value.Literal(val); + }; + } + + private static Value.Expression createExpressionValue(String val) { + CodePointCharStream charStream = CharStreams.fromString(val.substring(2, val.length() - 1)); + BindExpressionLexer expressionLexer = new BindExpressionLexer(charStream); + CommonTokenStream commonTokenStream = new CommonTokenStream(expressionLexer); + BindExpressionParser expressionParser = new BindExpressionParser(commonTokenStream); + return expressionParser.expression().accept(new BindExpressionVisitorImpl()); + } + private static FxmlAttribute createFxmlAttribute(Attr attr) { return switch (attr.getName()) { case "fx:id" -> new IdAttribute(attr.getValue()); case "fx:controller" -> new ControllerAttribute(attr.getValue()); + case String name when name.startsWith("xmlns:") -> + new NameSpaceAttribute(name.substring(6), URI.create(attr.getValue())); case String name when name.startsWith("on") -> new EventHandlerAttribute(name, createEventHandler(attr.getValue())); case String name when name.matches("(\\w*\\.)*[A-Z]\\w*\\.[a-z]\\w*") -> { @@ -254,18 +283,6 @@ yield new StaticPropertyAttribute(name.substring(0, separatorIndex), name.substr }; } - private static Value.Single createPropertyValue(String value) { - return switch (value) { - case String val when val.startsWith("@") -> new Value.Location(Path.of(val.substring(1))); - case String val when val.startsWith("%") -> new Value.Resource(val.substring(1)); - case String val when val.matches("\\$\\{.*}") -> new Value.Expression(val.substring(2, val.length() - 1)); - case String val when val.startsWith("$") -> new Value.Reference(val.substring(1)); - case String val when val.startsWith("\\") -> new Value.Literal(val.substring(1)); - case String val when val.isBlank() -> new Value.Empty(); - case String val -> new Value.Literal(val); - }; - } - private static Value.Handler createEventHandler(String value) { return switch (value) { case String val when val.startsWith("#") -> new Value.Method(val.substring(1)); diff --git a/fx2j-parser/src/main/java/io/github/sheikah45/fx2j/parser/antlr/BindExpressionLexer.java b/fx2j-parser/src/main/java/io/github/sheikah45/fx2j/parser/antlr/BindExpressionLexer.java new file mode 100644 index 0000000..c83c2e2 --- /dev/null +++ b/fx2j-parser/src/main/java/io/github/sheikah45/fx2j/parser/antlr/BindExpressionLexer.java @@ -0,0 +1,241 @@ +// Generated from C:/Users/corey/FAFProjects/fx2j/fx2j-parser/src/main/antlr4/io/github/sheikah45/fx2j/parser/expression/BindExpression.g4 by ANTLR 4.13.1 + +package io.github.sheikah45.fx2j.parser.antlr; + +import org.antlr.v4.runtime.Lexer; +import org.antlr.v4.runtime.CharStream; +import org.antlr.v4.runtime.*; +import org.antlr.v4.runtime.atn.*; +import org.antlr.v4.runtime.dfa.DFA; + +@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast", "CheckReturnValue", "this-escape"}) +public class BindExpressionLexer extends Lexer { + public static final int + T__0 = 1, T__1 = 2, T__2 = 3, T__3 = 4, T__4 = 5, T__5 = 6, T__6 = 7, T__7 = 8, T__8 = 9, + T__9 = 10, T__10 = 11, T__11 = 12, T__12 = 13, T__13 = 14, T__14 = 15, T__15 = 16, T__16 = 17, + T__17 = 18, T__18 = 19, T__19 = 20, T__20 = 21, T__21 = 22, T__22 = 23, String = 24, + Decimal = 25, Fractional = 26, Identifier = 27, Whitespace = 28; + public static final String[] ruleNames = makeRuleNames(); + /** + * @deprecated Use {@link #VOCABULARY} instead. + */ + @Deprecated + public static final String[] tokenNames; + public static final String _serializedATN = + "\u0004\u0000\u001c\u00b8\u0006\uffff\uffff\u0002\u0000\u0007\u0000\u0002" + + "\u0001\u0007\u0001\u0002\u0002\u0007\u0002\u0002\u0003\u0007\u0003\u0002" + + "\u0004\u0007\u0004\u0002\u0005\u0007\u0005\u0002\u0006\u0007\u0006\u0002" + + "\u0007\u0007\u0007\u0002\b\u0007\b\u0002\t\u0007\t\u0002\n\u0007\n\u0002" + + "\u000b\u0007\u000b\u0002\f\u0007\f\u0002\r\u0007\r\u0002\u000e\u0007\u000e" + + "\u0002\u000f\u0007\u000f\u0002\u0010\u0007\u0010\u0002\u0011\u0007\u0011" + + "\u0002\u0012\u0007\u0012\u0002\u0013\u0007\u0013\u0002\u0014\u0007\u0014" + + "\u0002\u0015\u0007\u0015\u0002\u0016\u0007\u0016\u0002\u0017\u0007\u0017" + + "\u0002\u0018\u0007\u0018\u0002\u0019\u0007\u0019\u0002\u001a\u0007\u001a" + + "\u0002\u001b\u0007\u001b\u0002\u001c\u0007\u001c\u0002\u001d\u0007\u001d" + + "\u0001\u0000\u0001\u0000\u0001\u0001\u0001\u0001\u0001\u0002\u0001\u0002" + + "\u0001\u0003\u0001\u0003\u0001\u0004\u0001\u0004\u0001\u0005\u0001\u0005" + + "\u0001\u0006\u0001\u0006\u0001\u0007\u0001\u0007\u0001\b\u0001\b\u0001" + + "\t\u0001\t\u0001\n\u0001\n\u0001\u000b\u0001\u000b\u0001\f\u0001\f\u0001" + + "\r\u0001\r\u0001\r\u0001\u000e\u0001\u000e\u0001\u000f\u0001\u000f\u0001" + + "\u000f\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0011\u0001\u0011\u0001" + + "\u0011\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0013\u0001\u0013\u0001" + + "\u0013\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001" + + "\u0015\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0016\u0001" + + "\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0017\u0001" + + "\u0017\u0003\u0017~\b\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0003" + + "\u0017\u0083\b\u0017\u0001\u0017\u0003\u0017\u0086\b\u0017\u0001\u0018" + + "\u0004\u0018\u0089\b\u0018\u000b\u0018\f\u0018\u008a\u0001\u0019\u0001" + + "\u0019\u0001\u0019\u0003\u0019\u0090\b\u0019\u0001\u0019\u0003\u0019\u0093" + + "\b\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0003\u0019\u0098\b\u0019" + + "\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0003\u0019\u009e\b\u0019" + + "\u0001\u001a\u0001\u001a\u0005\u001a\u00a2\b\u001a\n\u001a\f\u001a\u00a5" + + "\t\u001a\u0001\u001b\u0004\u001b\u00a8\b\u001b\u000b\u001b\f\u001b\u00a9" + + "\u0001\u001c\u0001\u001c\u0003\u001c\u00ae\b\u001c\u0001\u001c\u0001\u001c" + + "\u0001\u001d\u0004\u001d\u00b3\b\u001d\u000b\u001d\f\u001d\u00b4\u0001" + + "\u001d\u0001\u001d\u0000\u0000\u001e\u0001\u0001\u0003\u0002\u0005\u0003" + + "\u0007\u0004\t\u0005\u000b\u0006\r\u0007\u000f\b\u0011\t\u0013\n\u0015" + + "\u000b\u0017\f\u0019\r\u001b\u000e\u001d\u000f\u001f\u0010!\u0011#\u0012" + + "%\u0013\'\u0014)\u0015+\u0016-\u0017/\u00181\u00193\u001a5\u001b7\u0000" + + "9\u0000;\u001c\u0001\u0000\u0007\u0001\u000009\u0002\u0000AZaz\u0003\u0000" + + "09AZaz\u0003\u0000\"\"\'\'\\\\\u0002\u0000EEee\u0002\u0000++--\u0003\u0000" + + "\t\n\r\r \u00c3\u0000\u0001\u0001\u0000\u0000\u0000\u0000\u0003\u0001" + + "\u0000\u0000\u0000\u0000\u0005\u0001\u0000\u0000\u0000\u0000\u0007\u0001" + + "\u0000\u0000\u0000\u0000\t\u0001\u0000\u0000\u0000\u0000\u000b\u0001\u0000" + + "\u0000\u0000\u0000\r\u0001\u0000\u0000\u0000\u0000\u000f\u0001\u0000\u0000" + + "\u0000\u0000\u0011\u0001\u0000\u0000\u0000\u0000\u0013\u0001\u0000\u0000" + + "\u0000\u0000\u0015\u0001\u0000\u0000\u0000\u0000\u0017\u0001\u0000\u0000" + + "\u0000\u0000\u0019\u0001\u0000\u0000\u0000\u0000\u001b\u0001\u0000\u0000" + + "\u0000\u0000\u001d\u0001\u0000\u0000\u0000\u0000\u001f\u0001\u0000\u0000" + + "\u0000\u0000!\u0001\u0000\u0000\u0000\u0000#\u0001\u0000\u0000\u0000\u0000" + + "%\u0001\u0000\u0000\u0000\u0000\'\u0001\u0000\u0000\u0000\u0000)\u0001" + + "\u0000\u0000\u0000\u0000+\u0001\u0000\u0000\u0000\u0000-\u0001\u0000\u0000" + + "\u0000\u0000/\u0001\u0000\u0000\u0000\u00001\u0001\u0000\u0000\u0000\u0000" + + "3\u0001\u0000\u0000\u0000\u00005\u0001\u0000\u0000\u0000\u0000;\u0001" + + "\u0000\u0000\u0000\u0001=\u0001\u0000\u0000\u0000\u0003?\u0001\u0000\u0000" + + "\u0000\u0005A\u0001\u0000\u0000\u0000\u0007C\u0001\u0000\u0000\u0000\t" + + "E\u0001\u0000\u0000\u0000\u000bG\u0001\u0000\u0000\u0000\rI\u0001\u0000" + + "\u0000\u0000\u000fK\u0001\u0000\u0000\u0000\u0011M\u0001\u0000\u0000\u0000" + + "\u0013O\u0001\u0000\u0000\u0000\u0015Q\u0001\u0000\u0000\u0000\u0017S" + + "\u0001\u0000\u0000\u0000\u0019U\u0001\u0000\u0000\u0000\u001bW\u0001\u0000" + + "\u0000\u0000\u001dZ\u0001\u0000\u0000\u0000\u001f\\\u0001\u0000\u0000" + + "\u0000!_\u0001\u0000\u0000\u0000#b\u0001\u0000\u0000\u0000%e\u0001\u0000" + + "\u0000\u0000\'h\u0001\u0000\u0000\u0000)k\u0001\u0000\u0000\u0000+p\u0001" + + "\u0000\u0000\u0000-u\u0001\u0000\u0000\u0000/\u0085\u0001\u0000\u0000" + + "\u00001\u0088\u0001\u0000\u0000\u00003\u009d\u0001\u0000\u0000\u00005" + + "\u009f\u0001\u0000\u0000\u00007\u00a7\u0001\u0000\u0000\u00009\u00ab\u0001" + + "\u0000\u0000\u0000;\u00b2\u0001\u0000\u0000\u0000=>\u0005.\u0000\u0000" + + ">\u0002\u0001\u0000\u0000\u0000?@\u0005(\u0000\u0000@\u0004\u0001\u0000" + + "\u0000\u0000AB\u0005,\u0000\u0000B\u0006\u0001\u0000\u0000\u0000CD\u0005" + + ")\u0000\u0000D\b\u0001\u0000\u0000\u0000EF\u0005[\u0000\u0000F\n\u0001" + + "\u0000\u0000\u0000GH\u0005]\u0000\u0000H\f\u0001\u0000\u0000\u0000IJ\u0005" + + "!\u0000\u0000J\u000e\u0001\u0000\u0000\u0000KL\u0005-\u0000\u0000L\u0010" + + "\u0001\u0000\u0000\u0000MN\u0005*\u0000\u0000N\u0012\u0001\u0000\u0000" + + "\u0000OP\u0005/\u0000\u0000P\u0014\u0001\u0000\u0000\u0000QR\u0005%\u0000" + + "\u0000R\u0016\u0001\u0000\u0000\u0000ST\u0005+\u0000\u0000T\u0018\u0001" + + "\u0000\u0000\u0000UV\u0005>\u0000\u0000V\u001a\u0001\u0000\u0000\u0000" + + "WX\u0005>\u0000\u0000XY\u0005=\u0000\u0000Y\u001c\u0001\u0000\u0000\u0000" + + "Z[\u0005<\u0000\u0000[\u001e\u0001\u0000\u0000\u0000\\]\u0005<\u0000\u0000" + + "]^\u0005=\u0000\u0000^ \u0001\u0000\u0000\u0000_`\u0005=\u0000\u0000`" + + "a\u0005=\u0000\u0000a\"\u0001\u0000\u0000\u0000bc\u0005!\u0000\u0000c" + + "d\u0005=\u0000\u0000d$\u0001\u0000\u0000\u0000ef\u0005&\u0000\u0000fg" + + "\u0005&\u0000\u0000g&\u0001\u0000\u0000\u0000hi\u0005|\u0000\u0000ij\u0005" + + "|\u0000\u0000j(\u0001\u0000\u0000\u0000kl\u0005n\u0000\u0000lm\u0005u" + + "\u0000\u0000mn\u0005l\u0000\u0000no\u0005l\u0000\u0000o*\u0001\u0000\u0000" + + "\u0000pq\u0005t\u0000\u0000qr\u0005r\u0000\u0000rs\u0005u\u0000\u0000" + + "st\u0005e\u0000\u0000t,\u0001\u0000\u0000\u0000uv\u0005f\u0000\u0000v" + + "w\u0005a\u0000\u0000wx\u0005l\u0000\u0000xy\u0005s\u0000\u0000yz\u0005" + + "e\u0000\u0000z.\u0001\u0000\u0000\u0000{}\u0005\"\u0000\u0000|~\u0003" + + "7\u001b\u0000}|\u0001\u0000\u0000\u0000}~\u0001\u0000\u0000\u0000~\u007f" + + "\u0001\u0000\u0000\u0000\u007f\u0086\u0005\"\u0000\u0000\u0080\u0082\u0005" + + "\'\u0000\u0000\u0081\u0083\u00037\u001b\u0000\u0082\u0081\u0001\u0000" + + "\u0000\u0000\u0082\u0083\u0001\u0000\u0000\u0000\u0083\u0084\u0001\u0000" + + "\u0000\u0000\u0084\u0086\u0005\'\u0000\u0000\u0085{\u0001\u0000\u0000" + + "\u0000\u0085\u0080\u0001\u0000\u0000\u0000\u00860\u0001\u0000\u0000\u0000" + + "\u0087\u0089\u0007\u0000\u0000\u0000\u0088\u0087\u0001\u0000\u0000\u0000" + + "\u0089\u008a\u0001\u0000\u0000\u0000\u008a\u0088\u0001\u0000\u0000\u0000" + + "\u008a\u008b\u0001\u0000\u0000\u0000\u008b2\u0001\u0000\u0000\u0000\u008c" + + "\u008d\u00031\u0018\u0000\u008d\u008f\u0005.\u0000\u0000\u008e\u0090\u0003" + + "1\u0018\u0000\u008f\u008e\u0001\u0000\u0000\u0000\u008f\u0090\u0001\u0000" + + "\u0000\u0000\u0090\u0092\u0001\u0000\u0000\u0000\u0091\u0093\u00039\u001c" + + "\u0000\u0092\u0091\u0001\u0000\u0000\u0000\u0092\u0093\u0001\u0000\u0000" + + "\u0000\u0093\u009e\u0001\u0000\u0000\u0000\u0094\u0095\u0005.\u0000\u0000" + + "\u0095\u0097\u00031\u0018\u0000\u0096\u0098\u00039\u001c\u0000\u0097\u0096" + + "\u0001\u0000\u0000\u0000\u0097\u0098\u0001\u0000\u0000\u0000\u0098\u009e" + + "\u0001\u0000\u0000\u0000\u0099\u009a\u00031\u0018\u0000\u009a\u009b\u0003" + + "9\u001c\u0000\u009b\u009e\u0001\u0000\u0000\u0000\u009c\u009e\u00031\u0018" + + "\u0000\u009d\u008c\u0001\u0000\u0000\u0000\u009d\u0094\u0001\u0000\u0000" + + "\u0000\u009d\u0099\u0001\u0000\u0000\u0000\u009d\u009c\u0001\u0000\u0000" + + "\u0000\u009e4\u0001\u0000\u0000\u0000\u009f\u00a3\u0007\u0001\u0000\u0000" + + "\u00a0\u00a2\u0007\u0002\u0000\u0000\u00a1\u00a0\u0001\u0000\u0000\u0000" + + "\u00a2\u00a5\u0001\u0000\u0000\u0000\u00a3\u00a1\u0001\u0000\u0000\u0000" + + "\u00a3\u00a4\u0001\u0000\u0000\u0000\u00a46\u0001\u0000\u0000\u0000\u00a5" + + "\u00a3\u0001\u0000\u0000\u0000\u00a6\u00a8\b\u0003\u0000\u0000\u00a7\u00a6" + + "\u0001\u0000\u0000\u0000\u00a8\u00a9\u0001\u0000\u0000\u0000\u00a9\u00a7" + + "\u0001\u0000\u0000\u0000\u00a9\u00aa\u0001\u0000\u0000\u0000\u00aa8\u0001" + + "\u0000\u0000\u0000\u00ab\u00ad\u0007\u0004\u0000\u0000\u00ac\u00ae\u0007" + + "\u0005\u0000\u0000\u00ad\u00ac\u0001\u0000\u0000\u0000\u00ad\u00ae\u0001" + + "\u0000\u0000\u0000\u00ae\u00af\u0001\u0000\u0000\u0000\u00af\u00b0\u0003" + + "1\u0018\u0000\u00b0:\u0001\u0000\u0000\u0000\u00b1\u00b3\u0007\u0006\u0000" + + "\u0000\u00b2\u00b1\u0001\u0000\u0000\u0000\u00b3\u00b4\u0001\u0000\u0000" + + "\u0000\u00b4\u00b2\u0001\u0000\u0000\u0000\u00b4\u00b5\u0001\u0000\u0000" + + "\u0000\u00b5\u00b6\u0001\u0000\u0000\u0000\u00b6\u00b7\u0006\u001d\u0000" + + "\u0000\u00b7<\u0001\u0000\u0000\u0000\r\u0000}\u0082\u0085\u008a\u008f" + + "\u0092\u0097\u009d\u00a3\u00a9\u00ad\u00b4\u0001\u0006\u0000\u0000"; + public static final ATN _ATN = + new ATNDeserializer().deserialize(_serializedATN.toCharArray()); + protected static final DFA[] _decisionToDFA; + protected static final PredictionContextCache _sharedContextCache = + new PredictionContextCache(); + private static final String[] _LITERAL_NAMES = makeLiteralNames(); + private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames(); + public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES); + public static String[] channelNames = { + "DEFAULT_TOKEN_CHANNEL", "HIDDEN" + }; + public static String[] modeNames = { + "DEFAULT_MODE" + }; + + static {RuntimeMetaData.checkVersion("4.13.1", RuntimeMetaData.VERSION);} + + static { + tokenNames = new String[_SYMBOLIC_NAMES.length]; + for (int i = 0; i < tokenNames.length; i++) { + tokenNames[i] = VOCABULARY.getLiteralName(i); + if (tokenNames[i] == null) { + tokenNames[i] = VOCABULARY.getSymbolicName(i); + } + + if (tokenNames[i] == null) { + tokenNames[i] = ""; + } + } + } + + static { + _decisionToDFA = new DFA[_ATN.getNumberOfDecisions()]; + for (int i = 0; i < _ATN.getNumberOfDecisions(); i++) { + _decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i); + } + } + + public BindExpressionLexer(CharStream input) { + super(input); + _interp = new LexerATNSimulator(this, _ATN, _decisionToDFA, _sharedContextCache); + } + + private static String[] makeRuleNames() { + return new String[]{ + "T__0", "T__1", "T__2", "T__3", "T__4", "T__5", "T__6", "T__7", "T__8", + "T__9", "T__10", "T__11", "T__12", "T__13", "T__14", "T__15", "T__16", + "T__17", "T__18", "T__19", "T__20", "T__21", "T__22", "String", "Decimal", + "Fractional", "Identifier", "StringCharacters", "ExponentPart", "Whitespace" + }; + } + + private static String[] makeLiteralNames() { + return new String[]{ + null, "'.'", "'('", "','", "')'", "'['", "']'", "'!'", "'-'", "'*'", + "'/'", "'%'", "'+'", "'>'", "'>='", "'<'", "'<='", "'=='", "'!='", "'&&'", + "'||'", "'null'", "'true'", "'false'" + }; + } + + private static String[] makeSymbolicNames() { + return new String[]{ + null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, + "String", "Decimal", "Fractional", "Identifier", "Whitespace" + }; + } + + @Override + public String[] getRuleNames() {return ruleNames;} + + @Override + + public Vocabulary getVocabulary() { + return VOCABULARY; + } + + @Override + public String getSerializedATN() {return _serializedATN;} + + @Override + public String getGrammarFileName() {return "BindExpression.g4";} + + @Override + public ATN getATN() {return _ATN;} + + @Override + public String[] getChannelNames() {return channelNames;} + + @Override + public String[] getModeNames() {return modeNames;} + + @Override + @Deprecated + public String[] getTokenNames() { + return tokenNames; + } +} \ No newline at end of file diff --git a/fx2j-parser/src/main/java/io/github/sheikah45/fx2j/parser/antlr/BindExpressionListener.java b/fx2j-parser/src/main/java/io/github/sheikah45/fx2j/parser/antlr/BindExpressionListener.java new file mode 100644 index 0000000..ec74646 --- /dev/null +++ b/fx2j-parser/src/main/java/io/github/sheikah45/fx2j/parser/antlr/BindExpressionListener.java @@ -0,0 +1,427 @@ +// Generated from C:/Users/corey/FAFProjects/fx2j/fx2j-parser/src/main/antlr4/io/github/sheikah45/fx2j/parser/expression/BindExpression.g4 by ANTLR 4.13.1 + +package io.github.sheikah45.fx2j.parser.antlr; + +import org.antlr.v4.runtime.tree.ParseTreeListener; + +/** + * This interface defines a complete listener for a parse tree produced by + * {@link BindExpressionParser}. + */ +public interface BindExpressionListener extends ParseTreeListener { + /** + * Enter a parse tree produced by the {@code decimalLiteral} + * labeled alternative in {@link BindExpressionParser#expression}. + * + * @param ctx the parse tree + */ + void enterDecimalLiteral(BindExpressionParser.DecimalLiteralContext ctx); + + /** + * Exit a parse tree produced by the {@code decimalLiteral} + * labeled alternative in {@link BindExpressionParser#expression}. + * + * @param ctx the parse tree + */ + void exitDecimalLiteral(BindExpressionParser.DecimalLiteralContext ctx); + + /** + * Enter a parse tree produced by the {@code lessThanEqual} + * labeled alternative in {@link BindExpressionParser#expression}. + * + * @param ctx the parse tree + */ + void enterLessThanEqual(BindExpressionParser.LessThanEqualContext ctx); + + /** + * Exit a parse tree produced by the {@code lessThanEqual} + * labeled alternative in {@link BindExpressionParser#expression}. + * + * @param ctx the parse tree + */ + void exitLessThanEqual(BindExpressionParser.LessThanEqualContext ctx); + + /** + * Enter a parse tree produced by the {@code collectionAccess} + * labeled alternative in {@link BindExpressionParser#expression}. + * + * @param ctx the parse tree + */ + void enterCollectionAccess(BindExpressionParser.CollectionAccessContext ctx); + + /** + * Exit a parse tree produced by the {@code collectionAccess} + * labeled alternative in {@link BindExpressionParser#expression}. + * + * @param ctx the parse tree + */ + void exitCollectionAccess(BindExpressionParser.CollectionAccessContext ctx); + + /** + * Enter a parse tree produced by the {@code fractionalLiteral} + * labeled alternative in {@link BindExpressionParser#expression}. + * + * @param ctx the parse tree + */ + void enterFractionalLiteral(BindExpressionParser.FractionalLiteralContext ctx); + + /** + * Exit a parse tree produced by the {@code fractionalLiteral} + * labeled alternative in {@link BindExpressionParser#expression}. + * + * @param ctx the parse tree + */ + void exitFractionalLiteral(BindExpressionParser.FractionalLiteralContext ctx); + + /** + * Enter a parse tree produced by the {@code trueLiteral} + * labeled alternative in {@link BindExpressionParser#expression}. + * + * @param ctx the parse tree + */ + void enterTrueLiteral(BindExpressionParser.TrueLiteralContext ctx); + + /** + * Exit a parse tree produced by the {@code trueLiteral} + * labeled alternative in {@link BindExpressionParser#expression}. + * + * @param ctx the parse tree + */ + void exitTrueLiteral(BindExpressionParser.TrueLiteralContext ctx); + + /** + * Enter a parse tree produced by the {@code enclosed} + * labeled alternative in {@link BindExpressionParser#expression}. + * + * @param ctx the parse tree + */ + void enterEnclosed(BindExpressionParser.EnclosedContext ctx); + + /** + * Exit a parse tree produced by the {@code enclosed} + * labeled alternative in {@link BindExpressionParser#expression}. + * + * @param ctx the parse tree + */ + void exitEnclosed(BindExpressionParser.EnclosedContext ctx); + + /** + * Enter a parse tree produced by the {@code falseLiteral} + * labeled alternative in {@link BindExpressionParser#expression}. + * + * @param ctx the parse tree + */ + void enterFalseLiteral(BindExpressionParser.FalseLiteralContext ctx); + + /** + * Exit a parse tree produced by the {@code falseLiteral} + * labeled alternative in {@link BindExpressionParser#expression}. + * + * @param ctx the parse tree + */ + void exitFalseLiteral(BindExpressionParser.FalseLiteralContext ctx); + + /** + * Enter a parse tree produced by the {@code and} + * labeled alternative in {@link BindExpressionParser#expression}. + * + * @param ctx the parse tree + */ + void enterAnd(BindExpressionParser.AndContext ctx); + + /** + * Exit a parse tree produced by the {@code and} + * labeled alternative in {@link BindExpressionParser#expression}. + * + * @param ctx the parse tree + */ + void exitAnd(BindExpressionParser.AndContext ctx); + + /** + * Enter a parse tree produced by the {@code lessThan} + * labeled alternative in {@link BindExpressionParser#expression}. + * + * @param ctx the parse tree + */ + void enterLessThan(BindExpressionParser.LessThanContext ctx); + + /** + * Exit a parse tree produced by the {@code lessThan} + * labeled alternative in {@link BindExpressionParser#expression}. + * + * @param ctx the parse tree + */ + void exitLessThan(BindExpressionParser.LessThanContext ctx); + + /** + * Enter a parse tree produced by the {@code divide} + * labeled alternative in {@link BindExpressionParser#expression}. + * + * @param ctx the parse tree + */ + void enterDivide(BindExpressionParser.DivideContext ctx); + + /** + * Exit a parse tree produced by the {@code divide} + * labeled alternative in {@link BindExpressionParser#expression}. + * + * @param ctx the parse tree + */ + void exitDivide(BindExpressionParser.DivideContext ctx); + + /** + * Enter a parse tree produced by the {@code multiply} + * labeled alternative in {@link BindExpressionParser#expression}. + * + * @param ctx the parse tree + */ + void enterMultiply(BindExpressionParser.MultiplyContext ctx); + + /** + * Exit a parse tree produced by the {@code multiply} + * labeled alternative in {@link BindExpressionParser#expression}. + * + * @param ctx the parse tree + */ + void exitMultiply(BindExpressionParser.MultiplyContext ctx); + + /** + * Enter a parse tree produced by the {@code equality} + * labeled alternative in {@link BindExpressionParser#expression}. + * + * @param ctx the parse tree + */ + void enterEquality(BindExpressionParser.EqualityContext ctx); + + /** + * Exit a parse tree produced by the {@code equality} + * labeled alternative in {@link BindExpressionParser#expression}. + * + * @param ctx the parse tree + */ + void exitEquality(BindExpressionParser.EqualityContext ctx); + + /** + * Enter a parse tree produced by the {@code greaterThan} + * labeled alternative in {@link BindExpressionParser#expression}. + * + * @param ctx the parse tree + */ + void enterGreaterThan(BindExpressionParser.GreaterThanContext ctx); + + /** + * Exit a parse tree produced by the {@code greaterThan} + * labeled alternative in {@link BindExpressionParser#expression}. + * + * @param ctx the parse tree + */ + void exitGreaterThan(BindExpressionParser.GreaterThanContext ctx); + + /** + * Enter a parse tree produced by the {@code add} + * labeled alternative in {@link BindExpressionParser#expression}. + * + * @param ctx the parse tree + */ + void enterAdd(BindExpressionParser.AddContext ctx); + + /** + * Exit a parse tree produced by the {@code add} + * labeled alternative in {@link BindExpressionParser#expression}. + * + * @param ctx the parse tree + */ + void exitAdd(BindExpressionParser.AddContext ctx); + + /** + * Enter a parse tree produced by the {@code greaterThanEqual} + * labeled alternative in {@link BindExpressionParser#expression}. + * + * @param ctx the parse tree + */ + void enterGreaterThanEqual(BindExpressionParser.GreaterThanEqualContext ctx); + + /** + * Exit a parse tree produced by the {@code greaterThanEqual} + * labeled alternative in {@link BindExpressionParser#expression}. + * + * @param ctx the parse tree + */ + void exitGreaterThanEqual(BindExpressionParser.GreaterThanEqualContext ctx); + + /** + * Enter a parse tree produced by the {@code nullLiteral} + * labeled alternative in {@link BindExpressionParser#expression}. + * + * @param ctx the parse tree + */ + void enterNullLiteral(BindExpressionParser.NullLiteralContext ctx); + + /** + * Exit a parse tree produced by the {@code nullLiteral} + * labeled alternative in {@link BindExpressionParser#expression}. + * + * @param ctx the parse tree + */ + void exitNullLiteral(BindExpressionParser.NullLiteralContext ctx); + + /** + * Enter a parse tree produced by the {@code or} + * labeled alternative in {@link BindExpressionParser#expression}. + * + * @param ctx the parse tree + */ + void enterOr(BindExpressionParser.OrContext ctx); + + /** + * Exit a parse tree produced by the {@code or} + * labeled alternative in {@link BindExpressionParser#expression}. + * + * @param ctx the parse tree + */ + void exitOr(BindExpressionParser.OrContext ctx); + + /** + * Enter a parse tree produced by the {@code invert} + * labeled alternative in {@link BindExpressionParser#expression}. + * + * @param ctx the parse tree + */ + void enterInvert(BindExpressionParser.InvertContext ctx); + + /** + * Exit a parse tree produced by the {@code invert} + * labeled alternative in {@link BindExpressionParser#expression}. + * + * @param ctx the parse tree + */ + void exitInvert(BindExpressionParser.InvertContext ctx); + + /** + * Enter a parse tree produced by the {@code subtract} + * labeled alternative in {@link BindExpressionParser#expression}. + * + * @param ctx the parse tree + */ + void enterSubtract(BindExpressionParser.SubtractContext ctx); + + /** + * Exit a parse tree produced by the {@code subtract} + * labeled alternative in {@link BindExpressionParser#expression}. + * + * @param ctx the parse tree + */ + void exitSubtract(BindExpressionParser.SubtractContext ctx); + + /** + * Enter a parse tree produced by the {@code inequality} + * labeled alternative in {@link BindExpressionParser#expression}. + * + * @param ctx the parse tree + */ + void enterInequality(BindExpressionParser.InequalityContext ctx); + + /** + * Exit a parse tree produced by the {@code inequality} + * labeled alternative in {@link BindExpressionParser#expression}. + * + * @param ctx the parse tree + */ + void exitInequality(BindExpressionParser.InequalityContext ctx); + + /** + * Enter a parse tree produced by the {@code stringLiteral} + * labeled alternative in {@link BindExpressionParser#expression}. + * + * @param ctx the parse tree + */ + void enterStringLiteral(BindExpressionParser.StringLiteralContext ctx); + + /** + * Exit a parse tree produced by the {@code stringLiteral} + * labeled alternative in {@link BindExpressionParser#expression}. + * + * @param ctx the parse tree + */ + void exitStringLiteral(BindExpressionParser.StringLiteralContext ctx); + + /** + * Enter a parse tree produced by the {@code negate} + * labeled alternative in {@link BindExpressionParser#expression}. + * + * @param ctx the parse tree + */ + void enterNegate(BindExpressionParser.NegateContext ctx); + + /** + * Exit a parse tree produced by the {@code negate} + * labeled alternative in {@link BindExpressionParser#expression}. + * + * @param ctx the parse tree + */ + void exitNegate(BindExpressionParser.NegateContext ctx); + + /** + * Enter a parse tree produced by the {@code variable} + * labeled alternative in {@link BindExpressionParser#expression}. + * + * @param ctx the parse tree + */ + void enterVariable(BindExpressionParser.VariableContext ctx); + + /** + * Exit a parse tree produced by the {@code variable} + * labeled alternative in {@link BindExpressionParser#expression}. + * + * @param ctx the parse tree + */ + void exitVariable(BindExpressionParser.VariableContext ctx); + + /** + * Enter a parse tree produced by the {@code propertyRead} + * labeled alternative in {@link BindExpressionParser#expression}. + * + * @param ctx the parse tree + */ + void enterPropertyRead(BindExpressionParser.PropertyReadContext ctx); + + /** + * Exit a parse tree produced by the {@code propertyRead} + * labeled alternative in {@link BindExpressionParser#expression}. + * + * @param ctx the parse tree + */ + void exitPropertyRead(BindExpressionParser.PropertyReadContext ctx); + + /** + * Enter a parse tree produced by the {@code remainder} + * labeled alternative in {@link BindExpressionParser#expression}. + * + * @param ctx the parse tree + */ + void enterRemainder(BindExpressionParser.RemainderContext ctx); + + /** + * Exit a parse tree produced by the {@code remainder} + * labeled alternative in {@link BindExpressionParser#expression}. + * + * @param ctx the parse tree + */ + void exitRemainder(BindExpressionParser.RemainderContext ctx); + + /** + * Enter a parse tree produced by the {@code methodCall} + * labeled alternative in {@link BindExpressionParser#expression}. + * + * @param ctx the parse tree + */ + void enterMethodCall(BindExpressionParser.MethodCallContext ctx); + + /** + * Exit a parse tree produced by the {@code methodCall} + * labeled alternative in {@link BindExpressionParser#expression}. + * + * @param ctx the parse tree + */ + void exitMethodCall(BindExpressionParser.MethodCallContext ctx); +} \ No newline at end of file diff --git a/fx2j-parser/src/main/java/io/github/sheikah45/fx2j/parser/antlr/BindExpressionParser.java b/fx2j-parser/src/main/java/io/github/sheikah45/fx2j/parser/antlr/BindExpressionParser.java new file mode 100644 index 0000000..0cae656 --- /dev/null +++ b/fx2j-parser/src/main/java/io/github/sheikah45/fx2j/parser/antlr/BindExpressionParser.java @@ -0,0 +1,1426 @@ +// Generated from C:/Users/corey/FAFProjects/fx2j/fx2j-parser/src/main/antlr4/io/github/sheikah45/fx2j/parser/expression/BindExpression.g4 by ANTLR 4.13.1 + +package io.github.sheikah45.fx2j.parser.antlr; + +import org.antlr.v4.runtime.atn.*; +import org.antlr.v4.runtime.dfa.DFA; +import org.antlr.v4.runtime.*; +import org.antlr.v4.runtime.tree.*; + +import java.util.List; +import java.util.ArrayList; + +@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast", "CheckReturnValue"}) +public class BindExpressionParser extends Parser { + public static final int + T__0 = 1, T__1 = 2, T__2 = 3, T__3 = 4, T__4 = 5, T__5 = 6, T__6 = 7, T__7 = 8, T__8 = 9, + T__9 = 10, T__10 = 11, T__11 = 12, T__12 = 13, T__13 = 14, T__14 = 15, T__15 = 16, T__16 = 17, + T__17 = 18, T__18 = 19, T__19 = 20, T__20 = 21, T__21 = 22, T__22 = 23, String = 24, + Decimal = 25, Fractional = 26, Identifier = 27, Whitespace = 28; + public static final int + RULE_expression = 0; + public static final String[] ruleNames = makeRuleNames(); + /** + * @deprecated Use {@link #VOCABULARY} instead. + */ + @Deprecated + public static final String[] tokenNames; + public static final String _serializedATN = + "\u0004\u0001\u001cX\u0002\u0000\u0007\u0000\u0001\u0000\u0001\u0000\u0001" + + "\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001" + + "\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001" + + "\u0000\u0001\u0000\u0003\u0000\u0013\b\u0000\u0001\u0000\u0001\u0000\u0001" + + "\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001" + + "\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001" + + "\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001" + + "\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001" + + "\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001" + + "\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001" + + "\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001" + + "\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0005\u0000F\b" + + "\u0000\n\u0000\f\u0000I\t\u0000\u0003\u0000K\b\u0000\u0001\u0000\u0001" + + "\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0005\u0000S\b" + + "\u0000\n\u0000\f\u0000V\t\u0000\u0001\u0000\u0000\u0001\u0000\u0001\u0000" + + "\u0000\u0000q\u0000\u0012\u0001\u0000\u0000\u0000\u0002\u0003\u0006\u0000" + + "\uffff\uffff\u0000\u0003\u0004\u0005\u0007\u0000\u0000\u0004\u0013\u0003" + + "\u0000\u0000\u0017\u0005\u0006\u0005\b\u0000\u0000\u0006\u0013\u0003\u0000" + + "\u0000\u0016\u0007\b\u0005\u0002\u0000\u0000\b\t\u0003\u0000\u0000\u0000" + + "\t\n\u0005\u0004\u0000\u0000\n\u0013\u0001\u0000\u0000\u0000\u000b\u0013" + + "\u0005\u001b\u0000\u0000\f\u0013\u0005\u0018\u0000\u0000\r\u0013\u0005" + + "\u0019\u0000\u0000\u000e\u0013\u0005\u001a\u0000\u0000\u000f\u0013\u0005" + + "\u0015\u0000\u0000\u0010\u0013\u0005\u0016\u0000\u0000\u0011\u0013\u0005" + + "\u0017\u0000\u0000\u0012\u0002\u0001\u0000\u0000\u0000\u0012\u0005\u0001" + + "\u0000\u0000\u0000\u0012\u0007\u0001\u0000\u0000\u0000\u0012\u000b\u0001" + + "\u0000\u0000\u0000\u0012\f\u0001\u0000\u0000\u0000\u0012\r\u0001\u0000" + + "\u0000\u0000\u0012\u000e\u0001\u0000\u0000\u0000\u0012\u000f\u0001\u0000" + + "\u0000\u0000\u0012\u0010\u0001\u0000\u0000\u0000\u0012\u0011\u0001\u0000" + + "\u0000\u0000\u0013T\u0001\u0000\u0000\u0000\u0014\u0015\n\u0015\u0000" + + "\u0000\u0015\u0016\u0005\t\u0000\u0000\u0016S\u0003\u0000\u0000\u0016" + + "\u0017\u0018\n\u0014\u0000\u0000\u0018\u0019\u0005\n\u0000\u0000\u0019" + + "S\u0003\u0000\u0000\u0015\u001a\u001b\n\u0013\u0000\u0000\u001b\u001c" + + "\u0005\u000b\u0000\u0000\u001cS\u0003\u0000\u0000\u0014\u001d\u001e\n" + + "\u0012\u0000\u0000\u001e\u001f\u0005\f\u0000\u0000\u001fS\u0003\u0000" + + "\u0000\u0013 !\n\u0011\u0000\u0000!\"\u0005\b\u0000\u0000\"S\u0003\u0000" + + "\u0000\u0012#$\n\u0010\u0000\u0000$%\u0005\r\u0000\u0000%S\u0003\u0000" + + "\u0000\u0011&\'\n\u000f\u0000\u0000\'(\u0005\u000e\u0000\u0000(S\u0003" + + "\u0000\u0000\u0010)*\n\u000e\u0000\u0000*+\u0005\u000f\u0000\u0000+S\u0003" + + "\u0000\u0000\u000f,-\n\r\u0000\u0000-.\u0005\u0010\u0000\u0000.S\u0003" + + "\u0000\u0000\u000e/0\n\f\u0000\u000001\u0005\u0011\u0000\u00001S\u0003" + + "\u0000\u0000\r23\n\u000b\u0000\u000034\u0005\u0012\u0000\u00004S\u0003" + + "\u0000\u0000\f56\n\n\u0000\u000067\u0005\u0013\u0000\u00007S\u0003\u0000" + + "\u0000\u000b89\n\t\u0000\u00009:\u0005\u0014\u0000\u0000:S\u0003\u0000" + + "\u0000\n;<\n\u001a\u0000\u0000<=\u0005\u0001\u0000\u0000=S\u0005\u001b" + + "\u0000\u0000>?\n\u0019\u0000\u0000?@\u0005\u0001\u0000\u0000@A\u0005\u001b" + + "\u0000\u0000AJ\u0005\u0002\u0000\u0000BG\u0003\u0000\u0000\u0000CD\u0005" + + "\u0003\u0000\u0000DF\u0003\u0000\u0000\u0000EC\u0001\u0000\u0000\u0000" + + "FI\u0001\u0000\u0000\u0000GE\u0001\u0000\u0000\u0000GH\u0001\u0000\u0000" + + "\u0000HK\u0001\u0000\u0000\u0000IG\u0001\u0000\u0000\u0000JB\u0001\u0000" + + "\u0000\u0000JK\u0001\u0000\u0000\u0000KL\u0001\u0000\u0000\u0000LS\u0005" + + "\u0004\u0000\u0000MN\n\u0018\u0000\u0000NO\u0005\u0005\u0000\u0000OP\u0003" + + "\u0000\u0000\u0000PQ\u0005\u0006\u0000\u0000QS\u0001\u0000\u0000\u0000" + + "R\u0014\u0001\u0000\u0000\u0000R\u0017\u0001\u0000\u0000\u0000R\u001a" + + "\u0001\u0000\u0000\u0000R\u001d\u0001\u0000\u0000\u0000R \u0001\u0000" + + "\u0000\u0000R#\u0001\u0000\u0000\u0000R&\u0001\u0000\u0000\u0000R)\u0001" + + "\u0000\u0000\u0000R,\u0001\u0000\u0000\u0000R/\u0001\u0000\u0000\u0000" + + "R2\u0001\u0000\u0000\u0000R5\u0001\u0000\u0000\u0000R8\u0001\u0000\u0000" + + "\u0000R;\u0001\u0000\u0000\u0000R>\u0001\u0000\u0000\u0000RM\u0001\u0000" + + "\u0000\u0000SV\u0001\u0000\u0000\u0000TR\u0001\u0000\u0000\u0000TU\u0001" + + "\u0000\u0000\u0000U\u0001\u0001\u0000\u0000\u0000VT\u0001\u0000\u0000" + + "\u0000\u0005\u0012GJRT"; + public static final ATN _ATN = + new ATNDeserializer().deserialize(_serializedATN.toCharArray()); + protected static final DFA[] _decisionToDFA; + protected static final PredictionContextCache _sharedContextCache = + new PredictionContextCache(); + private static final String[] _LITERAL_NAMES = makeLiteralNames(); + private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames(); + public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES); + + static {RuntimeMetaData.checkVersion("4.13.1", RuntimeMetaData.VERSION);} + + static { + tokenNames = new String[_SYMBOLIC_NAMES.length]; + for (int i = 0; i < tokenNames.length; i++) { + tokenNames[i] = VOCABULARY.getLiteralName(i); + if (tokenNames[i] == null) { + tokenNames[i] = VOCABULARY.getSymbolicName(i); + } + + if (tokenNames[i] == null) { + tokenNames[i] = ""; + } + } + } + + static { + _decisionToDFA = new DFA[_ATN.getNumberOfDecisions()]; + for (int i = 0; i < _ATN.getNumberOfDecisions(); i++) { + _decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i); + } + } + + public BindExpressionParser(TokenStream input) { + super(input); + _interp = new ParserATNSimulator(this, _ATN, _decisionToDFA, _sharedContextCache); + } + + private static String[] makeRuleNames() { + return new String[]{ + "expression" + }; + } + + private static String[] makeLiteralNames() { + return new String[]{ + null, "'.'", "'('", "','", "')'", "'['", "']'", "'!'", "'-'", "'*'", + "'/'", "'%'", "'+'", "'>'", "'>='", "'<'", "'<='", "'=='", "'!='", "'&&'", + "'||'", "'null'", "'true'", "'false'" + }; + } + + private static String[] makeSymbolicNames() { + return new String[]{ + null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, + "String", "Decimal", "Fractional", "Identifier", "Whitespace" + }; + } + + @Override + @Deprecated + public String[] getTokenNames() { + return tokenNames; + } + + @Override + public String[] getRuleNames() {return ruleNames;} + + @Override + + public Vocabulary getVocabulary() { + return VOCABULARY; + } + + @Override + public String getSerializedATN() {return _serializedATN;} + + @Override + public String getGrammarFileName() {return "BindExpression.g4";} + + @Override + public ATN getATN() {return _ATN;} + + public boolean sempred(RuleContext _localctx, int ruleIndex, int predIndex) { + switch (ruleIndex) { + case 0: + return expression_sempred((ExpressionContext) _localctx, predIndex); + } + return true; + } + + private boolean expression_sempred(ExpressionContext _localctx, int predIndex) { + switch (predIndex) { + case 0: + return precpred(_ctx, 21); + case 1: + return precpred(_ctx, 20); + case 2: + return precpred(_ctx, 19); + case 3: + return precpred(_ctx, 18); + case 4: + return precpred(_ctx, 17); + case 5: + return precpred(_ctx, 16); + case 6: + return precpred(_ctx, 15); + case 7: + return precpred(_ctx, 14); + case 8: + return precpred(_ctx, 13); + case 9: + return precpred(_ctx, 12); + case 10: + return precpred(_ctx, 11); + case 11: + return precpred(_ctx, 10); + case 12: + return precpred(_ctx, 9); + case 13: + return precpred(_ctx, 26); + case 14: + return precpred(_ctx, 25); + case 15: + return precpred(_ctx, 24); + } + return true; + } + + public final ExpressionContext expression() throws RecognitionException { + return expression(0); + } + + private ExpressionContext expression(int _p) throws RecognitionException { + ParserRuleContext _parentctx = _ctx; + int _parentState = getState(); + ExpressionContext _localctx = new ExpressionContext(_ctx, _parentState); + ExpressionContext _prevctx = _localctx; + int _startState = 0; + enterRecursionRule(_localctx, 0, RULE_expression, _p); + int _la; + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(18); + _errHandler.sync(this); + switch (_input.LA(1)) { + case T__6: { + _localctx = new InvertContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + + setState(3); + match(T__6); + setState(4); + ((InvertContext) _localctx).base = expression(23); + } + break; + case T__7: { + _localctx = new NegateContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + setState(5); + match(T__7); + setState(6); + ((NegateContext) _localctx).base = expression(22); + } + break; + case T__1: { + _localctx = new EnclosedContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + setState(7); + match(T__1); + setState(8); + ((EnclosedContext) _localctx).inside = expression(0); + setState(9); + match(T__3); + } + break; + case Identifier: { + _localctx = new VariableContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + setState(11); + match(Identifier); + } + break; + case String: { + _localctx = new StringLiteralContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + setState(12); + match(String); + } + break; + case Decimal: { + _localctx = new DecimalLiteralContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + setState(13); + match(Decimal); + } + break; + case Fractional: { + _localctx = new FractionalLiteralContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + setState(14); + match(Fractional); + } + break; + case T__20: { + _localctx = new NullLiteralContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + setState(15); + match(T__20); + } + break; + case T__21: { + _localctx = new TrueLiteralContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + setState(16); + match(T__21); + } + break; + case T__22: { + _localctx = new FalseLiteralContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + setState(17); + match(T__22); + } + break; + default: + throw new NoViableAltException(this); + } + _ctx.stop = _input.LT(-1); + setState(84); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input, 4, _ctx); + while (_alt != 2 && _alt != org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER) { + if (_alt == 1) { + if (_parseListeners != null) {triggerExitRuleEvent();} + _prevctx = _localctx; + { + setState(82); + _errHandler.sync(this); + switch (getInterpreter().adaptivePredict(_input, 3, _ctx)) { + case 1: { + _localctx = new MultiplyContext(new ExpressionContext(_parentctx, _parentState)); + ((MultiplyContext) _localctx).left = _prevctx; + pushNewRecursionContext(_localctx, _startState, RULE_expression); + setState(20); + if (!(precpred(_ctx, 21))) { + throw new FailedPredicateException(this, "precpred(_ctx, 21)"); + } + setState(21); + match(T__8); + setState(22); + ((MultiplyContext) _localctx).right = expression(22); + } + break; + case 2: { + _localctx = new DivideContext(new ExpressionContext(_parentctx, _parentState)); + ((DivideContext) _localctx).left = _prevctx; + pushNewRecursionContext(_localctx, _startState, RULE_expression); + setState(23); + if (!(precpred(_ctx, 20))) { + throw new FailedPredicateException(this, "precpred(_ctx, 20)"); + } + setState(24); + match(T__9); + setState(25); + ((DivideContext) _localctx).right = expression(21); + } + break; + case 3: { + _localctx = new RemainderContext(new ExpressionContext(_parentctx, _parentState)); + ((RemainderContext) _localctx).left = _prevctx; + pushNewRecursionContext(_localctx, _startState, RULE_expression); + setState(26); + if (!(precpred(_ctx, 19))) { + throw new FailedPredicateException(this, "precpred(_ctx, 19)"); + } + setState(27); + match(T__10); + setState(28); + ((RemainderContext) _localctx).right = expression(20); + } + break; + case 4: { + _localctx = new AddContext(new ExpressionContext(_parentctx, _parentState)); + ((AddContext) _localctx).left = _prevctx; + pushNewRecursionContext(_localctx, _startState, RULE_expression); + setState(29); + if (!(precpred(_ctx, 18))) { + throw new FailedPredicateException(this, "precpred(_ctx, 18)"); + } + setState(30); + match(T__11); + setState(31); + ((AddContext) _localctx).right = expression(19); + } + break; + case 5: { + _localctx = new SubtractContext(new ExpressionContext(_parentctx, _parentState)); + ((SubtractContext) _localctx).left = _prevctx; + pushNewRecursionContext(_localctx, _startState, RULE_expression); + setState(32); + if (!(precpred(_ctx, 17))) { + throw new FailedPredicateException(this, "precpred(_ctx, 17)"); + } + setState(33); + match(T__7); + setState(34); + ((SubtractContext) _localctx).right = expression(18); + } + break; + case 6: { + _localctx = new GreaterThanContext(new ExpressionContext(_parentctx, _parentState)); + ((GreaterThanContext) _localctx).left = _prevctx; + pushNewRecursionContext(_localctx, _startState, RULE_expression); + setState(35); + if (!(precpred(_ctx, 16))) { + throw new FailedPredicateException(this, "precpred(_ctx, 16)"); + } + setState(36); + match(T__12); + setState(37); + ((GreaterThanContext) _localctx).right = expression(17); + } + break; + case 7: { + _localctx = new GreaterThanEqualContext( + new ExpressionContext(_parentctx, _parentState)); + ((GreaterThanEqualContext) _localctx).left = _prevctx; + pushNewRecursionContext(_localctx, _startState, RULE_expression); + setState(38); + if (!(precpred(_ctx, 15))) { + throw new FailedPredicateException(this, "precpred(_ctx, 15)"); + } + setState(39); + match(T__13); + setState(40); + ((GreaterThanEqualContext) _localctx).right = expression(16); + } + break; + case 8: { + _localctx = new LessThanContext(new ExpressionContext(_parentctx, _parentState)); + ((LessThanContext) _localctx).left = _prevctx; + pushNewRecursionContext(_localctx, _startState, RULE_expression); + setState(41); + if (!(precpred(_ctx, 14))) { + throw new FailedPredicateException(this, "precpred(_ctx, 14)"); + } + setState(42); + match(T__14); + setState(43); + ((LessThanContext) _localctx).right = expression(15); + } + break; + case 9: { + _localctx = new LessThanEqualContext( + new ExpressionContext(_parentctx, _parentState)); + ((LessThanEqualContext) _localctx).left = _prevctx; + pushNewRecursionContext(_localctx, _startState, RULE_expression); + setState(44); + if (!(precpred(_ctx, 13))) { + throw new FailedPredicateException(this, "precpred(_ctx, 13)"); + } + setState(45); + match(T__15); + setState(46); + ((LessThanEqualContext) _localctx).right = expression(14); + } + break; + case 10: { + _localctx = new EqualityContext(new ExpressionContext(_parentctx, _parentState)); + ((EqualityContext) _localctx).left = _prevctx; + pushNewRecursionContext(_localctx, _startState, RULE_expression); + setState(47); + if (!(precpred(_ctx, 12))) { + throw new FailedPredicateException(this, "precpred(_ctx, 12)"); + } + setState(48); + match(T__16); + setState(49); + ((EqualityContext) _localctx).right = expression(13); + } + break; + case 11: { + _localctx = new InequalityContext(new ExpressionContext(_parentctx, _parentState)); + ((InequalityContext) _localctx).left = _prevctx; + pushNewRecursionContext(_localctx, _startState, RULE_expression); + setState(50); + if (!(precpred(_ctx, 11))) { + throw new FailedPredicateException(this, "precpred(_ctx, 11)"); + } + setState(51); + match(T__17); + setState(52); + ((InequalityContext) _localctx).right = expression(12); + } + break; + case 12: { + _localctx = new AndContext(new ExpressionContext(_parentctx, _parentState)); + ((AndContext) _localctx).left = _prevctx; + pushNewRecursionContext(_localctx, _startState, RULE_expression); + setState(53); + if (!(precpred(_ctx, 10))) { + throw new FailedPredicateException(this, "precpred(_ctx, 10)"); + } + setState(54); + match(T__18); + setState(55); + ((AndContext) _localctx).right = expression(11); + } + break; + case 13: { + _localctx = new OrContext(new ExpressionContext(_parentctx, _parentState)); + ((OrContext) _localctx).left = _prevctx; + pushNewRecursionContext(_localctx, _startState, RULE_expression); + setState(56); + if (!(precpred(_ctx, 9))) { + throw new FailedPredicateException(this, "precpred(_ctx, 9)"); + } + setState(57); + match(T__19); + setState(58); + ((OrContext) _localctx).right = expression(10); + } + break; + case 14: { + _localctx = new PropertyReadContext( + new ExpressionContext(_parentctx, _parentState)); + ((PropertyReadContext) _localctx).base = _prevctx; + pushNewRecursionContext(_localctx, _startState, RULE_expression); + setState(59); + if (!(precpred(_ctx, 26))) { + throw new FailedPredicateException(this, "precpred(_ctx, 26)"); + } + setState(60); + match(T__0); + setState(61); + ((PropertyReadContext) _localctx).property = match(Identifier); + } + break; + case 15: { + _localctx = new MethodCallContext(new ExpressionContext(_parentctx, _parentState)); + ((MethodCallContext) _localctx).base = _prevctx; + pushNewRecursionContext(_localctx, _startState, RULE_expression); + setState(62); + if (!(precpred(_ctx, 25))) { + throw new FailedPredicateException(this, "precpred(_ctx, 25)"); + } + setState(63); + match(T__0); + setState(64); + ((MethodCallContext) _localctx).method = match(Identifier); + setState(65); + match(T__1); + setState(74); + _errHandler.sync(this); + _la = _input.LA(1); + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 266338692L) != 0)) { + { + setState(66); + ((MethodCallContext) _localctx).expression = expression(0); + ((MethodCallContext) _localctx).args.add( + ((MethodCallContext) _localctx).expression); + setState(71); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la == T__2) { + { + { + setState(67); + match(T__2); + setState(68); + ((MethodCallContext) _localctx).expression = expression(0); + ((MethodCallContext) _localctx).args.add( + ((MethodCallContext) _localctx).expression); + } + } + setState(73); + _errHandler.sync(this); + _la = _input.LA(1); + } + } + } + + setState(76); + match(T__3); + } + break; + case 16: { + _localctx = new CollectionAccessContext( + new ExpressionContext(_parentctx, _parentState)); + ((CollectionAccessContext) _localctx).collection = _prevctx; + pushNewRecursionContext(_localctx, _startState, RULE_expression); + setState(77); + if (!(precpred(_ctx, 24))) { + throw new FailedPredicateException(this, "precpred(_ctx, 24)"); + } + setState(78); + match(T__4); + setState(79); + ((CollectionAccessContext) _localctx).accessor = expression(0); + setState(80); + match(T__5); + } + break; + } + } + } + setState(86); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input, 4, _ctx); + } + } + } catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } finally { + unrollRecursionContexts(_parentctx); + } + return _localctx; + } + @SuppressWarnings("CheckReturnValue") + public static class ExpressionContext extends ParserRuleContext { + public ExpressionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + + public ExpressionContext() {} + + @Override + public int getRuleIndex() {return RULE_expression;} + + public void copyFrom(ExpressionContext ctx) { + super.copyFrom(ctx); + } + } + @SuppressWarnings("CheckReturnValue") + public static class DecimalLiteralContext extends ExpressionContext { + public DecimalLiteralContext(ExpressionContext ctx) {copyFrom(ctx);} + + public TerminalNode Decimal() {return getToken(BindExpressionParser.Decimal, 0);} + + @Override + public void enterRule(ParseTreeListener listener) { + if (listener instanceof BindExpressionListener) { + ((BindExpressionListener) listener).enterDecimalLiteral(this); + } + } + + @Override + public void exitRule(ParseTreeListener listener) { + if (listener instanceof BindExpressionListener) { + ((BindExpressionListener) listener).exitDecimalLiteral(this); + } + } + + @Override + public T accept(ParseTreeVisitor visitor) { + if (visitor instanceof BindExpressionVisitor) { + return ((BindExpressionVisitor) visitor).visitDecimalLiteral(this); + } else {return visitor.visitChildren(this);} + } + } + @SuppressWarnings("CheckReturnValue") + public static class LessThanEqualContext extends ExpressionContext { + public ExpressionContext left; + public ExpressionContext right; + + public LessThanEqualContext(ExpressionContext ctx) {copyFrom(ctx);} + + public List expression() { + return getRuleContexts(ExpressionContext.class); + } + + public ExpressionContext expression(int i) { + return getRuleContext(ExpressionContext.class, i); + } + + @Override + public void enterRule(ParseTreeListener listener) { + if (listener instanceof BindExpressionListener) { + ((BindExpressionListener) listener).enterLessThanEqual(this); + } + } + + @Override + public void exitRule(ParseTreeListener listener) { + if (listener instanceof BindExpressionListener) { + ((BindExpressionListener) listener).exitLessThanEqual(this); + } + } + + @Override + public T accept(ParseTreeVisitor visitor) { + if (visitor instanceof BindExpressionVisitor) { + return ((BindExpressionVisitor) visitor).visitLessThanEqual(this); + } else {return visitor.visitChildren(this);} + } + } + @SuppressWarnings("CheckReturnValue") + public static class CollectionAccessContext extends ExpressionContext { + public ExpressionContext collection; + public ExpressionContext accessor; + + public CollectionAccessContext(ExpressionContext ctx) {copyFrom(ctx);} + + public List expression() { + return getRuleContexts(ExpressionContext.class); + } + + public ExpressionContext expression(int i) { + return getRuleContext(ExpressionContext.class, i); + } + + @Override + public void enterRule(ParseTreeListener listener) { + if (listener instanceof BindExpressionListener) { + ((BindExpressionListener) listener).enterCollectionAccess(this); + } + } + + @Override + public void exitRule(ParseTreeListener listener) { + if (listener instanceof BindExpressionListener) { + ((BindExpressionListener) listener).exitCollectionAccess(this); + } + } + + @Override + public T accept(ParseTreeVisitor visitor) { + if (visitor instanceof BindExpressionVisitor) { + return ((BindExpressionVisitor) visitor).visitCollectionAccess(this); + } else {return visitor.visitChildren(this);} + } + } + @SuppressWarnings("CheckReturnValue") + public static class FractionalLiteralContext extends ExpressionContext { + public FractionalLiteralContext(ExpressionContext ctx) {copyFrom(ctx);} + + public TerminalNode Fractional() {return getToken(BindExpressionParser.Fractional, 0);} + + @Override + public void enterRule(ParseTreeListener listener) { + if (listener instanceof BindExpressionListener) { + ((BindExpressionListener) listener).enterFractionalLiteral(this); + } + } + + @Override + public void exitRule(ParseTreeListener listener) { + if (listener instanceof BindExpressionListener) { + ((BindExpressionListener) listener).exitFractionalLiteral(this); + } + } + + @Override + public T accept(ParseTreeVisitor visitor) { + if (visitor instanceof BindExpressionVisitor) { + return ((BindExpressionVisitor) visitor).visitFractionalLiteral(this); + } else {return visitor.visitChildren(this);} + } + } + @SuppressWarnings("CheckReturnValue") + public static class TrueLiteralContext extends ExpressionContext { + public TrueLiteralContext(ExpressionContext ctx) {copyFrom(ctx);} + + @Override + public void enterRule(ParseTreeListener listener) { + if (listener instanceof BindExpressionListener) { + ((BindExpressionListener) listener).enterTrueLiteral(this); + } + } + + @Override + public void exitRule(ParseTreeListener listener) { + if (listener instanceof BindExpressionListener) {((BindExpressionListener) listener).exitTrueLiteral(this);} + } + + @Override + public T accept(ParseTreeVisitor visitor) { + if (visitor instanceof BindExpressionVisitor) { + return ((BindExpressionVisitor) visitor).visitTrueLiteral(this); + } else {return visitor.visitChildren(this);} + } + } + @SuppressWarnings("CheckReturnValue") + public static class EnclosedContext extends ExpressionContext { + public ExpressionContext inside; + + public EnclosedContext(ExpressionContext ctx) {copyFrom(ctx);} + + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class, 0); + } + + @Override + public void enterRule(ParseTreeListener listener) { + if (listener instanceof BindExpressionListener) {((BindExpressionListener) listener).enterEnclosed(this);} + } + + @Override + public void exitRule(ParseTreeListener listener) { + if (listener instanceof BindExpressionListener) {((BindExpressionListener) listener).exitEnclosed(this);} + } + + @Override + public T accept(ParseTreeVisitor visitor) { + if (visitor instanceof BindExpressionVisitor) { + return ((BindExpressionVisitor) visitor).visitEnclosed(this); + } else {return visitor.visitChildren(this);} + } + } + @SuppressWarnings("CheckReturnValue") + public static class FalseLiteralContext extends ExpressionContext { + public FalseLiteralContext(ExpressionContext ctx) {copyFrom(ctx);} + + @Override + public void enterRule(ParseTreeListener listener) { + if (listener instanceof BindExpressionListener) { + ((BindExpressionListener) listener).enterFalseLiteral(this); + } + } + + @Override + public void exitRule(ParseTreeListener listener) { + if (listener instanceof BindExpressionListener) { + ((BindExpressionListener) listener).exitFalseLiteral(this); + } + } + + @Override + public T accept(ParseTreeVisitor visitor) { + if (visitor instanceof BindExpressionVisitor) { + return ((BindExpressionVisitor) visitor).visitFalseLiteral(this); + } else {return visitor.visitChildren(this);} + } + } + @SuppressWarnings("CheckReturnValue") + public static class AndContext extends ExpressionContext { + public ExpressionContext left; + public ExpressionContext right; + + public AndContext(ExpressionContext ctx) {copyFrom(ctx);} + + public List expression() { + return getRuleContexts(ExpressionContext.class); + } + + public ExpressionContext expression(int i) { + return getRuleContext(ExpressionContext.class, i); + } + + @Override + public void enterRule(ParseTreeListener listener) { + if (listener instanceof BindExpressionListener) {((BindExpressionListener) listener).enterAnd(this);} + } + + @Override + public void exitRule(ParseTreeListener listener) { + if (listener instanceof BindExpressionListener) {((BindExpressionListener) listener).exitAnd(this);} + } + + @Override + public T accept(ParseTreeVisitor visitor) { + if (visitor instanceof BindExpressionVisitor) { + return ((BindExpressionVisitor) visitor).visitAnd(this); + } else {return visitor.visitChildren(this);} + } + } + @SuppressWarnings("CheckReturnValue") + public static class LessThanContext extends ExpressionContext { + public ExpressionContext left; + public ExpressionContext right; + + public LessThanContext(ExpressionContext ctx) {copyFrom(ctx);} + + public List expression() { + return getRuleContexts(ExpressionContext.class); + } + + public ExpressionContext expression(int i) { + return getRuleContext(ExpressionContext.class, i); + } + + @Override + public void enterRule(ParseTreeListener listener) { + if (listener instanceof BindExpressionListener) {((BindExpressionListener) listener).enterLessThan(this);} + } + + @Override + public void exitRule(ParseTreeListener listener) { + if (listener instanceof BindExpressionListener) {((BindExpressionListener) listener).exitLessThan(this);} + } + + @Override + public T accept(ParseTreeVisitor visitor) { + if (visitor instanceof BindExpressionVisitor) { + return ((BindExpressionVisitor) visitor).visitLessThan(this); + } else {return visitor.visitChildren(this);} + } + } + @SuppressWarnings("CheckReturnValue") + public static class DivideContext extends ExpressionContext { + public ExpressionContext left; + public ExpressionContext right; + + public DivideContext(ExpressionContext ctx) {copyFrom(ctx);} + + public List expression() { + return getRuleContexts(ExpressionContext.class); + } + + public ExpressionContext expression(int i) { + return getRuleContext(ExpressionContext.class, i); + } + + @Override + public void enterRule(ParseTreeListener listener) { + if (listener instanceof BindExpressionListener) {((BindExpressionListener) listener).enterDivide(this);} + } + + @Override + public void exitRule(ParseTreeListener listener) { + if (listener instanceof BindExpressionListener) {((BindExpressionListener) listener).exitDivide(this);} + } + + @Override + public T accept(ParseTreeVisitor visitor) { + if (visitor instanceof BindExpressionVisitor) { + return ((BindExpressionVisitor) visitor).visitDivide(this); + } else {return visitor.visitChildren(this);} + } + } + @SuppressWarnings("CheckReturnValue") + public static class MultiplyContext extends ExpressionContext { + public ExpressionContext left; + public ExpressionContext right; + + public MultiplyContext(ExpressionContext ctx) {copyFrom(ctx);} + + public List expression() { + return getRuleContexts(ExpressionContext.class); + } + + public ExpressionContext expression(int i) { + return getRuleContext(ExpressionContext.class, i); + } + + @Override + public void enterRule(ParseTreeListener listener) { + if (listener instanceof BindExpressionListener) {((BindExpressionListener) listener).enterMultiply(this);} + } + + @Override + public void exitRule(ParseTreeListener listener) { + if (listener instanceof BindExpressionListener) {((BindExpressionListener) listener).exitMultiply(this);} + } + + @Override + public T accept(ParseTreeVisitor visitor) { + if (visitor instanceof BindExpressionVisitor) { + return ((BindExpressionVisitor) visitor).visitMultiply(this); + } else {return visitor.visitChildren(this);} + } + } + @SuppressWarnings("CheckReturnValue") + public static class EqualityContext extends ExpressionContext { + public ExpressionContext left; + public ExpressionContext right; + + public EqualityContext(ExpressionContext ctx) {copyFrom(ctx);} + + public List expression() { + return getRuleContexts(ExpressionContext.class); + } + + public ExpressionContext expression(int i) { + return getRuleContext(ExpressionContext.class, i); + } + + @Override + public void enterRule(ParseTreeListener listener) { + if (listener instanceof BindExpressionListener) {((BindExpressionListener) listener).enterEquality(this);} + } + + @Override + public void exitRule(ParseTreeListener listener) { + if (listener instanceof BindExpressionListener) {((BindExpressionListener) listener).exitEquality(this);} + } + + @Override + public T accept(ParseTreeVisitor visitor) { + if (visitor instanceof BindExpressionVisitor) { + return ((BindExpressionVisitor) visitor).visitEquality(this); + } else {return visitor.visitChildren(this);} + } + } + @SuppressWarnings("CheckReturnValue") + public static class GreaterThanContext extends ExpressionContext { + public ExpressionContext left; + public ExpressionContext right; + + public GreaterThanContext(ExpressionContext ctx) {copyFrom(ctx);} + + public List expression() { + return getRuleContexts(ExpressionContext.class); + } + + public ExpressionContext expression(int i) { + return getRuleContext(ExpressionContext.class, i); + } + + @Override + public void enterRule(ParseTreeListener listener) { + if (listener instanceof BindExpressionListener) { + ((BindExpressionListener) listener).enterGreaterThan(this); + } + } + + @Override + public void exitRule(ParseTreeListener listener) { + if (listener instanceof BindExpressionListener) {((BindExpressionListener) listener).exitGreaterThan(this);} + } + + @Override + public T accept(ParseTreeVisitor visitor) { + if (visitor instanceof BindExpressionVisitor) { + return ((BindExpressionVisitor) visitor).visitGreaterThan(this); + } else {return visitor.visitChildren(this);} + } + } + @SuppressWarnings("CheckReturnValue") + public static class AddContext extends ExpressionContext { + public ExpressionContext left; + public ExpressionContext right; + + public AddContext(ExpressionContext ctx) {copyFrom(ctx);} + + public List expression() { + return getRuleContexts(ExpressionContext.class); + } + + public ExpressionContext expression(int i) { + return getRuleContext(ExpressionContext.class, i); + } + + @Override + public void enterRule(ParseTreeListener listener) { + if (listener instanceof BindExpressionListener) {((BindExpressionListener) listener).enterAdd(this);} + } + + @Override + public void exitRule(ParseTreeListener listener) { + if (listener instanceof BindExpressionListener) {((BindExpressionListener) listener).exitAdd(this);} + } + + @Override + public T accept(ParseTreeVisitor visitor) { + if (visitor instanceof BindExpressionVisitor) { + return ((BindExpressionVisitor) visitor).visitAdd(this); + } else {return visitor.visitChildren(this);} + } + } + @SuppressWarnings("CheckReturnValue") + public static class GreaterThanEqualContext extends ExpressionContext { + public ExpressionContext left; + public ExpressionContext right; + + public GreaterThanEqualContext(ExpressionContext ctx) {copyFrom(ctx);} + + public List expression() { + return getRuleContexts(ExpressionContext.class); + } + + public ExpressionContext expression(int i) { + return getRuleContext(ExpressionContext.class, i); + } + + @Override + public void enterRule(ParseTreeListener listener) { + if (listener instanceof BindExpressionListener) { + ((BindExpressionListener) listener).enterGreaterThanEqual(this); + } + } + + @Override + public void exitRule(ParseTreeListener listener) { + if (listener instanceof BindExpressionListener) { + ((BindExpressionListener) listener).exitGreaterThanEqual(this); + } + } + + @Override + public T accept(ParseTreeVisitor visitor) { + if (visitor instanceof BindExpressionVisitor) { + return ((BindExpressionVisitor) visitor).visitGreaterThanEqual(this); + } else {return visitor.visitChildren(this);} + } + } + @SuppressWarnings("CheckReturnValue") + public static class NullLiteralContext extends ExpressionContext { + public NullLiteralContext(ExpressionContext ctx) {copyFrom(ctx);} + + @Override + public void enterRule(ParseTreeListener listener) { + if (listener instanceof BindExpressionListener) { + ((BindExpressionListener) listener).enterNullLiteral(this); + } + } + + @Override + public void exitRule(ParseTreeListener listener) { + if (listener instanceof BindExpressionListener) {((BindExpressionListener) listener).exitNullLiteral(this);} + } + + @Override + public T accept(ParseTreeVisitor visitor) { + if (visitor instanceof BindExpressionVisitor) { + return ((BindExpressionVisitor) visitor).visitNullLiteral(this); + } else {return visitor.visitChildren(this);} + } + } + @SuppressWarnings("CheckReturnValue") + public static class OrContext extends ExpressionContext { + public ExpressionContext left; + public ExpressionContext right; + + public OrContext(ExpressionContext ctx) {copyFrom(ctx);} + + public List expression() { + return getRuleContexts(ExpressionContext.class); + } + + public ExpressionContext expression(int i) { + return getRuleContext(ExpressionContext.class, i); + } + + @Override + public void enterRule(ParseTreeListener listener) { + if (listener instanceof BindExpressionListener) {((BindExpressionListener) listener).enterOr(this);} + } + + @Override + public void exitRule(ParseTreeListener listener) { + if (listener instanceof BindExpressionListener) {((BindExpressionListener) listener).exitOr(this);} + } + + @Override + public T accept(ParseTreeVisitor visitor) { + if (visitor instanceof BindExpressionVisitor) { + return ((BindExpressionVisitor) visitor).visitOr(this); + } else {return visitor.visitChildren(this);} + } + } + @SuppressWarnings("CheckReturnValue") + public static class InvertContext extends ExpressionContext { + public ExpressionContext base; + + public InvertContext(ExpressionContext ctx) {copyFrom(ctx);} + + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class, 0); + } + + @Override + public void enterRule(ParseTreeListener listener) { + if (listener instanceof BindExpressionListener) {((BindExpressionListener) listener).enterInvert(this);} + } + + @Override + public void exitRule(ParseTreeListener listener) { + if (listener instanceof BindExpressionListener) {((BindExpressionListener) listener).exitInvert(this);} + } + + @Override + public T accept(ParseTreeVisitor visitor) { + if (visitor instanceof BindExpressionVisitor) { + return ((BindExpressionVisitor) visitor).visitInvert(this); + } else {return visitor.visitChildren(this);} + } + } + @SuppressWarnings("CheckReturnValue") + public static class SubtractContext extends ExpressionContext { + public ExpressionContext left; + public ExpressionContext right; + + public SubtractContext(ExpressionContext ctx) {copyFrom(ctx);} + + public List expression() { + return getRuleContexts(ExpressionContext.class); + } + + public ExpressionContext expression(int i) { + return getRuleContext(ExpressionContext.class, i); + } + + @Override + public void enterRule(ParseTreeListener listener) { + if (listener instanceof BindExpressionListener) {((BindExpressionListener) listener).enterSubtract(this);} + } + + @Override + public void exitRule(ParseTreeListener listener) { + if (listener instanceof BindExpressionListener) {((BindExpressionListener) listener).exitSubtract(this);} + } + + @Override + public T accept(ParseTreeVisitor visitor) { + if (visitor instanceof BindExpressionVisitor) { + return ((BindExpressionVisitor) visitor).visitSubtract(this); + } else {return visitor.visitChildren(this);} + } + } + @SuppressWarnings("CheckReturnValue") + public static class InequalityContext extends ExpressionContext { + public ExpressionContext left; + public ExpressionContext right; + + public InequalityContext(ExpressionContext ctx) {copyFrom(ctx);} + + public List expression() { + return getRuleContexts(ExpressionContext.class); + } + + public ExpressionContext expression(int i) { + return getRuleContext(ExpressionContext.class, i); + } + + @Override + public void enterRule(ParseTreeListener listener) { + if (listener instanceof BindExpressionListener) {((BindExpressionListener) listener).enterInequality(this);} + } + + @Override + public void exitRule(ParseTreeListener listener) { + if (listener instanceof BindExpressionListener) {((BindExpressionListener) listener).exitInequality(this);} + } + + @Override + public T accept(ParseTreeVisitor visitor) { + if (visitor instanceof BindExpressionVisitor) { + return ((BindExpressionVisitor) visitor).visitInequality(this); + } else {return visitor.visitChildren(this);} + } + } + @SuppressWarnings("CheckReturnValue") + public static class StringLiteralContext extends ExpressionContext { + public StringLiteralContext(ExpressionContext ctx) {copyFrom(ctx);} + + public TerminalNode String() {return getToken(BindExpressionParser.String, 0);} + + @Override + public void enterRule(ParseTreeListener listener) { + if (listener instanceof BindExpressionListener) { + ((BindExpressionListener) listener).enterStringLiteral(this); + } + } + + @Override + public void exitRule(ParseTreeListener listener) { + if (listener instanceof BindExpressionListener) { + ((BindExpressionListener) listener).exitStringLiteral(this); + } + } + + @Override + public T accept(ParseTreeVisitor visitor) { + if (visitor instanceof BindExpressionVisitor) { + return ((BindExpressionVisitor) visitor).visitStringLiteral(this); + } else {return visitor.visitChildren(this);} + } + } + @SuppressWarnings("CheckReturnValue") + public static class NegateContext extends ExpressionContext { + public ExpressionContext base; + + public NegateContext(ExpressionContext ctx) {copyFrom(ctx);} + + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class, 0); + } + + @Override + public void enterRule(ParseTreeListener listener) { + if (listener instanceof BindExpressionListener) {((BindExpressionListener) listener).enterNegate(this);} + } + + @Override + public void exitRule(ParseTreeListener listener) { + if (listener instanceof BindExpressionListener) {((BindExpressionListener) listener).exitNegate(this);} + } + + @Override + public T accept(ParseTreeVisitor visitor) { + if (visitor instanceof BindExpressionVisitor) { + return ((BindExpressionVisitor) visitor).visitNegate(this); + } else {return visitor.visitChildren(this);} + } + } + @SuppressWarnings("CheckReturnValue") + public static class VariableContext extends ExpressionContext { + public VariableContext(ExpressionContext ctx) {copyFrom(ctx);} + + public TerminalNode Identifier() {return getToken(BindExpressionParser.Identifier, 0);} + + @Override + public void enterRule(ParseTreeListener listener) { + if (listener instanceof BindExpressionListener) {((BindExpressionListener) listener).enterVariable(this);} + } + + @Override + public void exitRule(ParseTreeListener listener) { + if (listener instanceof BindExpressionListener) {((BindExpressionListener) listener).exitVariable(this);} + } + + @Override + public T accept(ParseTreeVisitor visitor) { + if (visitor instanceof BindExpressionVisitor) { + return ((BindExpressionVisitor) visitor).visitVariable(this); + } else {return visitor.visitChildren(this);} + } + } + @SuppressWarnings("CheckReturnValue") + public static class PropertyReadContext extends ExpressionContext { + public ExpressionContext base; + public Token property; + + public PropertyReadContext(ExpressionContext ctx) {copyFrom(ctx);} + + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class, 0); + } + + public TerminalNode Identifier() {return getToken(BindExpressionParser.Identifier, 0);} + + @Override + public void enterRule(ParseTreeListener listener) { + if (listener instanceof BindExpressionListener) { + ((BindExpressionListener) listener).enterPropertyRead(this); + } + } + + @Override + public void exitRule(ParseTreeListener listener) { + if (listener instanceof BindExpressionListener) { + ((BindExpressionListener) listener).exitPropertyRead(this); + } + } + + @Override + public T accept(ParseTreeVisitor visitor) { + if (visitor instanceof BindExpressionVisitor) { + return ((BindExpressionVisitor) visitor).visitPropertyRead(this); + } else {return visitor.visitChildren(this);} + } + } + @SuppressWarnings("CheckReturnValue") + public static class RemainderContext extends ExpressionContext { + public ExpressionContext left; + public ExpressionContext right; + + public RemainderContext(ExpressionContext ctx) {copyFrom(ctx);} + + public List expression() { + return getRuleContexts(ExpressionContext.class); + } + + public ExpressionContext expression(int i) { + return getRuleContext(ExpressionContext.class, i); + } + + @Override + public void enterRule(ParseTreeListener listener) { + if (listener instanceof BindExpressionListener) {((BindExpressionListener) listener).enterRemainder(this);} + } + + @Override + public void exitRule(ParseTreeListener listener) { + if (listener instanceof BindExpressionListener) {((BindExpressionListener) listener).exitRemainder(this);} + } + + @Override + public T accept(ParseTreeVisitor visitor) { + if (visitor instanceof BindExpressionVisitor) { + return ((BindExpressionVisitor) visitor).visitRemainder(this); + } else {return visitor.visitChildren(this);} + } + } + @SuppressWarnings("CheckReturnValue") + public static class MethodCallContext extends ExpressionContext { + public ExpressionContext base; + public Token method; + public ExpressionContext expression; + public List args = new ArrayList(); + + public MethodCallContext(ExpressionContext ctx) {copyFrom(ctx);} + + public List expression() { + return getRuleContexts(ExpressionContext.class); + } + + public ExpressionContext expression(int i) { + return getRuleContext(ExpressionContext.class, i); + } + + public TerminalNode Identifier() {return getToken(BindExpressionParser.Identifier, 0);} + + @Override + public void enterRule(ParseTreeListener listener) { + if (listener instanceof BindExpressionListener) {((BindExpressionListener) listener).enterMethodCall(this);} + } + + @Override + public void exitRule(ParseTreeListener listener) { + if (listener instanceof BindExpressionListener) {((BindExpressionListener) listener).exitMethodCall(this);} + } + + @Override + public T accept(ParseTreeVisitor visitor) { + if (visitor instanceof BindExpressionVisitor) { + return ((BindExpressionVisitor) visitor).visitMethodCall(this); + } else {return visitor.visitChildren(this);} + } + } +} \ No newline at end of file diff --git a/fx2j-parser/src/main/java/io/github/sheikah45/fx2j/parser/antlr/BindExpressionVisitor.java b/fx2j-parser/src/main/java/io/github/sheikah45/fx2j/parser/antlr/BindExpressionVisitor.java new file mode 100644 index 0000000..f277d8a --- /dev/null +++ b/fx2j-parser/src/main/java/io/github/sheikah45/fx2j/parser/antlr/BindExpressionVisitor.java @@ -0,0 +1,248 @@ +// Generated from C:/Users/corey/FAFProjects/fx2j/fx2j-parser/src/main/antlr4/io/github/sheikah45/fx2j/parser/expression/BindExpression.g4 by ANTLR 4.13.1 + +package io.github.sheikah45.fx2j.parser.antlr; + +import org.antlr.v4.runtime.tree.ParseTreeVisitor; + +/** + * This interface defines a complete generic visitor for a parse tree produced + * by {@link BindExpressionParser}. + * + * @param The return type of the visit operation. Use {@link Void} for + * operations with no return type. + */ +public interface BindExpressionVisitor extends ParseTreeVisitor { + /** + * Visit a parse tree produced by the {@code decimalLiteral} + * labeled alternative in {@link BindExpressionParser#expression()}. + * + * @param ctx the parse tree + * @return the visitor result + */ + T visitDecimalLiteral(BindExpressionParser.DecimalLiteralContext ctx); + + /** + * Visit a parse tree produced by the {@code lessThanEqual} + * labeled alternative in {@link BindExpressionParser#expression()}. + * + * @param ctx the parse tree + * @return the visitor result + */ + T visitLessThanEqual(BindExpressionParser.LessThanEqualContext ctx); + + /** + * Visit a parse tree produced by the {@code collectionAccess} + * labeled alternative in {@link BindExpressionParser#expression()}. + * + * @param ctx the parse tree + * @return the visitor result + */ + T visitCollectionAccess(BindExpressionParser.CollectionAccessContext ctx); + + /** + * Visit a parse tree produced by the {@code fractionalLiteral} + * labeled alternative in {@link BindExpressionParser#expression()}. + * + * @param ctx the parse tree + * @return the visitor result + */ + T visitFractionalLiteral(BindExpressionParser.FractionalLiteralContext ctx); + + /** + * Visit a parse tree produced by the {@code trueLiteral} + * labeled alternative in {@link BindExpressionParser#expression()}. + * + * @param ctx the parse tree + * @return the visitor result + */ + T visitTrueLiteral(BindExpressionParser.TrueLiteralContext ctx); + + /** + * Visit a parse tree produced by the {@code enclosed} + * labeled alternative in {@link BindExpressionParser#expression()}. + * + * @param ctx the parse tree + * @return the visitor result + */ + T visitEnclosed(BindExpressionParser.EnclosedContext ctx); + + /** + * Visit a parse tree produced by the {@code falseLiteral} + * labeled alternative in {@link BindExpressionParser#expression()}. + * + * @param ctx the parse tree + * @return the visitor result + */ + T visitFalseLiteral(BindExpressionParser.FalseLiteralContext ctx); + + /** + * Visit a parse tree produced by the {@code and} + * labeled alternative in {@link BindExpressionParser#expression()}. + * + * @param ctx the parse tree + * @return the visitor result + */ + T visitAnd(BindExpressionParser.AndContext ctx); + + /** + * Visit a parse tree produced by the {@code lessThan} + * labeled alternative in {@link BindExpressionParser#expression()}. + * + * @param ctx the parse tree + * @return the visitor result + */ + T visitLessThan(BindExpressionParser.LessThanContext ctx); + + /** + * Visit a parse tree produced by the {@code divide} + * labeled alternative in {@link BindExpressionParser#expression()}. + * + * @param ctx the parse tree + * @return the visitor result + */ + T visitDivide(BindExpressionParser.DivideContext ctx); + + /** + * Visit a parse tree produced by the {@code multiply} + * labeled alternative in {@link BindExpressionParser#expression()}. + * + * @param ctx the parse tree + * @return the visitor result + */ + T visitMultiply(BindExpressionParser.MultiplyContext ctx); + + /** + * Visit a parse tree produced by the {@code equality} + * labeled alternative in {@link BindExpressionParser#expression()}. + * + * @param ctx the parse tree + * @return the visitor result + */ + T visitEquality(BindExpressionParser.EqualityContext ctx); + + /** + * Visit a parse tree produced by the {@code greaterThan} + * labeled alternative in {@link BindExpressionParser#expression()}. + * + * @param ctx the parse tree + * @return the visitor result + */ + T visitGreaterThan(BindExpressionParser.GreaterThanContext ctx); + + /** + * Visit a parse tree produced by the {@code add} + * labeled alternative in {@link BindExpressionParser#expression()}. + * + * @param ctx the parse tree + * @return the visitor result + */ + T visitAdd(BindExpressionParser.AddContext ctx); + + /** + * Visit a parse tree produced by the {@code greaterThanEqual} + * labeled alternative in {@link BindExpressionParser#expression()}. + * + * @param ctx the parse tree + * @return the visitor result + */ + T visitGreaterThanEqual(BindExpressionParser.GreaterThanEqualContext ctx); + + /** + * Visit a parse tree produced by the {@code nullLiteral} + * labeled alternative in {@link BindExpressionParser#expression()}. + * + * @param ctx the parse tree + * @return the visitor result + */ + T visitNullLiteral(BindExpressionParser.NullLiteralContext ctx); + + /** + * Visit a parse tree produced by the {@code or} + * labeled alternative in {@link BindExpressionParser#expression()}. + * + * @param ctx the parse tree + * @return the visitor result + */ + T visitOr(BindExpressionParser.OrContext ctx); + + /** + * Visit a parse tree produced by the {@code invert} + * labeled alternative in {@link BindExpressionParser#expression()}. + * + * @param ctx the parse tree + * @return the visitor result + */ + T visitInvert(BindExpressionParser.InvertContext ctx); + + /** + * Visit a parse tree produced by the {@code subtract} + * labeled alternative in {@link BindExpressionParser#expression()}. + * + * @param ctx the parse tree + * @return the visitor result + */ + T visitSubtract(BindExpressionParser.SubtractContext ctx); + + /** + * Visit a parse tree produced by the {@code inequality} + * labeled alternative in {@link BindExpressionParser#expression()}. + * + * @param ctx the parse tree + * @return the visitor result + */ + T visitInequality(BindExpressionParser.InequalityContext ctx); + + /** + * Visit a parse tree produced by the {@code stringLiteral} + * labeled alternative in {@link BindExpressionParser#expression()}. + * + * @param ctx the parse tree + * @return the visitor result + */ + T visitStringLiteral(BindExpressionParser.StringLiteralContext ctx); + + /** + * Visit a parse tree produced by the {@code negate} + * labeled alternative in {@link BindExpressionParser#expression()}. + * + * @param ctx the parse tree + * @return the visitor result + */ + T visitNegate(BindExpressionParser.NegateContext ctx); + + /** + * Visit a parse tree produced by the {@code variable} + * labeled alternative in {@link BindExpressionParser#expression()}. + * + * @param ctx the parse tree + * @return the visitor result + */ + T visitVariable(BindExpressionParser.VariableContext ctx); + + /** + * Visit a parse tree produced by the {@code propertyRead} + * labeled alternative in {@link BindExpressionParser#expression()}. + * + * @param ctx the parse tree + * @return the visitor result + */ + T visitPropertyRead(BindExpressionParser.PropertyReadContext ctx); + + /** + * Visit a parse tree produced by the {@code remainder} + * labeled alternative in {@link BindExpressionParser#expression()}. + * + * @param ctx the parse tree + * @return the visitor result + */ + T visitRemainder(BindExpressionParser.RemainderContext ctx); + + /** + * Visit a parse tree produced by the {@code methodCall} + * labeled alternative in {@link BindExpressionParser#expression()}. + * + * @param ctx the parse tree + * @return the visitor result + */ + T visitMethodCall(BindExpressionParser.MethodCallContext ctx); +} \ No newline at end of file diff --git a/fx2j-parser/src/main/java/io/github/sheikah45/fx2j/parser/antlr/BindExpressionVisitorImpl.java b/fx2j-parser/src/main/java/io/github/sheikah45/fx2j/parser/antlr/BindExpressionVisitorImpl.java new file mode 100644 index 0000000..cdd6846 --- /dev/null +++ b/fx2j-parser/src/main/java/io/github/sheikah45/fx2j/parser/antlr/BindExpressionVisitorImpl.java @@ -0,0 +1,138 @@ +package io.github.sheikah45.fx2j.parser.antlr; + +import io.github.sheikah45.fx2j.parser.property.Value; +import org.antlr.v4.runtime.tree.AbstractParseTreeVisitor; + +public class BindExpressionVisitorImpl extends AbstractParseTreeVisitor + implements BindExpressionVisitor { + @Override + public Value.Expression visitDecimalLiteral(BindExpressionParser.DecimalLiteralContext ctx) { + return new Value.Expression.Whole(Long.parseLong(ctx.getText())); + } + + @Override + public Value.Expression visitLessThanEqual(BindExpressionParser.LessThanEqualContext ctx) { + return new Value.Expression.LessThanEqual(ctx.left.accept(this), ctx.right.accept(this)); + } + + @Override + public Value.Expression visitCollectionAccess(BindExpressionParser.CollectionAccessContext ctx) { + return new Value.Expression.CollectionAccess(ctx.collection.accept(this), ctx.accessor.accept(this)); + } + + @Override + public Value.Expression visitFractionalLiteral(BindExpressionParser.FractionalLiteralContext ctx) { + return new Value.Expression.Fraction(Double.parseDouble(ctx.getText())); + } + + @Override + public Value.Expression visitTrueLiteral(BindExpressionParser.TrueLiteralContext ctx) { + return new Value.Expression.True(); + } + + @Override + public Value.Expression visitEnclosed(BindExpressionParser.EnclosedContext ctx) { + return ctx.inside.accept(this); + } + + @Override + public Value.Expression visitFalseLiteral(BindExpressionParser.FalseLiteralContext ctx) { + return new Value.Expression.False(); + } + + @Override + public Value.Expression visitAnd(BindExpressionParser.AndContext ctx) { + return new Value.Expression.And(ctx.left.accept(this), ctx.right.accept(this)); + } + + @Override + public Value.Expression visitLessThan(BindExpressionParser.LessThanContext ctx) { + return new Value.Expression.LessThan(ctx.left.accept(this), ctx.right.accept(this)); + } + + @Override + public Value.Expression visitDivide(BindExpressionParser.DivideContext ctx) { + return new Value.Expression.Divide(ctx.left.accept(this), ctx.right.accept(this)); + } + + @Override + public Value.Expression visitMultiply(BindExpressionParser.MultiplyContext ctx) { + return new Value.Expression.Multiply(ctx.left.accept(this), ctx.right.accept(this)); + } + + @Override + public Value.Expression visitEquality(BindExpressionParser.EqualityContext ctx) { + return new Value.Expression.Equality(ctx.left.accept(this), ctx.right.accept(this)); + } + + @Override + public Value.Expression visitGreaterThan(BindExpressionParser.GreaterThanContext ctx) { + return new Value.Expression.GreaterThan(ctx.left.accept(this), ctx.right.accept(this)); + } + + @Override + public Value.Expression visitAdd(BindExpressionParser.AddContext ctx) { + return new Value.Expression.Add(ctx.left.accept(this), ctx.right.accept(this)); + } + + @Override + public Value.Expression visitGreaterThanEqual(BindExpressionParser.GreaterThanEqualContext ctx) { + return new Value.Expression.GreaterThanEqual(ctx.left.accept(this), ctx.right.accept(this)); + } + + @Override + public Value.Expression visitNullLiteral(BindExpressionParser.NullLiteralContext ctx) { + return new Value.Expression.Null(); + } + + @Override + public Value.Expression visitOr(BindExpressionParser.OrContext ctx) { + return new Value.Expression.Or(ctx.left.accept(this), ctx.right.accept(this)); + } + + @Override + public Value.Expression visitInvert(BindExpressionParser.InvertContext ctx) { + return new Value.Expression.Invert(ctx.base.accept(this)); + } + + @Override + public Value.Expression visitSubtract(BindExpressionParser.SubtractContext ctx) { + return new Value.Expression.Subtract(ctx.left.accept(this), ctx.right.accept(this)); + } + + @Override + public Value.Expression visitInequality(BindExpressionParser.InequalityContext ctx) { + return new Value.Expression.Inequality(ctx.left.accept(this), ctx.right.accept(this)); + } + + @Override + public Value.Expression visitStringLiteral(BindExpressionParser.StringLiteralContext ctx) { + return new Value.Expression.Str(ctx.getText()); + } + + @Override + public Value.Expression visitNegate(BindExpressionParser.NegateContext ctx) { + return new Value.Expression.Negate(ctx.base.accept(this)); + } + + @Override + public Value.Expression visitVariable(BindExpressionParser.VariableContext ctx) { + return new Value.Expression.Variable(ctx.getText()); + } + + @Override + public Value.Expression visitPropertyRead(BindExpressionParser.PropertyReadContext ctx) { + return new Value.Expression.PropertyRead(ctx.base.accept(this), ctx.property.getText()); + } + + @Override + public Value.Expression visitRemainder(BindExpressionParser.RemainderContext ctx) { + return new Value.Expression.Remainder(ctx.left.accept(this), ctx.right.accept(this)); + } + + @Override + public Value.Expression visitMethodCall(BindExpressionParser.MethodCallContext ctx) { + return new Value.Expression.MethodCall(ctx.base.accept(this), ctx.method.getText(), + ctx.args.stream().map(arg -> arg.accept(this)).toList()); + } +} diff --git a/fx2j-parser/src/main/java/io/github/sheikah45/fx2j/parser/attribute/ControllerAttribute.java b/fx2j-parser/src/main/java/io/github/sheikah45/fx2j/parser/attribute/ControllerAttribute.java index 60e68d0..4b135c5 100644 --- a/fx2j-parser/src/main/java/io/github/sheikah45/fx2j/parser/attribute/ControllerAttribute.java +++ b/fx2j-parser/src/main/java/io/github/sheikah45/fx2j/parser/attribute/ControllerAttribute.java @@ -2,7 +2,7 @@ import io.github.sheikah45.fx2j.parser.utils.StringUtils; -public record ControllerAttribute(String className) implements FxmlAttribute.FxAttribute { +public record ControllerAttribute(String className) implements FxmlAttribute.SpecialAttribute { public ControllerAttribute { if (StringUtils.isNullOrBlank(className)) { throw new IllegalArgumentException("className cannot be blank or null"); diff --git a/fx2j-parser/src/main/java/io/github/sheikah45/fx2j/parser/attribute/FxmlAttribute.java b/fx2j-parser/src/main/java/io/github/sheikah45/fx2j/parser/attribute/FxmlAttribute.java index 271af81..44f194b 100644 --- a/fx2j-parser/src/main/java/io/github/sheikah45/fx2j/parser/attribute/FxmlAttribute.java +++ b/fx2j-parser/src/main/java/io/github/sheikah45/fx2j/parser/attribute/FxmlAttribute.java @@ -2,7 +2,8 @@ public sealed interface FxmlAttribute { - sealed interface FxAttribute extends FxmlAttribute permits ControllerAttribute, IdAttribute {} + sealed interface SpecialAttribute extends FxmlAttribute + permits ControllerAttribute, IdAttribute, NameSpaceAttribute {} sealed interface CommonAttribute extends FxmlAttribute permits EventHandlerAttribute, InstancePropertyAttribute, StaticPropertyAttribute {} diff --git a/fx2j-parser/src/main/java/io/github/sheikah45/fx2j/parser/attribute/IdAttribute.java b/fx2j-parser/src/main/java/io/github/sheikah45/fx2j/parser/attribute/IdAttribute.java index 8fe5584..84234ed 100644 --- a/fx2j-parser/src/main/java/io/github/sheikah45/fx2j/parser/attribute/IdAttribute.java +++ b/fx2j-parser/src/main/java/io/github/sheikah45/fx2j/parser/attribute/IdAttribute.java @@ -2,7 +2,7 @@ import io.github.sheikah45.fx2j.parser.utils.StringUtils; -public record IdAttribute(String value) implements FxmlAttribute.FxAttribute { +public record IdAttribute(String value) implements FxmlAttribute.SpecialAttribute { public IdAttribute { if (StringUtils.isNullOrBlank(value)) { throw new IllegalArgumentException("id cannot be blank or null"); diff --git a/fx2j-parser/src/main/java/io/github/sheikah45/fx2j/parser/attribute/NameSpaceAttribute.java b/fx2j-parser/src/main/java/io/github/sheikah45/fx2j/parser/attribute/NameSpaceAttribute.java new file mode 100644 index 0000000..1f06efe --- /dev/null +++ b/fx2j-parser/src/main/java/io/github/sheikah45/fx2j/parser/attribute/NameSpaceAttribute.java @@ -0,0 +1,15 @@ +package io.github.sheikah45.fx2j.parser.attribute; + +import io.github.sheikah45.fx2j.parser.utils.StringUtils; + +import java.net.URI; +import java.util.Objects; + +public record NameSpaceAttribute(String namespace, URI location) implements FxmlAttribute.SpecialAttribute { + public NameSpaceAttribute { + Objects.requireNonNull(location, "location cannot be null"); + if (StringUtils.isNullOrBlank(namespace)) { + throw new IllegalArgumentException("namespace cannot be blank or null"); + } + } +} diff --git a/fx2j-parser/src/main/java/io/github/sheikah45/fx2j/parser/property/Value.java b/fx2j-parser/src/main/java/io/github/sheikah45/fx2j/parser/property/Value.java index 2730491..760e5a5 100644 --- a/fx2j-parser/src/main/java/io/github/sheikah45/fx2j/parser/property/Value.java +++ b/fx2j-parser/src/main/java/io/github/sheikah45/fx2j/parser/property/Value.java @@ -25,7 +25,6 @@ record Literal(String value) implements Single { } } } - sealed interface Handler extends Value {} record Location(Path value) implements Single { public Location { Objects.requireNonNull(value, "location cannot be null"); @@ -38,22 +37,140 @@ record Resource(String value) implements Single { } } } - record Reference(String value) implements Single, Handler { - public Reference { - if (StringUtils.isNullOrBlank(value)) { - throw new IllegalArgumentException("value cannot be blank or null"); - } - } - } record Element(FxmlElement value) implements Value.Single {} record Attribute(FxmlAttribute.CommonAttribute value) implements Value.Single {} - record Expression(String value) implements Single { - public Expression { - if (StringUtils.isNullOrBlank(value)) { - throw new IllegalArgumentException("value cannot be blank or null"); + sealed interface Expression extends Single { + record PropertyRead(Expression expression, String property) implements Expression { + public PropertyRead { + Objects.requireNonNull(expression, "expression cannot be null"); + if (StringUtils.isNullOrBlank(property)) { + throw new IllegalArgumentException("property cannot be blank or null"); + } + } + } + record MethodCall(Expression expression, String methodName, List args) implements Expression { + public MethodCall { + Objects.requireNonNull(expression, "expression cannot be null"); + Objects.requireNonNull(args, "args cannot be null"); + if (StringUtils.isNullOrBlank(methodName)) { + throw new IllegalArgumentException("methodName cannot be blank or null"); + } } } + record CollectionAccess(Expression expression, Expression key) implements Expression { + public CollectionAccess { + Objects.requireNonNull(expression, "expression cannot be null"); + Objects.requireNonNull(key, "key cannot be null"); + } + } + record Negate(Expression expression) implements Expression { + public Negate { + Objects.requireNonNull(expression, "expression cannot be null"); + } + } + record Invert(Expression expression) implements Expression { + public Invert { + Objects.requireNonNull(expression, "expression cannot be null"); + } + } + record Multiply(Expression left, Expression right) implements Expression { + public Multiply { + Objects.requireNonNull(left, "left cannot be null"); + Objects.requireNonNull(right, "right cannot be null"); + } + } + record Divide(Expression left, Expression right) implements Expression { + public Divide { + Objects.requireNonNull(left, "left cannot be null"); + Objects.requireNonNull(right, "right cannot be null"); + } + } + record Remainder(Expression left, Expression right) implements Expression { + public Remainder { + Objects.requireNonNull(left, "left cannot be null"); + Objects.requireNonNull(right, "right cannot be null"); + } + } + record Add(Expression left, Expression right) implements Expression { + public Add { + Objects.requireNonNull(left, "left cannot be null"); + Objects.requireNonNull(right, "right cannot be null"); + } + } + record Subtract(Expression left, Expression right) implements Expression { + public Subtract { + Objects.requireNonNull(left, "left cannot be null"); + Objects.requireNonNull(right, "right cannot be null"); + } + } + record GreaterThan(Expression left, Expression right) implements Expression { + public GreaterThan { + Objects.requireNonNull(left, "left cannot be null"); + Objects.requireNonNull(right, "right cannot be null"); + } + } + record GreaterThanEqual(Expression left, Expression right) implements Expression { + public GreaterThanEqual { + Objects.requireNonNull(left, "left cannot be null"); + Objects.requireNonNull(right, "right cannot be null"); + } + } + record LessThan(Expression left, Expression right) implements Expression { + public LessThan { + Objects.requireNonNull(left, "left cannot be null"); + Objects.requireNonNull(right, "right cannot be null"); + } + } + record LessThanEqual(Expression left, Expression right) implements Expression { + public LessThanEqual { + Objects.requireNonNull(left, "left cannot be null"); + Objects.requireNonNull(right, "right cannot be null"); + } + } + record Equality(Expression left, Expression right) implements Expression { + public Equality { + Objects.requireNonNull(left, "left cannot be null"); + Objects.requireNonNull(right, "right cannot be null"); + } + } + record Inequality(Expression left, Expression right) implements Expression { + public Inequality { + Objects.requireNonNull(left, "left cannot be null"); + Objects.requireNonNull(right, "right cannot be null"); + } + } + record And(Expression left, Expression right) implements Expression { + public And { + Objects.requireNonNull(left, "left cannot be null"); + Objects.requireNonNull(right, "right cannot be null"); + } + } + record Or(Expression left, Expression right) implements Expression { + public Or { + Objects.requireNonNull(left, "left cannot be null"); + Objects.requireNonNull(right, "right cannot be null"); + } + } + record Variable(String value) implements Expression { + public Variable { + if (StringUtils.isNullOrBlank(value)) { + throw new IllegalArgumentException("value cannot be null or blank"); + } + } + } + record Str(String value) implements Expression { + public Str { + Objects.requireNonNull(value, "left cannot be null"); + } + } + record Whole(long value) implements Expression {} + record Fraction(double value) implements Expression {} + record Null() implements Expression {} + record True() implements Expression {} + record False() implements Expression {} } + + sealed interface Handler extends Value {} record Script(String value) implements Handler { public Script { if (StringUtils.isNullOrBlank(value)) { @@ -68,5 +185,12 @@ record Method(String name) implements Handler { } } } + record Reference(String value) implements Single, Handler { + public Reference { + if (StringUtils.isNullOrBlank(value)) { + throw new IllegalArgumentException("value cannot be blank or null"); + } + } + } record Empty() implements Single, Handler {} } diff --git a/fx2j-parser/src/main/java/module-info.java b/fx2j-parser/src/main/java/module-info.java index 1b2588d..87eabb2 100644 --- a/fx2j-parser/src/main/java/module-info.java +++ b/fx2j-parser/src/main/java/module-info.java @@ -1,5 +1,6 @@ module io.github.sheikah45.fx2j.parser { requires java.xml; + requires org.antlr.antlr4.runtime; exports io.github.sheikah45.fx2j.parser; exports io.github.sheikah45.fx2j.parser.attribute; diff --git a/fx2j-parser/src/test/java/io/github/sheikah45/fx2j/parser/FxmlParserElementTest.java b/fx2j-parser/src/test/java/io/github/sheikah45/fx2j/parser/FxmlParserElementTest.java index 3100871..5745614 100644 --- a/fx2j-parser/src/test/java/io/github/sheikah45/fx2j/parser/FxmlParserElementTest.java +++ b/fx2j-parser/src/test/java/io/github/sheikah45/fx2j/parser/FxmlParserElementTest.java @@ -1,6 +1,7 @@ package io.github.sheikah45.fx2j.parser; import io.github.sheikah45.fx2j.parser.attribute.InstancePropertyAttribute; +import io.github.sheikah45.fx2j.parser.attribute.NameSpaceAttribute; import io.github.sheikah45.fx2j.parser.element.ClassInstanceElement; import io.github.sheikah45.fx2j.parser.element.ConstantElement; import io.github.sheikah45.fx2j.parser.element.CopyElement; @@ -22,6 +23,7 @@ import org.junit.jupiter.api.parallel.Execution; import org.junit.jupiter.api.parallel.ExecutionMode; +import java.net.URI; import java.nio.charset.StandardCharsets; import java.nio.file.Path; import java.util.List; @@ -32,7 +34,13 @@ @Execution(ExecutionMode.CONCURRENT) public class FxmlParserElementTest { - public static final ClassInstanceElement.Content EMPTY_CONTENT = new ClassInstanceElement.Content(List.of(), + private static final NameSpaceAttribute NAME_SPACE_ATTRIBUTE = new NameSpaceAttribute("fx", URI.create( + "http://javafx.com/fxml")); + private static final ClassInstanceElement.Content NAME_SPACE_ONLY_CONTENT = new ClassInstanceElement.Content( + List.of(NAME_SPACE_ATTRIBUTE), + List.of(), + new Value.Empty()); + private static final ClassInstanceElement.Content EMPTY_CONTENT = new ClassInstanceElement.Content(List.of(), List.of(), new Value.Empty()); private static final Path FXML_ROOT = Path.of("src/test/resources/element/valid"); @@ -63,7 +71,8 @@ public void testInclude() { assertEquals(2, children.size()); FxmlElement first = children.getFirst(); - assertEquals(new IncludeElement(Path.of("included1.fxml"), null, StandardCharsets.UTF_8, EMPTY_CONTENT), + assertEquals(new IncludeElement(Path.of("included1.fxml"), null, StandardCharsets.UTF_8, + EMPTY_CONTENT), first); FxmlElement last = children.getLast(); @@ -160,7 +169,7 @@ public void testInstanceProperty() { FxmlComponents fxmlComponents = FxmlParser.readFxml(filePath); DeclarationElement rootNode = fxmlComponents.rootNode(); - assertEquals(new InstanceElement("VBox", new ClassInstanceElement.Content(List.of(), + assertEquals(new InstanceElement("VBox", new ClassInstanceElement.Content(List.of(NAME_SPACE_ATTRIBUTE), List.of(new InstancePropertyElement( "alignment", new Value.Literal( @@ -174,7 +183,8 @@ public void testPropertyText() { FxmlComponents fxmlComponents = FxmlParser.readFxml(filePath); DeclarationElement rootNode = fxmlComponents.rootNode(); - assertEquals(new InstanceElement("Label", new ClassInstanceElement.Content(List.of(), List.of(), + assertEquals( + new InstanceElement("Label", new ClassInstanceElement.Content(List.of(NAME_SPACE_ATTRIBUTE), List.of(), new Value.Literal("test"))), rootNode); } @@ -185,7 +195,7 @@ public void testMultiPropertyText() { FxmlComponents fxmlComponents = FxmlParser.readFxml(filePath); DeclarationElement rootNode = fxmlComponents.rootNode(); - assertEquals(new InstanceElement("Label", new ClassInstanceElement.Content(List.of(), + assertEquals(new InstanceElement("Label", new ClassInstanceElement.Content(List.of(NAME_SPACE_ATTRIBUTE), List.of(new InstancePropertyElement( "alignment", new Value.Literal( @@ -200,7 +210,7 @@ public void testPropertyAttribute() { FxmlComponents fxmlComponents = FxmlParser.readFxml(filePath); DeclarationElement rootNode = fxmlComponents.rootNode(); - assertEquals(new InstanceElement("VBox", new ClassInstanceElement.Content(List.of(), + assertEquals(new InstanceElement("VBox", new ClassInstanceElement.Content(List.of(NAME_SPACE_ATTRIBUTE), List.of(new InstancePropertyElement( "properties", new Value.Attribute( @@ -218,7 +228,7 @@ public void testPropertyElement() { FxmlComponents fxmlComponents = FxmlParser.readFxml(filePath); DeclarationElement rootNode = fxmlComponents.rootNode(); - assertEquals(new InstanceElement("VBox", new ClassInstanceElement.Content(List.of(), + assertEquals(new InstanceElement("VBox", new ClassInstanceElement.Content(List.of(NAME_SPACE_ATTRIBUTE), List.of(new InstancePropertyElement( "children", new Value.Element( @@ -234,7 +244,7 @@ public void testMultiProperty() { FxmlComponents fxmlComponents = FxmlParser.readFxml(filePath); DeclarationElement rootNode = fxmlComponents.rootNode(); - assertEquals(new InstanceElement("VBox", new ClassInstanceElement.Content(List.of(), + assertEquals(new InstanceElement("VBox", new ClassInstanceElement.Content(List.of(NAME_SPACE_ATTRIBUTE), List.of(new InstancePropertyElement( "alignment", new Value.Multi( @@ -258,7 +268,7 @@ public void testEmptyProperty() { FxmlComponents fxmlComponents = FxmlParser.readFxml(filePath); DeclarationElement rootNode = fxmlComponents.rootNode(); - assertEquals(new InstanceElement("VBox", new ClassInstanceElement.Content(List.of(), + assertEquals(new InstanceElement("VBox", new ClassInstanceElement.Content(List.of(NAME_SPACE_ATTRIBUTE), List.of(new InstancePropertyElement( "alignment", new Value.Empty())), @@ -272,7 +282,7 @@ public void testStaticProperty() { FxmlComponents fxmlComponents = FxmlParser.readFxml(filePath); DeclarationElement rootNode = fxmlComponents.rootNode(); - assertEquals(new InstanceElement("VBox", new ClassInstanceElement.Content(List.of(), + assertEquals(new InstanceElement("VBox", new ClassInstanceElement.Content(List.of(NAME_SPACE_ATTRIBUTE), List.of(new StaticPropertyElement( "GridPane", "alignment", new Value.Literal( @@ -286,7 +296,7 @@ public void testQualifiedStaticProperty() { FxmlComponents fxmlComponents = FxmlParser.readFxml(filePath); DeclarationElement rootNode = fxmlComponents.rootNode(); - assertEquals(new InstanceElement("VBox", new ClassInstanceElement.Content(List.of(), + assertEquals(new InstanceElement("VBox", new ClassInstanceElement.Content(List.of(NAME_SPACE_ATTRIBUTE), List.of(new StaticPropertyElement( "javafx.scene.layout.GridPane", "alignment", @@ -301,7 +311,7 @@ public void testRoot() { FxmlComponents fxmlComponents = FxmlParser.readFxml(filePath); DeclarationElement rootNode = fxmlComponents.rootNode(); - assertEquals(new RootElement("javafx.scene.layout.VBox", EMPTY_CONTENT), rootNode); + assertEquals(new RootElement("javafx.scene.layout.VBox", NAME_SPACE_ONLY_CONTENT), rootNode); } @Test @@ -310,7 +320,7 @@ public void testValue() { FxmlComponents fxmlComponents = FxmlParser.readFxml(filePath); DeclarationElement rootNode = fxmlComponents.rootNode(); - assertEquals(new ValueElement("Double", new Value.Literal("1"), EMPTY_CONTENT), rootNode); + assertEquals(new ValueElement("Double", new Value.Literal("1"), NAME_SPACE_ONLY_CONTENT), rootNode); } @Test @@ -319,7 +329,7 @@ public void testConstant() { FxmlComponents fxmlComponents = FxmlParser.readFxml(filePath); DeclarationElement rootNode = fxmlComponents.rootNode(); - assertEquals(new ConstantElement("Double", "NEGATIVE_INFINITY", EMPTY_CONTENT), rootNode); + assertEquals(new ConstantElement("Double", "NEGATIVE_INFINITY", NAME_SPACE_ONLY_CONTENT), rootNode); } @Test @@ -328,6 +338,6 @@ public void testFactory() { FxmlComponents fxmlComponents = FxmlParser.readFxml(filePath); DeclarationElement rootNode = fxmlComponents.rootNode(); - assertEquals(new FactoryElement("List", "of", EMPTY_CONTENT), rootNode); + assertEquals(new FactoryElement("List", "of", NAME_SPACE_ONLY_CONTENT), rootNode); } } \ No newline at end of file diff --git a/fx2j-parser/src/test/java/io/github/sheikah45/fx2j/parser/FxmlParserPropertyTest.java b/fx2j-parser/src/test/java/io/github/sheikah45/fx2j/parser/FxmlParserPropertyTest.java index 16d8dc1..b030208 100644 --- a/fx2j-parser/src/test/java/io/github/sheikah45/fx2j/parser/FxmlParserPropertyTest.java +++ b/fx2j-parser/src/test/java/io/github/sheikah45/fx2j/parser/FxmlParserPropertyTest.java @@ -5,6 +5,7 @@ import io.github.sheikah45.fx2j.parser.attribute.FxmlAttribute; import io.github.sheikah45.fx2j.parser.attribute.IdAttribute; import io.github.sheikah45.fx2j.parser.attribute.InstancePropertyAttribute; +import io.github.sheikah45.fx2j.parser.attribute.NameSpaceAttribute; import io.github.sheikah45.fx2j.parser.attribute.StaticPropertyAttribute; import io.github.sheikah45.fx2j.parser.element.DeclarationElement; import io.github.sheikah45.fx2j.parser.property.Value; @@ -12,6 +13,7 @@ import org.junit.jupiter.api.parallel.Execution; import org.junit.jupiter.api.parallel.ExecutionMode; +import java.net.URI; import java.nio.file.Path; import java.util.List; @@ -22,6 +24,8 @@ public class FxmlParserPropertyTest { private static final Path FXML_ROOT = Path.of("src/test/resources/property"); + private static final NameSpaceAttribute NAME_SPACE_ATTRIBUTE = new NameSpaceAttribute("fx", URI.create( + "http://javafx.com/fxml")); @Test public void testIdProperty() { @@ -31,7 +35,7 @@ public void testIdProperty() { DeclarationElement rootNode = fxmlComponents.rootNode(); List attributes = rootNode.content().attributes(); - assertEquals(List.of(new IdAttribute("box")), attributes); + assertEquals(List.of(new IdAttribute("box"), NAME_SPACE_ATTRIBUTE), attributes); } @Test @@ -42,7 +46,9 @@ public void testControllerProperty() { DeclarationElement rootNode = fxmlComponents.rootNode(); List attributes = rootNode.content().attributes(); - assertEquals(List.of(new ControllerAttribute("io.github.sheikah45.fx2j.parser.FxmlParser")), attributes); + assertEquals( + List.of(new ControllerAttribute("io.github.sheikah45.fx2j.parser.FxmlParser"), NAME_SPACE_ATTRIBUTE), + attributes); } @Test @@ -53,7 +59,8 @@ public void testInstanceProperty() { DeclarationElement rootNode = fxmlComponents.rootNode(); List attributes = rootNode.content().attributes(); - assertEquals(List.of(new InstancePropertyAttribute("alignment", new Value.Literal("TOP_RIGHT"))), attributes); + assertEquals(List.of(new InstancePropertyAttribute("alignment", new Value.Literal("TOP_RIGHT")), + NAME_SPACE_ATTRIBUTE), attributes); } @Test @@ -64,7 +71,8 @@ public void testStaticProperty() { DeclarationElement rootNode = fxmlComponents.rootNode(); List attributes = rootNode.content().attributes(); - assertEquals(List.of(new StaticPropertyAttribute("GridPane", "alignment", new Value.Literal("TOP_RIGHT"))), + assertEquals(List.of(new StaticPropertyAttribute("GridPane", "alignment", new Value.Literal("TOP_RIGHT")), + NAME_SPACE_ATTRIBUTE), attributes); } @@ -77,7 +85,8 @@ public void testQualifiedStaticProperty() { List attributes = rootNode.content().attributes(); assertEquals(List.of(new StaticPropertyAttribute("javafx.scene.layout.GridPane", "alignment", - new Value.Literal("TOP_RIGHT"))), attributes); + new Value.Literal("TOP_RIGHT")), NAME_SPACE_ATTRIBUTE), + attributes); } @Test @@ -90,7 +99,7 @@ public void testEventHandlerProperty() { List attributes = rootNode.content().attributes(); assertEquals( List.of(new EventHandlerAttribute("onScroll", new Value.Handler.Script( - "java.lang.System.out.println('scrolled')"))), + "java.lang.System.out.println('scrolled')")), NAME_SPACE_ATTRIBUTE), attributes); } @@ -102,7 +111,8 @@ public void testEmptyProperty() { DeclarationElement rootNode = fxmlComponents.rootNode(); List attributes = rootNode.content().attributes(); - assertEquals(List.of(new InstancePropertyAttribute("text", new Value.Empty())), attributes); + assertEquals(List.of(new InstancePropertyAttribute("text", new Value.Empty()), NAME_SPACE_ATTRIBUTE), + attributes); } @Test @@ -113,7 +123,8 @@ public void testLocationProperty() { DeclarationElement rootNode = fxmlComponents.rootNode(); List attributes = rootNode.content().attributes(); - assertEquals(List.of(new InstancePropertyAttribute("url", new Value.Location(Path.of("test.png")))), + assertEquals(List.of(new InstancePropertyAttribute("url", new Value.Location(Path.of("test.png"))), + NAME_SPACE_ATTRIBUTE), attributes); } @@ -125,7 +136,8 @@ public void testResourceProperty() { DeclarationElement rootNode = fxmlComponents.rootNode(); List attributes = rootNode.content().attributes(); - assertEquals(List.of(new InstancePropertyAttribute("text", new Value.Resource("test"))), attributes); + assertEquals(List.of(new InstancePropertyAttribute("text", new Value.Resource("test")), NAME_SPACE_ATTRIBUTE), + attributes); } @Test @@ -136,7 +148,8 @@ public void testReferenceProperty() { DeclarationElement rootNode = fxmlComponents.rootNode(); List attributes = rootNode.content().attributes(); - assertEquals(List.of(new InstancePropertyAttribute("text", new Value.Reference("test"))), attributes); + assertEquals(List.of(new InstancePropertyAttribute("text", new Value.Reference("test")), NAME_SPACE_ATTRIBUTE), + attributes); } @Test @@ -147,7 +160,8 @@ public void testEscapeProperty() { DeclarationElement rootNode = fxmlComponents.rootNode(); List attributes = rootNode.content().attributes(); - assertEquals(List.of(new InstancePropertyAttribute("text", new Value.Literal("$test"))), attributes); + assertEquals(List.of(new InstancePropertyAttribute("text", new Value.Literal("$test")), NAME_SPACE_ATTRIBUTE), + attributes); } @Test @@ -158,7 +172,27 @@ public void testExpressionProperty() { DeclarationElement rootNode = fxmlComponents.rootNode(); List attributes = rootNode.content().attributes(); - assertEquals(List.of(new InstancePropertyAttribute("text", new Value.Expression("test.text"))), attributes); + assertEquals(List.of(new InstancePropertyAttribute("text", new Value.Expression.PropertyRead( + new Value.Expression.Variable("test"), "text")), NAME_SPACE_ATTRIBUTE), attributes); + } + + @Test + public void testComplexExpressionProperty() { + Path filePath = FXML_ROOT.resolve("complex-expression.fxml"); + FxmlComponents fxmlComponents = FxmlParser.readFxml(filePath); + + DeclarationElement rootNode = fxmlComponents.rootNode(); + + List attributes = rootNode.content().attributes(); + assertEquals(List.of(new InstancePropertyAttribute("width", new Value.Expression.Add(new Value.Expression.Add( + new Value.Expression.PropertyRead( + new Value.Expression.PropertyRead(new Value.Expression.Variable("test"), "text"), "length"), + new Value.Expression.Multiply( + new Value.Expression.PropertyRead(new Value.Expression.Variable("test"), "width"), + new Value.Expression.PropertyRead(new Value.Expression.Variable("root"), "margin"))), + new Value.Expression.Whole( + 10))), + NAME_SPACE_ATTRIBUTE), attributes); } @Test @@ -169,7 +203,20 @@ public void testReferenceHandlerProperty() { DeclarationElement rootNode = fxmlComponents.rootNode(); List attributes = rootNode.content().attributes(); - assertEquals(List.of(new EventHandlerAttribute("onScroll", new Value.Handler.Reference("scroller"))), + assertEquals(List.of(new EventHandlerAttribute("onScroll", new Value.Handler.Reference("scroller")), + NAME_SPACE_ATTRIBUTE), + attributes); + } + + @Test + public void testEmptyHandlerProperty() { + Path filePath = FXML_ROOT.resolve("event-handler-empty.fxml"); + FxmlComponents fxmlComponents = FxmlParser.readFxml(filePath); + + DeclarationElement rootNode = fxmlComponents.rootNode(); + + List attributes = rootNode.content().attributes(); + assertEquals(List.of(new EventHandlerAttribute("onScroll", new Value.Handler.Empty()), NAME_SPACE_ATTRIBUTE), attributes); } @@ -181,6 +228,7 @@ public void testMethodProperty() { DeclarationElement rootNode = fxmlComponents.rootNode(); List attributes = rootNode.content().attributes(); - assertEquals(List.of(new EventHandlerAttribute("onScroll", new Value.Handler.Method("scroll"))), attributes); + assertEquals(List.of(new EventHandlerAttribute("onScroll", new Value.Handler.Method("scroll")), + NAME_SPACE_ATTRIBUTE), attributes); } } \ No newline at end of file diff --git a/fx2j-parser/src/test/resources/property/complex-expression.fxml b/fx2j-parser/src/test/resources/property/complex-expression.fxml new file mode 100644 index 0000000..1e14458 --- /dev/null +++ b/fx2j-parser/src/test/resources/property/complex-expression.fxml @@ -0,0 +1,2 @@ + +