diff --git a/src/main/java/dk/camelot64/kickc/parser/ExpressionParser.java b/src/main/java/dk/camelot64/kickc/parser/ExpressionParser.java new file mode 100644 index 000000000..a94a09d71 --- /dev/null +++ b/src/main/java/dk/camelot64/kickc/parser/ExpressionParser.java @@ -0,0 +1,35 @@ +package dk.camelot64.kickc.parser; + +import dk.camelot64.kickc.model.CompileError; +import org.antlr.v4.runtime.*; + + +/** + * Parser for C-expressions. + *
+ * Used by #if in the preprocessor
+ */
+public class ExpressionParser {
+
+ /**
+ * Parse an expression
+ *
+ * @param tokenSource The tokens to parse
+ * @return The parsed expression
+ */
+ public static KickCParser.ExprContext parseExpression(TokenSource tokenSource) {
+ CParser cParser = new CParser(null);
+ KickCParser kickCParser = new KickCParser(new CommonTokenStream(tokenSource), cParser);
+ kickCParser.addErrorListener(new BaseErrorListener() {
+ @Override
+ public void syntaxError(Recognizer, ?> recognizer, Object offendingSymbol, int line, int charPositionInLine, String msg, RecognitionException e) {
+ //StatementSource subSource =
+ // new StatementSource(source.getFileName(), source.getLineNumber() + line, source.getCode(), source.getStartIndex(), source.getStopIndex());
+ throw new CompileError("Error parsing expression " + msg);
+ }
+ });
+ kickCParser.setBuildParseTree(true);
+ return kickCParser.expr();
+ }
+
+}
diff --git a/src/test/java/dk/camelot64/kickc/parsing/TestExpressionParser.java b/src/test/java/dk/camelot64/kickc/parsing/TestExpressionParser.java
new file mode 100644
index 000000000..14c6c8409
--- /dev/null
+++ b/src/test/java/dk/camelot64/kickc/parsing/TestExpressionParser.java
@@ -0,0 +1,73 @@
+package dk.camelot64.kickc.parsing;
+
+import dk.camelot64.kickc.parser.*;
+import junit.framework.TestCase;
+import org.antlr.v4.runtime.CharStreams;
+import org.antlr.v4.runtime.CodePointCharStream;
+import org.antlr.v4.runtime.tree.TerminalNode;
+import org.junit.Test;
+
+import java.io.IOException;
+import java.net.URISyntaxException;
+
+public class TestExpressionParser {
+
+ /**
+ * Test the ExpressionParser
+ */
+ @Test
+ public void testExpressionParser() {
+ assertExpression("1", "1");
+ assertExpression("1+1", "+(1,1)");
+ assertExpression("1+1*-2", "+(1,*(1,-(2)))");
+ assertExpression("(1+1)*2", "*([+(1,1)],2)");
+ assertExpression("FIELDS*2