From b4f5f98c0aa7fc892e96771ff2df729e61c21f74 Mon Sep 17 00:00:00 2001 From: bculkin2442 Date: Mon, 18 Apr 2016 19:56:32 -0400 Subject: Minor code changes --- .../bjc/utils/examples/parsing/ShuntTester.java | 2 +- .../utils/examples/parsing/TreeConstructTest.java | 122 +++++++++++++++++---- 2 files changed, 104 insertions(+), 20 deletions(-) (limited to 'BJC-Utils2/src/examples') diff --git a/BJC-Utils2/src/examples/java/bjc/utils/examples/parsing/ShuntTester.java b/BJC-Utils2/src/examples/java/bjc/utils/examples/parsing/ShuntTester.java index 1af5e30..6c1374e 100644 --- a/BJC-Utils2/src/examples/java/bjc/utils/examples/parsing/ShuntTester.java +++ b/BJC-Utils2/src/examples/java/bjc/utils/examples/parsing/ShuntTester.java @@ -25,7 +25,7 @@ public class ShuntTester { System.out.print("Enter a expression to shunt: "); String line = inputSource.nextLine(); - ShuntingYard yard = new ShuntingYard<>(); + ShuntingYard yard = new ShuntingYard<>(true); IFunctionalList shuntedTokens = yard.postfix(new FunctionalStringTokenizer(line) diff --git a/BJC-Utils2/src/examples/java/bjc/utils/examples/parsing/TreeConstructTest.java b/BJC-Utils2/src/examples/java/bjc/utils/examples/parsing/TreeConstructTest.java index ef081d2..320c4a4 100644 --- a/BJC-Utils2/src/examples/java/bjc/utils/examples/parsing/TreeConstructTest.java +++ b/BJC-Utils2/src/examples/java/bjc/utils/examples/parsing/TreeConstructTest.java @@ -1,11 +1,21 @@ package bjc.utils.examples.parsing; +import java.util.Deque; +import java.util.LinkedList; import java.util.Scanner; +import java.util.function.Function; import java.util.function.Predicate; +import bjc.utils.data.IPair; +import bjc.utils.data.Pair; +import bjc.utils.funcdata.FunctionalMap; import bjc.utils.funcdata.FunctionalStringTokenizer; import bjc.utils.funcdata.IFunctionalList; +import bjc.utils.funcdata.IFunctionalMap; import bjc.utils.funcdata.ITree; +import bjc.utils.funcdata.Tree; +import bjc.utils.funcutils.ListUtils; +import bjc.utils.funcutils.StringUtils; import bjc.utils.parserutils.ShuntingYard; import bjc.utils.parserutils.TreeConstructor; @@ -16,41 +26,115 @@ import bjc.utils.parserutils.TreeConstructor; * */ 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") public static void main(String[] args) { Scanner inputSource = new Scanner(System.in); System.out.print("Enter a expression to parse: "); String line = inputSource.nextLine(); - ShuntingYard yard = new ShuntingYard<>(); + IFunctionalList 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<>("=>", "=>")); + + IFunctionalList semiExpandedTokens = + ListUtils.splitTokens(tokens, ops); + + ops = new LinkedList<>(); + + ops.add(new Pair<>("(", "\\(")); + ops.add(new Pair<>(")", "\\)")); + ops.add(new Pair<>("[", "\\[")); + ops.add(new Pair<>("]", "\\]")); + + IFunctionalList fullyExpandedTokens = + ListUtils.deAffixTokens(semiExpandedTokens, ops); + + fullyExpandedTokens.removeIf((strang) -> strang.equals("")); - IFunctionalList shuntedTokens = yard - .postfix(new FunctionalStringTokenizer(line) - .toList((strang) -> strang), (s) -> s); + IFunctionalList shuntedTokens = + yard.postfix(fullyExpandedTokens, (token) -> token); System.out.println("Shunted: " + shuntedTokens.toString()); - ITree constructedTree = TreeConstructor - .constructTree(shuntedTokens, new Predicate() { - @Override - public boolean test(String token) { - switch (token) { - case "+": - case "-": - case "*": - case "/": - return true; - default: - return false; - } - } - }, (operator) -> false, null); + Predicate specialPicker = (operator) -> { + if (StringUtils.containsOnly(operator, "\\[")) { + return true; + } else if (StringUtils.containsOnly(operator, "\\]")) { + return true; + } + + return false; + }; + + IFunctionalMap>, 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()); -- cgit v1.2.3