summaryrefslogtreecommitdiff
path: root/JPratt/src/examples/java/bjc/utils
diff options
context:
space:
mode:
authorbjculkin <bjculkin@mix.wvu.edu>2017-04-05 15:32:34 -0400
committerbjculkin <bjculkin@mix.wvu.edu>2017-04-05 15:32:34 -0400
commitb61c66d5e0c18faee68eb91881d5dfe760818856 (patch)
tree9974473d698657bb24316ba7f1fdd08c46dd762a /JPratt/src/examples/java/bjc/utils
parent5008c26a604876bcad09c868aa2ec4a2c8b64e35 (diff)
Update examples
Diffstat (limited to 'JPratt/src/examples/java/bjc/utils')
-rw-r--r--JPratt/src/examples/java/bjc/utils/examples/parsing/AssignCommand.java4
-rw-r--r--JPratt/src/examples/java/bjc/utils/examples/parsing/BlockEnter.java22
-rw-r--r--JPratt/src/examples/java/bjc/utils/examples/parsing/BlockExit.java14
-rw-r--r--JPratt/src/examples/java/bjc/utils/examples/parsing/PrattParserTest.java86
-rw-r--r--JPratt/src/examples/java/bjc/utils/examples/parsing/ShuntTest.java37
-rw-r--r--JPratt/src/examples/java/bjc/utils/examples/parsing/Tokenizer.java32
-rw-r--r--JPratt/src/examples/java/bjc/utils/examples/parsing/TreeConstructTest.java129
-rw-r--r--JPratt/src/examples/java/bjc/utils/examples/parsing/test.tree13
8 files changed, 91 insertions, 246 deletions
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<String, String, TestContext> {
- 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<TestContext> {
+ @Override
+ public TestContext apply(TestContext state) {
+ Directory<String, ITree<Token<String, String>>> 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<TestContext> {
+ @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<String, Token<String, String>> {
- private Set<String> ops;
- private Set<String> reserved;
- private TestContext ctx;
-
- public Tokenizer(Set<String> operators, Set<String> reservedWords, TestContext context) {
- ops = operators;
- reserved = reservedWords;
- ctx = context;
- }
-
- @Override
- public Token<String, String> 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<TestContext> {
- @Override
- public TestContext apply(TestContext state) {
- state.scopes.pop();
-
- state.blockCount.pop();
-
- return state;
- }
- }
-
- private static final class BlockEnter implements UnaryOperator<TestContext> {
- @Override
- public TestContext apply(TestContext state) {
- Directory<String, ITree<Token<String, String>>> 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<String> 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<Token<String, String>> tokens = preprocessInput(ops, split, ln, reserved, ctx);
try {
@@ -162,21 +114,21 @@ public class PrattParserTest {
ITree<Token<String, String>> 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<String> 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<String> 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<String, String, TestContext> 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<String, String, TestContext> 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<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/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<String, Token<String, String>> {
+ private Set<String> ops;
+ private Set<String> reserved;
+ private TestContext ctx;
+
+ public Tokenizer(Set<String> operators, Set<String> reservedWords, TestContext context) {
+ ops = operators;
+ reserved = reservedWords;
+ ctx = context;
+ }
+
+ @Override
+ public Token<String, String> 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<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/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