From b61c66d5e0c18faee68eb91881d5dfe760818856 Mon Sep 17 00:00:00 2001 From: bjculkin Date: Wed, 5 Apr 2017 15:32:34 -0400 Subject: Update examples --- .../bjc/utils/examples/parsing/AssignCommand.java | 4 +- .../bjc/utils/examples/parsing/BlockEnter.java | 22 ++++ .../java/bjc/utils/examples/parsing/BlockExit.java | 14 +++ .../utils/examples/parsing/PrattParserTest.java | 86 ++++---------- .../java/bjc/utils/examples/parsing/ShuntTest.java | 37 ------ .../java/bjc/utils/examples/parsing/Tokenizer.java | 32 +++++ .../utils/examples/parsing/TreeConstructTest.java | 129 --------------------- .../java/bjc/utils/examples/parsing/test.tree | 13 --- 8 files changed, 91 insertions(+), 246 deletions(-) create mode 100644 JPratt/src/examples/java/bjc/utils/examples/parsing/BlockEnter.java create mode 100644 JPratt/src/examples/java/bjc/utils/examples/parsing/BlockExit.java delete mode 100644 JPratt/src/examples/java/bjc/utils/examples/parsing/ShuntTest.java create mode 100644 JPratt/src/examples/java/bjc/utils/examples/parsing/Tokenizer.java delete mode 100644 JPratt/src/examples/java/bjc/utils/examples/parsing/TreeConstructTest.java delete mode 100644 JPratt/src/examples/java/bjc/utils/examples/parsing/test.tree diff --git a/JPratt/src/examples/java/bjc/utils/examples/parsing/AssignCommand.java b/JPratt/src/examples/java/bjc/utils/examples/parsing/AssignCommand.java index d743c21..4bdd60f 100644 --- a/JPratt/src/examples/java/bjc/utils/examples/parsing/AssignCommand.java +++ b/JPratt/src/examples/java/bjc/utils/examples/parsing/AssignCommand.java @@ -9,8 +9,8 @@ import bjc.utils.parserutils.pratt.commands.NonBinaryCommand; import bjc.utils.parserutils.pratt.tokens.StringToken; class AssignCommand extends NonBinaryCommand { - public AssignCommand() { - super(10); + public AssignCommand(int prec) { + super(prec); } @Override diff --git a/JPratt/src/examples/java/bjc/utils/examples/parsing/BlockEnter.java b/JPratt/src/examples/java/bjc/utils/examples/parsing/BlockEnter.java new file mode 100644 index 0000000..ac04720 --- /dev/null +++ b/JPratt/src/examples/java/bjc/utils/examples/parsing/BlockEnter.java @@ -0,0 +1,22 @@ +package bjc.utils.examples.parsing; + +import bjc.utils.data.ITree; +import bjc.utils.esodata.Directory; +import bjc.utils.parserutils.pratt.Token; + +import java.util.function.UnaryOperator; + +final class BlockEnter implements UnaryOperator { + @Override + public TestContext apply(TestContext state) { + Directory>> enclosing = state.scopes.top(); + int currBlockNumber = state.blockCount.pop(); + + state.scopes.push(enclosing.newSubdirectory("block" + currBlockNumber)); + + state.blockCount.push(currBlockNumber + 1); + state.blockCount.push(0); + + return state; + } +} \ No newline at end of file diff --git a/JPratt/src/examples/java/bjc/utils/examples/parsing/BlockExit.java b/JPratt/src/examples/java/bjc/utils/examples/parsing/BlockExit.java new file mode 100644 index 0000000..b067464 --- /dev/null +++ b/JPratt/src/examples/java/bjc/utils/examples/parsing/BlockExit.java @@ -0,0 +1,14 @@ +package bjc.utils.examples.parsing; + +import java.util.function.UnaryOperator; + +final class BlockExit implements UnaryOperator { + @Override + public TestContext apply(TestContext state) { + state.scopes.pop(); + + state.blockCount.pop(); + + return state; + } +} \ No newline at end of file diff --git a/JPratt/src/examples/java/bjc/utils/examples/parsing/PrattParserTest.java b/JPratt/src/examples/java/bjc/utils/examples/parsing/PrattParserTest.java index 522bf6f..2cc53b0 100644 --- a/JPratt/src/examples/java/bjc/utils/examples/parsing/PrattParserTest.java +++ b/JPratt/src/examples/java/bjc/utils/examples/parsing/PrattParserTest.java @@ -2,7 +2,6 @@ package bjc.utils.examples.parsing; import bjc.utils.data.ITree; import bjc.utils.data.TransformIterator; -import bjc.utils.esodata.Directory; import bjc.utils.parserutils.ParserException; import bjc.utils.parserutils.pratt.InitialCommand; import bjc.utils.parserutils.pratt.NonInitialCommand; @@ -21,7 +20,6 @@ import java.util.LinkedList; import java.util.List; import java.util.Scanner; import java.util.Set; -import java.util.function.Function; import java.util.function.UnaryOperator; import static bjc.utils.parserutils.pratt.commands.NonInitialCommands.*; @@ -38,55 +36,6 @@ import static bjc.utils.functypes.ID.id; * */ public class PrattParserTest { - private static final class Tokenizer implements Function> { - private Set ops; - private Set reserved; - private TestContext ctx; - - public Tokenizer(Set operators, Set reservedWords, TestContext context) { - ops = operators; - reserved = reservedWords; - ctx = context; - } - - @Override - public Token apply(String strang) { - if (ops.contains(strang) || reserved.contains(strang)) { - return litToken(strang); - } else if (ctx.scopes.top().containsKey(strang)) { - return new StringToken("(vref)", strang); - } else { - return new StringToken("(literal)", strang); - } - } - } - - private static final class BlockExit implements UnaryOperator { - @Override - public TestContext apply(TestContext state) { - state.scopes.pop(); - - state.blockCount.pop(); - - return state; - } - } - - private static final class BlockEnter implements UnaryOperator { - @Override - public TestContext apply(TestContext state) { - Directory>> enclosing = state.scopes.top(); - int currBlockNumber = state.blockCount.pop(); - - state.scopes.push(enclosing.newSubdirectory("block" + currBlockNumber)); - - state.blockCount.push(currBlockNumber + 1); - state.blockCount.push(0); - - return state; - } - } - /** * Main method. * @@ -99,6 +48,7 @@ public class PrattParserTest { */ Set ops = new LinkedHashSet<>(); + ops.addAll(Arrays.asList("->")); ops.add(":="); ops.addAll(Arrays.asList("||", "&&")); ops.addAll(Arrays.asList("<=", ">=")); @@ -119,10 +69,12 @@ public class PrattParserTest { reserved.addAll(Arrays.asList("and", "or")); reserved.addAll(Arrays.asList("begin", "end")); reserved.addAll(Arrays.asList("switch", "case")); + reserved.addAll(Arrays.asList("sqrt", "cbrt", "root")); reserved.add("var"); TwoLevelSplitter split = new TwoLevelSplitter(); + split.addCompoundDelim("->"); split.addCompoundDelim(":="); split.addCompoundDelim("||", "&&"); split.addCompoundDelim("<=", ">="); @@ -149,7 +101,7 @@ public class PrattParserTest { System.out.print("Enter a command (blank line to exit): "); String ln = scn.nextLine(); - while (!ln.trim().equals("")) { + while(!ln.trim().equals("")) { Iterator> tokens = preprocessInput(ops, split, ln, reserved, ctx); try { @@ -162,21 +114,21 @@ public class PrattParserTest { ITree> tree = parser.parseExpression(0, tokenStream, ctx, true); - if (!tokenStream.headIs("(end)")) { - System.out.println("Multiple expressions on line"); + if(!tokenStream.headIs("(end)")) { + System.out.println("\nMultiple expressions on line"); } - System.out.println("Parsed expression:\n" + tree); - } catch (ParserException pex) { + System.out.println("\nParsed expression:\n" + tree); + } catch(ParserException pex) { pex.printStackTrace(); } - System.out.print("Enter a command (blank line to exit): "); + System.out.print("\nEnter a command (blank line to exit): "); ln = scn.nextLine(); } System.out.println(); - System.out.println("Context is: " + ctx); + System.out.println("\nContext is: " + ctx); scn.close(); } @@ -187,17 +139,17 @@ public class PrattParserTest { List splitTokens = new LinkedList<>(); - for (String raw : rawTokens) { + for(String raw : rawTokens) { boolean doSplit = false; - for (String op : ops) { - if (raw.contains(op)) { + for(String op : ops) { + if(raw.contains(op)) { doSplit = true; break; } } - if (doSplit) { + if(doSplit) { String[] strangs = split.split(raw); splitTokens.addAll(Arrays.asList(strangs)); @@ -206,7 +158,7 @@ public class PrattParserTest { } } - System.out.println("Split string: " + splitTokens); + System.out.println("\nSplit string: " + splitTokens); Iterator source = splitTokens.iterator(); @@ -238,8 +190,10 @@ public class PrattParserTest { parser.addNonInitialCommand("if", ternary(5, 0, "else", litToken("cond"), false)); - parser.addNonInitialCommand(":=", new AssignCommand()); + parser.addNonInitialCommand(":=", new AssignCommand(10)); + parser.addNonInitialCommand("->", infixRight(11)); + NonInitialCommand nonSSRelJoin = infixLeft(13); parser.addNonInitialCommand("and", nonSSRelJoin); parser.addNonInitialCommand("or", nonSSRelJoin); @@ -265,7 +219,9 @@ public class PrattParserTest { parser.addNonInitialCommand("!", postfix(40)); - parser.addNonInitialCommand("^", infixRight(50)); + NonInitialCommand expon = infixRight(50); + parser.addNonInitialCommand("^", expon); + parser.addNonInitialCommand("root", expon); parser.addNonInitialCommand(".", infixLeft(60)); diff --git a/JPratt/src/examples/java/bjc/utils/examples/parsing/ShuntTest.java b/JPratt/src/examples/java/bjc/utils/examples/parsing/ShuntTest.java deleted file mode 100644 index 5f84d6b..0000000 --- a/JPratt/src/examples/java/bjc/utils/examples/parsing/ShuntTest.java +++ /dev/null @@ -1,37 +0,0 @@ -package bjc.utils.examples.parsing; - -import bjc.utils.funcdata.FunctionalStringTokenizer; -import bjc.utils.funcdata.IList; -import bjc.utils.parserutils.ShuntingYard; - -import java.util.Scanner; - -/** - * Test of shunting yard - * - * @author ben - * - */ -public class ShuntTest { - /** - * Main method - * - * @param args - * Unused CLI args - */ - public static void main(String[] args) { - Scanner inputSource = new Scanner(System.in); - - System.out.print("Enter a expression to shunt: "); - String line = inputSource.nextLine(); - - ShuntingYard yard = new ShuntingYard<>(true); - - IList preTokens = new FunctionalStringTokenizer(line).toList(strang -> strang); - IList shuntedTokens = yard.postfix(preTokens, strang -> strang); - - System.out.println(shuntedTokens.toString()); - - inputSource.close(); - } -} diff --git a/JPratt/src/examples/java/bjc/utils/examples/parsing/Tokenizer.java b/JPratt/src/examples/java/bjc/utils/examples/parsing/Tokenizer.java new file mode 100644 index 0000000..a224de6 --- /dev/null +++ b/JPratt/src/examples/java/bjc/utils/examples/parsing/Tokenizer.java @@ -0,0 +1,32 @@ +package bjc.utils.examples.parsing; + +import bjc.utils.parserutils.pratt.Token; +import bjc.utils.parserutils.pratt.tokens.StringToken; + +import java.util.Set; +import java.util.function.Function; + +import static bjc.utils.parserutils.pratt.tokens.StringToken.litToken; + +final class Tokenizer implements Function> { + private Set ops; + private Set reserved; + private TestContext ctx; + + public Tokenizer(Set operators, Set reservedWords, TestContext context) { + ops = operators; + reserved = reservedWords; + ctx = context; + } + + @Override + public Token apply(String strang) { + if (ops.contains(strang) || reserved.contains(strang)) { + return litToken(strang); + } else if (ctx.scopes.top().containsKey(strang)) { + return new StringToken("(vref)", strang); + } else { + return new StringToken("(literal)", strang); + } + } +} \ No newline at end of file diff --git a/JPratt/src/examples/java/bjc/utils/examples/parsing/TreeConstructTest.java b/JPratt/src/examples/java/bjc/utils/examples/parsing/TreeConstructTest.java deleted file mode 100644 index a78a3d5..0000000 --- a/JPratt/src/examples/java/bjc/utils/examples/parsing/TreeConstructTest.java +++ /dev/null @@ -1,129 +0,0 @@ -package bjc.utils.examples.parsing; - -import bjc.utils.data.IPair; -import bjc.utils.data.ITree; -import bjc.utils.data.Pair; -import bjc.utils.data.Tree; -import bjc.utils.funcdata.FunctionalMap; -import bjc.utils.funcdata.FunctionalStringTokenizer; -import bjc.utils.funcdata.IList; -import bjc.utils.funcdata.IMap; -import bjc.utils.funcutils.ListUtils; -import bjc.utils.funcutils.StringUtils; -import bjc.utils.parserutils.ShuntingYard; -import bjc.utils.parserutils.TreeConstructor; - -import java.util.Deque; -import java.util.LinkedList; -import java.util.Scanner; -import java.util.function.Function; -import java.util.function.Predicate; - -/** - * Test of tree constructor - * - * @author ben - * - */ -public class TreeConstructTest { - private static final class OperatorPicker implements Predicate { - @Override - public boolean test(String token) { - if(StringUtils.containsOnly(token, "\\[")) return true; - else if(StringUtils.containsOnly(token, "\\]")) return true; - - switch(token) { - case "+": - case "-": - case "*": - case "/": - return true; - default: - return false; - } - } - } - - /** - * Main method - * - * @param args - * Unused CLI args - */ - @SuppressWarnings({ "resource", "deprecation" }) - public static void main(String[] args) { - Scanner inputSource = new Scanner(System.in); - - System.out.print("Enter a expression to parse: "); - String line = inputSource.nextLine(); - - IList tokens = new FunctionalStringTokenizer(line).toList(); - - ShuntingYard yard = new ShuntingYard<>(true); - - Deque> ops = new LinkedList<>(); - - ops.add(new Pair<>("+", "\\+")); - ops.add(new Pair<>("-", "-")); - ops.add(new Pair<>("*", "\\*")); - ops.add(new Pair<>("/", "/")); - ops.add(new Pair<>(":=", ":=")); - ops.add(new Pair<>("=>", "=>")); - - IList semiExpandedTokens = ListUtils.splitTokens(tokens, ops); - - ops = new LinkedList<>(); - ops.add(new Pair<>("(", "\\(")); - ops.add(new Pair<>(")", "\\)")); - ops.add(new Pair<>("[", "\\[")); - ops.add(new Pair<>("]", "\\]")); - - IList fullyExpandedTokens = ListUtils.deAffixTokens(semiExpandedTokens, ops); - fullyExpandedTokens.removeIf((strang) -> strang.equals("")); - - IList shuntedTokens = yard.postfix(fullyExpandedTokens, (token) -> token); - - System.out.println("Shunted: " + shuntedTokens.toString()); - - Predicate specialPicker = (operator) -> { - if(StringUtils.containsOnly(operator, "\\[")) return true; - else if(StringUtils.containsOnly(operator, "\\]")) return true; - - return false; - }; - - IMap>, ITree>> operators - = new FunctionalMap<>(); - - operators.put("[", (queuedTrees) -> { - return null; - }); - - operators.put("[", (queuedTrees) -> { - Tree openTree = new Tree<>("["); - - queuedTrees.push(openTree); - - return openTree; - }); - - operators.put("]", (queuedTrees) -> { - ITree arrayTree = new Tree<>("[]"); - - while(!queuedTrees.peek().getHead().equals("[")) { - arrayTree.addChild(queuedTrees.pop()); - } - - queuedTrees.push(arrayTree); - - return arrayTree; - }); - - ITree constructedTree = TreeConstructor.constructTree(shuntedTokens, - new OperatorPicker(), specialPicker, operators::get); - - System.out.println("AST: " + constructedTree.toString()); - - inputSource.close(); - } -} diff --git a/JPratt/src/examples/java/bjc/utils/examples/parsing/test.tree b/JPratt/src/examples/java/bjc/utils/examples/parsing/test.tree deleted file mode 100644 index 795cc88..0000000 --- a/JPratt/src/examples/java/bjc/utils/examples/parsing/test.tree +++ /dev/null @@ -1,13 +0,0 @@ -test 1 - 1 - 1 - 2 - 2 - 1 - -simp 1 - 2 - 3 - 4 - 3 - 2 \ No newline at end of file -- cgit v1.2.3