summaryrefslogtreecommitdiff
path: root/BJC-Utils2/src/examples/java
diff options
context:
space:
mode:
Diffstat (limited to 'BJC-Utils2/src/examples/java')
-rw-r--r--BJC-Utils2/src/examples/java/bjc/utils/examples/ShuntTest.java37
-rw-r--r--BJC-Utils2/src/examples/java/bjc/utils/examples/TreeConstructTest.java129
-rw-r--r--BJC-Utils2/src/examples/java/bjc/utils/examples/test.tree13
3 files changed, 179 insertions, 0 deletions
diff --git a/BJC-Utils2/src/examples/java/bjc/utils/examples/ShuntTest.java b/BJC-Utils2/src/examples/java/bjc/utils/examples/ShuntTest.java
new file mode 100644
index 0000000..e0c29fe
--- /dev/null
+++ b/BJC-Utils2/src/examples/java/bjc/utils/examples/ShuntTest.java
@@ -0,0 +1,37 @@
+package bjc.utils.examples;
+
+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<String> yard = new ShuntingYard<>(true);
+
+ IList<String> preTokens = new FunctionalStringTokenizer(line).toList(strang -> strang);
+ IList<String> shuntedTokens = yard.postfix(preTokens, strang -> strang);
+
+ System.out.println(shuntedTokens.toString());
+
+ inputSource.close();
+ }
+}
diff --git a/BJC-Utils2/src/examples/java/bjc/utils/examples/TreeConstructTest.java b/BJC-Utils2/src/examples/java/bjc/utils/examples/TreeConstructTest.java
new file mode 100644
index 0000000..8c945e9
--- /dev/null
+++ b/BJC-Utils2/src/examples/java/bjc/utils/examples/TreeConstructTest.java
@@ -0,0 +1,129 @@
+package bjc.utils.examples;
+
+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<String> {
+ @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<String> tokens = new FunctionalStringTokenizer(line).toList();
+
+ ShuntingYard<String> yard = new ShuntingYard<>(true);
+
+ Deque<IPair<String, String>> 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<String> 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<String> fullyExpandedTokens = ListUtils.deAffixTokens(semiExpandedTokens, ops);
+ fullyExpandedTokens.removeIf((strang) -> strang.equals(""));
+
+ IList<String> shuntedTokens = yard.postfix(fullyExpandedTokens, (token) -> token);
+
+ System.out.println("Shunted: " + shuntedTokens.toString());
+
+ Predicate<String> specialPicker = (operator) -> {
+ if(StringUtils.containsOnly(operator, "\\[")) return true;
+ else if(StringUtils.containsOnly(operator, "\\]")) return true;
+
+ return false;
+ };
+
+ IMap<String, Function<Deque<ITree<String>>, ITree<String>>> operators
+ = new FunctionalMap<>();
+
+ operators.put("[", (queuedTrees) -> {
+ return null;
+ });
+
+ operators.put("[", (queuedTrees) -> {
+ Tree<String> openTree = new Tree<>("[");
+
+ queuedTrees.push(openTree);
+
+ return openTree;
+ });
+
+ operators.put("]", (queuedTrees) -> {
+ ITree<String> arrayTree = new Tree<>("[]");
+
+ while(!queuedTrees.peek().getHead().equals("[")) {
+ arrayTree.addChild(queuedTrees.pop());
+ }
+
+ queuedTrees.push(arrayTree);
+
+ return arrayTree;
+ });
+
+ ITree<String> constructedTree = TreeConstructor.constructTree(shuntedTokens,
+ new OperatorPicker(), specialPicker, operators::get);
+
+ System.out.println("AST: " + constructedTree.toString());
+
+ inputSource.close();
+ }
+}
diff --git a/BJC-Utils2/src/examples/java/bjc/utils/examples/test.tree b/BJC-Utils2/src/examples/java/bjc/utils/examples/test.tree
new file mode 100644
index 0000000..795cc88
--- /dev/null
+++ b/BJC-Utils2/src/examples/java/bjc/utils/examples/test.tree
@@ -0,0 +1,13 @@
+test 1
+ 1
+ 1
+ 2
+ 2
+ 1
+
+simp 1
+ 2
+ 3
+ 4
+ 3
+ 2 \ No newline at end of file