diff options
| author | bjculkin <bjculkin@BECK-DZ9BJB2.wvu-ad.wvu.edu> | 2018-03-28 15:24:14 -0400 |
|---|---|---|
| committer | bjculkin <bjculkin@BECK-DZ9BJB2.wvu-ad.wvu.edu> | 2018-03-28 15:24:14 -0400 |
| commit | 476a823a0d2d1c92b8a35d21406f7cf6a4c54d0d (patch) | |
| tree | 584627a5651ccea68e11c79320ca98f8f75d2e44 | |
| parent | 8e87516a302172c02db36f2e26137c397a235d48 (diff) | |
More AST work
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 |
