From 476a823a0d2d1c92b8a35d21406f7cf6a4c54d0d Mon Sep 17 00:00:00 2001 From: bjculkin Date: Wed, 28 Mar 2018 15:24:14 -0400 Subject: More AST work --- .../bjc/pratt/examples/lang/LeafConverter.java | 3 +- .../bjc/pratt/examples/lang/PrattParserTest.java | 40 ++++++++++-------- .../bjc/pratt/examples/lang/ast/DoubleAST.java | 48 ++++++++++++++++++++++ .../java/bjc/pratt/examples/lang/ast/LangAST.java | 2 - .../bjc/pratt/examples/lang/ast/LiteralAST.java | 12 +++--- .../bjc/pratt/examples/lang/ast/OperatorAST.java | 1 + 6 files changed, 79 insertions(+), 27 deletions(-) create mode 100644 JPratt/src/examples/java/bjc/pratt/examples/lang/ast/DoubleAST.java (limited to 'JPratt/src/examples/java/bjc') 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, LangAST> { @Override public LangAST apply(Token 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 ops; + public final static Set reserved; + + static { /* + * Setup operator hash. + * * Use a linked hash set to preserve insertion order. */ - final Set 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 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> tokens = preprocessInput(ops, filtered, ln, reserved, ctx); + final Iterator> 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 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> preprocessInput(final Set ops, final TokenSplitter split, - final String ln, final Set reserved, final TestContext ctx) { + private static Iterator> preprocessInput(final Set ops, final Set reserved, + final TokenSplitter split, final String ln, final TestContext ctx) { final String[] rawTokens = ln.split("\\s+"); final List 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 -- cgit v1.2.3