summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbjculkin <bjculkin@BECK-DZ9BJB2.wvu-ad.wvu.edu>2018-03-28 15:24:14 -0400
committerbjculkin <bjculkin@BECK-DZ9BJB2.wvu-ad.wvu.edu>2018-03-28 15:24:14 -0400
commit476a823a0d2d1c92b8a35d21406f7cf6a4c54d0d (patch)
tree584627a5651ccea68e11c79320ca98f8f75d2e44
parent8e87516a302172c02db36f2e26137c397a235d48 (diff)
More AST work
-rw-r--r--JPratt/src/examples/java/bjc/pratt/examples/lang/LeafConverter.java3
-rw-r--r--JPratt/src/examples/java/bjc/pratt/examples/lang/PrattParserTest.java40
-rw-r--r--JPratt/src/examples/java/bjc/pratt/examples/lang/ast/DoubleAST.java48
-rw-r--r--JPratt/src/examples/java/bjc/pratt/examples/lang/ast/LangAST.java2
-rw-r--r--JPratt/src/examples/java/bjc/pratt/examples/lang/ast/LiteralAST.java12
-rw-r--r--JPratt/src/examples/java/bjc/pratt/examples/lang/ast/OperatorAST.java1
6 files changed, 79 insertions, 27 deletions
diff --git a/JPratt/src/examples/java/bjc/pratt/examples/lang/LeafConverter.java b/JPratt/src/examples/java/bjc/pratt/examples/lang/LeafConverter.java
index 94df050..96bc3ae 100644
--- a/JPratt/src/examples/java/bjc/pratt/examples/lang/LeafConverter.java
+++ b/JPratt/src/examples/java/bjc/pratt/examples/lang/LeafConverter.java
@@ -3,12 +3,11 @@ package bjc.pratt.examples.lang;
import java.util.function.Function;
import bjc.pratt.examples.lang.ast.LangAST;
-import bjc.pratt.examples.lang.ast.LiteralAST;
import bjc.pratt.tokens.Token;
final class LeafConverter implements Function<Token<String, String>, LangAST> {
@Override
public LangAST apply(Token<String, String> leaf) {
- return LiteralAST.fromToken(leaf.getValue());
+ return LangAST.fromToken(leaf);
}
} \ No newline at end of file
diff --git a/JPratt/src/examples/java/bjc/pratt/examples/lang/PrattParserTest.java b/JPratt/src/examples/java/bjc/pratt/examples/lang/PrattParserTest.java
index 91d5b26..6191f05 100644
--- a/JPratt/src/examples/java/bjc/pratt/examples/lang/PrattParserTest.java
+++ b/JPratt/src/examples/java/bjc/pratt/examples/lang/PrattParserTest.java
@@ -40,17 +40,16 @@ import bjc.utils.parserutils.splitter.TokenSplitter;
*
*/
public class PrattParserTest {
- /**
- * Main method.
- *
- * @param args
- * Unused CLI arguments.
- */
- public static void main(final String[] args) {
+ public final static Set<String> ops;
+ public final static Set<String> reserved;
+
+ static {
/*
+ * Setup operator hash.
+ *
* Use a linked hash set to preserve insertion order.
*/
- final Set<String> ops = new LinkedHashSet<>();
+ ops = new LinkedHashSet<>();
ops.add("!!!");
@@ -70,11 +69,8 @@ public class PrattParserTest {
ops.addAll(Arrays.asList("(", ")"));
ops.addAll(Arrays.asList("[", "]"));
ops.addAll(Arrays.asList("{", "}"));
-
- /*
- * Reserved words that represent themselves, not literals.
- */
- final Set<String> reserved = new LinkedHashSet<>();
+
+ reserved = new LinkedHashSet<>();
reserved.addAll(Arrays.asList("if", "then", "else"));
reserved.addAll(Arrays.asList("and", "or"));
reserved.addAll(Arrays.asList("begin", "end"));
@@ -82,7 +78,14 @@ public class PrattParserTest {
reserved.addAll(Arrays.asList("sqrt", "cbrt", "root"));
reserved.addAll(Arrays.asList("try", "throw", "catch", "finally"));
reserved.add("var");
-
+ }
+ /**
+ * Main method.
+ *
+ * @param args
+ * Unused CLI arguments.
+ */
+ public static void main(final String[] args) {
final ConfigurableTokenSplitter lo = new ConfigurableTokenSplitter(true);
lo.addSimpleDelimiters(":=");
@@ -122,7 +125,7 @@ public class PrattParserTest {
String ln = scn.nextLine();
while (!ln.trim().equals("")) {
- final Iterator<Token<String, String>> tokens = preprocessInput(ops, filtered, ln, reserved, ctx);
+ final Iterator<Token<String, String>> tokens = preprocessInput(ops, reserved, filtered, ln, ctx);
try {
final StringTokenStream tokenStream = new StringTokenStream(tokens);
@@ -140,8 +143,9 @@ public class PrattParserTest {
System.out.printf("\nParsed expression:\n%s", rawTree);
- final Object ast = rawTree.collapse(new LeafConverter(), new NodeCollapser(), ID.id());
+ final LangAST ast = rawTree.collapse(new LeafConverter(), new NodeCollapser(), ID.id());
+ // Remove this once we have LangAST all done.
final ITree<LangAST> tokenTree = rawTree.rebuildTree(LangAST::fromToken, LangAST::fromToken);
System.out.printf("\nAST-ized expression:\n%s\nNEW:\n%s", tokenTree, ast);
@@ -159,8 +163,8 @@ public class PrattParserTest {
scn.close();
}
- private static Iterator<Token<String, String>> preprocessInput(final Set<String> ops, final TokenSplitter split,
- final String ln, final Set<String> reserved, final TestContext ctx) {
+ private static Iterator<Token<String, String>> preprocessInput(final Set<String> ops, final Set<String> reserved,
+ final TokenSplitter split, final String ln, final TestContext ctx) {
final String[] rawTokens = ln.split("\\s+");
final List<String> splitTokens = new LinkedList<>();
diff --git a/JPratt/src/examples/java/bjc/pratt/examples/lang/ast/DoubleAST.java b/JPratt/src/examples/java/bjc/pratt/examples/lang/ast/DoubleAST.java
new file mode 100644
index 0000000..6c74566
--- /dev/null
+++ b/JPratt/src/examples/java/bjc/pratt/examples/lang/ast/DoubleAST.java
@@ -0,0 +1,48 @@
+package bjc.pratt.examples.lang.ast;
+
+import bjc.pratt.examples.lang.evaluator.LangResult;
+
+public class DoubleAST extends LiteralAST {
+ public final double value;
+
+ public DoubleAST(double vl) {
+ super(LiteralType.DOUBLE);
+
+ value = vl;
+ }
+
+ @Override
+ public LangResult toResult() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = super.hashCode();
+ long temp;
+ temp = Double.doubleToLongBits(value);
+ result = prime * result + (int) (temp ^ (temp >>> 32));
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (!super.equals(obj))
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ DoubleAST other = (DoubleAST) obj;
+ if (Double.doubleToLongBits(value) != Double.doubleToLongBits(other.value))
+ return false;
+ return true;
+ }
+
+ @Override
+ public String toString() {
+ return "DoubleAST [value=" + value + "]";
+ }
+}
diff --git a/JPratt/src/examples/java/bjc/pratt/examples/lang/ast/LangAST.java b/JPratt/src/examples/java/bjc/pratt/examples/lang/ast/LangAST.java
index cffde91..7d35b61 100644
--- a/JPratt/src/examples/java/bjc/pratt/examples/lang/ast/LangAST.java
+++ b/JPratt/src/examples/java/bjc/pratt/examples/lang/ast/LangAST.java
@@ -47,8 +47,6 @@ public abstract class LangAST {
default:
String msg = String.format("Unknown token type '%s'", key);
- // @TODO uncomment this later
- //throw new EvaluatorException(msg);
return new StringAST("RAW: " + token.toString());
}
}
diff --git a/JPratt/src/examples/java/bjc/pratt/examples/lang/ast/LiteralAST.java b/JPratt/src/examples/java/bjc/pratt/examples/lang/ast/LiteralAST.java
index 832a0e3..70735c5 100644
--- a/JPratt/src/examples/java/bjc/pratt/examples/lang/ast/LiteralAST.java
+++ b/JPratt/src/examples/java/bjc/pratt/examples/lang/ast/LiteralAST.java
@@ -1,7 +1,7 @@
package bjc.pratt.examples.lang.ast;
-import bjc.pratt.tokens.Token;
import bjc.utils.data.TopDownTransformResult;
+import bjc.utils.parserutils.TokenUtils;
/**
* AST node for a literal.
@@ -11,7 +11,7 @@ import bjc.utils.data.TopDownTransformResult;
*/
public abstract class LiteralAST extends LangAST {
public static enum LiteralType {
- INTEGER, STRING, BOOLEAN
+ INTEGER, STRING, BOOLEAN, DOUBLE
}
public final LiteralType type;
@@ -29,12 +29,14 @@ public abstract class LiteralAST extends LangAST {
* @return The AST for the token.
*/
public static LiteralAST fromToken(String tok) {
- if(tok.matches("[+-]?\\d+")) {
- return new IntegerAST(Integer.parseInt(tok));
- } else if(tok.equalsIgnoreCase("true")) {
+ if(tok.equalsIgnoreCase("true")) {
return new BooleanAST(true);
} else if(tok.equalsIgnoreCase("false")) {
return new BooleanAST(false);
+ } else if(tok.matches("[+-]?\\d+")) {
+ return new IntegerAST(Integer.parseInt(tok));
+ } else if(TokenUtils.isDouble(tok)) {
+ return new DoubleAST(Double.parseDouble(tok));
}
return new StringAST("RAW: " + tok);
diff --git a/JPratt/src/examples/java/bjc/pratt/examples/lang/ast/OperatorAST.java b/JPratt/src/examples/java/bjc/pratt/examples/lang/ast/OperatorAST.java
index 036f8bd..19ae088 100644
--- a/JPratt/src/examples/java/bjc/pratt/examples/lang/ast/OperatorAST.java
+++ b/JPratt/src/examples/java/bjc/pratt/examples/lang/ast/OperatorAST.java
@@ -22,6 +22,7 @@ public abstract class OperatorAST extends LangAST {
return null;
}
+
@Override
public LangResult toResult() {
// TODO Auto-generated method stub