From 7dbc90e4691ae3ed4fec5068461b4263346e67da Mon Sep 17 00:00:00 2001 From: bculkin2442 Date: Sun, 28 Aug 2016 22:35:31 -0400 Subject: Tossed attempt at subrule-supported parser Also, renamed some tests --- .../java/bjc/utils/examples/BinarySearchTest.java | 151 ++++++++++ .../java/bjc/utils/examples/BinarySearcher.java | 151 ---------- .../java/bjc/utils/examples/parsing/ShuntTest.java | 38 +++ .../bjc/utils/examples/parsing/ShuntTester.java | 38 --- .../java/bjc/utils/examples/parsing/test.tree | 13 + .../parserutils/RuleStackBasedConfigReader.java | 306 --------------------- 6 files changed, 202 insertions(+), 495 deletions(-) create mode 100644 BJC-Utils2/src/examples/java/bjc/utils/examples/BinarySearchTest.java delete mode 100644 BJC-Utils2/src/examples/java/bjc/utils/examples/BinarySearcher.java create mode 100644 BJC-Utils2/src/examples/java/bjc/utils/examples/parsing/ShuntTest.java delete mode 100644 BJC-Utils2/src/examples/java/bjc/utils/examples/parsing/ShuntTester.java create mode 100644 BJC-Utils2/src/examples/java/bjc/utils/examples/parsing/test.tree delete mode 100644 BJC-Utils2/src/main/java/bjc/utils/parserutils/RuleStackBasedConfigReader.java diff --git a/BJC-Utils2/src/examples/java/bjc/utils/examples/BinarySearchTest.java b/BJC-Utils2/src/examples/java/bjc/utils/examples/BinarySearchTest.java new file mode 100644 index 0000000..c453e4b --- /dev/null +++ b/BJC-Utils2/src/examples/java/bjc/utils/examples/BinarySearchTest.java @@ -0,0 +1,151 @@ +package bjc.utils.examples; + +import java.util.Scanner; + +import bjc.utils.funcdata.bst.BinarySearchTree; +import bjc.utils.funcdata.bst.TreeLinearizationMethod; + +/** + * Example showing how to use the binary search tree. + * + * @author ben + * + */ +public class BinarySearchTest { + private static void displayTree(BinarySearchTree tree, + Scanner inputSource) { + System.out.print( + "What order would you like the tree to be printed in (m for options): "); + + char command; + + while (true) { + command = inputSource.nextLine().charAt(0); + + TreeLinearizationMethod linearizationMethod = null; + + switch (command) { + case 'm': + System.out.println("Possible tree printing methods: "); + System.out.println( + "\tp: Preorder printing (print parent first, then left & right)."); + System.out.println( + "\ti: Inorder printing (print left first, then parent & right)."); + System.out.println( + "\to: Postorder printing (print left first, then right & parent)."); + break; + + case 'p': + linearizationMethod = TreeLinearizationMethod.PREORDER; + break; + + case 'i': + linearizationMethod = TreeLinearizationMethod.INORDER; + break; + + case 'o': + linearizationMethod = TreeLinearizationMethod.POSTORDER; + break; + + default: + System.out.println("ERROR: Unknown command."); + } + + if (linearizationMethod != null) { + tree.traverse(linearizationMethod, (element) -> { + System.out.println("Node: " + element); + return true; + }); + + return; + } + + System.out.print( + "What order would you like the tree to be printed in (m for options): "); + } + } + + /** + * Main method of class + * + * @param args + * Unused CLI args + */ + public static void main(String[] args) { + Scanner inputSource = new Scanner(System.in); + + System.out.println("Binary Tree Constructor/Searcher"); + + char command = ' '; + + BinarySearchTree searchTree = new BinarySearchTree<>( + (o1, o2) -> o1 - o2); + + while (command != 'e') { + System.out.print("Enter a command (m for help): "); + command = inputSource.nextLine().charAt(0); + + switch (command) { + case 'm': + System.out.println("Valid commands: "); + System.out.println("\tm: Display this help message."); + System.out.println("\te: Exit this program."); + System.out.println( + "\ta: Add a node to the binary tree."); + System.out.println("\td: Display the binary tree."); + System.out.println( + "\tr: Remove a node from the binary tree."); + System.out.println( + "\tf: Check if a given node is in the binary tree."); + System.out.println( + "\tt: Trim all deleted nodes from the tree."); + System.out.println( + "\tb: Balance the tree (also trims dead nodes)"); + break; + + case 'a': + System.out.print( + "Enter the letter to add to the binary tree: "); + command = inputSource.nextLine().charAt(0); + + searchTree.addNode(command); + break; + + case 'r': + System.out.print( + "Enter the letter to add to the binary tree: "); + command = inputSource.nextLine().charAt(0); + + searchTree.deleteNode(command); + break; + + case 'd': + displayTree(searchTree, inputSource); + break; + + case 'f': + System.out.print( + "Enter the letter to add to the binary tree: "); + command = inputSource.nextLine().charAt(0); + + System.out.println("Node " + command + " was " + + (searchTree.isInTree(command) ? "" : "not ") + + "found"); + break; + + case 't': + searchTree.trim(); + break; + + case 'b': + searchTree.balance(); + break; + + default: + System.out.println("ERROR: Unrecognized command."); + } + } + + inputSource.close(); + } +} diff --git a/BJC-Utils2/src/examples/java/bjc/utils/examples/BinarySearcher.java b/BJC-Utils2/src/examples/java/bjc/utils/examples/BinarySearcher.java deleted file mode 100644 index 8fefe70..0000000 --- a/BJC-Utils2/src/examples/java/bjc/utils/examples/BinarySearcher.java +++ /dev/null @@ -1,151 +0,0 @@ -package bjc.utils.examples; - -import java.util.Scanner; - -import bjc.utils.funcdata.bst.BinarySearchTree; -import bjc.utils.funcdata.bst.TreeLinearizationMethod; - -/** - * Example showing how to use the binary search tree. - * - * @author ben - * - */ -public class BinarySearcher { - private static void displayTree(BinarySearchTree tree, - Scanner inputSource) { - System.out.print( - "What order would you like the tree to be printed in (m for options): "); - - char command; - - while (true) { - command = inputSource.nextLine().charAt(0); - - TreeLinearizationMethod linearizationMethod = null; - - switch (command) { - case 'm': - System.out.println("Possible tree printing methods: "); - System.out.println( - "\tp: Preorder printing (print parent first, then left & right)."); - System.out.println( - "\ti: Inorder printing (print left first, then parent & right)."); - System.out.println( - "\to: Postorder printing (print left first, then right & parent)."); - break; - - case 'p': - linearizationMethod = TreeLinearizationMethod.PREORDER; - break; - - case 'i': - linearizationMethod = TreeLinearizationMethod.INORDER; - break; - - case 'o': - linearizationMethod = TreeLinearizationMethod.POSTORDER; - break; - - default: - System.out.println("ERROR: Unknown command."); - } - - if (linearizationMethod != null) { - tree.traverse(linearizationMethod, (element) -> { - System.out.println("Node: " + element); - return true; - }); - - return; - } - - System.out.print( - "What order would you like the tree to be printed in (m for options): "); - } - } - - /** - * Main method of class - * - * @param args - * Unused CLI args - */ - public static void main(String[] args) { - Scanner inputSource = new Scanner(System.in); - - System.out.println("Binary Tree Constructor/Searcher"); - - char command = ' '; - - BinarySearchTree searchTree = new BinarySearchTree<>( - (o1, o2) -> o1 - o2); - - while (command != 'e') { - System.out.print("Enter a command (m for help): "); - command = inputSource.nextLine().charAt(0); - - switch (command) { - case 'm': - System.out.println("Valid commands: "); - System.out.println("\tm: Display this help message."); - System.out.println("\te: Exit this program."); - System.out.println( - "\ta: Add a node to the binary tree."); - System.out.println("\td: Display the binary tree."); - System.out.println( - "\tr: Remove a node from the binary tree."); - System.out.println( - "\tf: Check if a given node is in the binary tree."); - System.out.println( - "\tt: Trim all deleted nodes from the tree."); - System.out.println( - "\tb: Balance the tree (also trims dead nodes)"); - break; - - case 'a': - System.out.print( - "Enter the letter to add to the binary tree: "); - command = inputSource.nextLine().charAt(0); - - searchTree.addNode(command); - break; - - case 'r': - System.out.print( - "Enter the letter to add to the binary tree: "); - command = inputSource.nextLine().charAt(0); - - searchTree.deleteNode(command); - break; - - case 'd': - displayTree(searchTree, inputSource); - break; - - case 'f': - System.out.print( - "Enter the letter to add to the binary tree: "); - command = inputSource.nextLine().charAt(0); - - System.out.println("Node " + command + " was " - + (searchTree.isInTree(command) ? "" : "not ") - + "found"); - break; - - case 't': - searchTree.trim(); - break; - - case 'b': - searchTree.balance(); - break; - - default: - System.out.println("ERROR: Unrecognized command."); - } - } - - inputSource.close(); - } -} diff --git a/BJC-Utils2/src/examples/java/bjc/utils/examples/parsing/ShuntTest.java b/BJC-Utils2/src/examples/java/bjc/utils/examples/parsing/ShuntTest.java new file mode 100644 index 0000000..47bbaf8 --- /dev/null +++ b/BJC-Utils2/src/examples/java/bjc/utils/examples/parsing/ShuntTest.java @@ -0,0 +1,38 @@ +package bjc.utils.examples.parsing; + +import java.util.Scanner; + +import bjc.utils.funcdata.FunctionalStringTokenizer; +import bjc.utils.funcdata.IList; +import bjc.utils.parserutils.ShuntingYard; + +/** + * 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 shuntedTokens = yard + .postfix(new FunctionalStringTokenizer(line) + .toList((strang) -> strang), (strang) -> strang); + + System.out.println(shuntedTokens.toString()); + + inputSource.close(); + } +} \ No newline at end of file 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 deleted file mode 100644 index 5148be4..0000000 --- a/BJC-Utils2/src/examples/java/bjc/utils/examples/parsing/ShuntTester.java +++ /dev/null @@ -1,38 +0,0 @@ -package bjc.utils.examples.parsing; - -import java.util.Scanner; - -import bjc.utils.funcdata.FunctionalStringTokenizer; -import bjc.utils.funcdata.IList; -import bjc.utils.parserutils.ShuntingYard; - -/** - * Test of shunting yard - * - * @author ben - * - */ -public class ShuntTester { - /** - * 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 shuntedTokens = yard - .postfix(new FunctionalStringTokenizer(line) - .toList((strang) -> strang), (strang) -> strang); - - System.out.println(shuntedTokens.toString()); - - inputSource.close(); - } -} \ No newline at end of file diff --git a/BJC-Utils2/src/examples/java/bjc/utils/examples/parsing/test.tree b/BJC-Utils2/src/examples/java/bjc/utils/examples/parsing/test.tree new file mode 100644 index 0000000..795cc88 --- /dev/null +++ b/BJC-Utils2/src/examples/java/bjc/utils/examples/parsing/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 diff --git a/BJC-Utils2/src/main/java/bjc/utils/parserutils/RuleStackBasedConfigReader.java b/BJC-Utils2/src/main/java/bjc/utils/parserutils/RuleStackBasedConfigReader.java deleted file mode 100644 index 253d618..0000000 --- a/BJC-Utils2/src/main/java/bjc/utils/parserutils/RuleStackBasedConfigReader.java +++ /dev/null @@ -1,306 +0,0 @@ -package bjc.utils.parserutils; - -import java.io.InputStream; -import java.util.InputMismatchException; -import java.util.Scanner; -import java.util.Stack; -import java.util.function.BiConsumer; -import java.util.function.BiFunction; -import java.util.function.Consumer; - -import bjc.utils.data.IHolder; -import bjc.utils.data.IPair; -import bjc.utils.data.Identity; -import bjc.utils.data.Pair; -import bjc.utils.exceptions.UnknownPragmaException; -import bjc.utils.funcdata.FunctionalMap; -import bjc.utils.funcdata.FunctionalStringTokenizer; -import bjc.utils.funcdata.IMap; - -/** - * This class parses a rules based config file, and uses it to drive a - * provided set of actions. It differs from {@link RuleBasedConfigReader} - * in that it has support for subrules - * - * @author ben - * - * @param - * The type of the state object to use - * @param - * The type of state to use for subrules - * - */ -public class RuleStackBasedConfigReader { - private BiConsumer> startRule; - private BiConsumer continueRule; - private Consumer endRule; - - private Stack subruleStack; - - private BiFunction startSubrule; - private BiConsumer continueSubrule; - private BiConsumer endSubrule; - - private IMap> pragmas; - - /** - * Create a new rule-based config reader - * - * @param startRule - * The action to fire when starting a rule - * @param continueRule - * The action to fire when continuing a rule - * @param endRule - * The action to fire when ending a rule - */ - public RuleStackBasedConfigReader( - BiConsumer> startRule, - BiConsumer continueRule, - Consumer endRule) { - this.startRule = startRule; - this.continueRule = continueRule; - this.endRule = endRule; - - this.pragmas = new FunctionalMap<>(); - } - - public RuleStackBasedConfigReader() { - this.pragmas = new FunctionalMap<>(); - } - - /** - * Add a pragma to this reader - * - * @param pragmaName - * The name of the pragma to add - * @param pragmaAction - * The function to execute when this pragma is read - */ - public void addPragma(String pragmaName, - BiConsumer pragmaAction) { - if (pragmaName == null) { - throw new NullPointerException("Pragma name must not be null"); - } else if (pragmaAction == null) { - throw new NullPointerException( - "Pragma action must not be null"); - } - - pragmas.put(pragmaName, pragmaAction); - } - - private void continueRule(State state, boolean ruleOpen, String line) { - if (ruleOpen == false) { - throw new InputMismatchException( - "Can't continue rule with no rule currently open"); - } - - if (continueRule == null) { - throw new InputMismatchException( - "Attempted to continue rule with rule continuation disabled." - + " Check for extraneous tabs"); - } - - String lineSansInitTab = line.substring(1); - - if (lineSansInitTab.startsWith("\t")) { - // Do subrule stuff - int subruleLevel; - - for (subruleLevel = 1; lineSansInitTab - .charAt(subruleLevel) != '\t'; subruleLevel++) { - // Count up subrule levels - } - - if (subruleStack.size() + 1 < subruleLevel) { - throw new InputMismatchException( - "Attempted to start a nested subrule without starting its parent." - + " Check indentation, as subrules can only be started one at a time"); - } else if (subruleStack.size() + 1 == subruleLevel) { - SubruleState subruleState = startSubrule.apply( - new FunctionalStringTokenizer(lineSansInitTab - .substring(subruleLevel - 1), " "), - state); - - subruleStack.push(subruleState); - } else if (subruleStack.size() == subruleLevel) { - continueSubrule.accept( - new FunctionalStringTokenizer(lineSansInitTab - .substring(subruleLevel - 1), " "), - subruleStack.peek()); - } else { - while (subruleStack.size() != subruleLevel) { - endSubrule.accept(state, subruleStack.pop()); - } - - continueSubrule.accept( - new FunctionalStringTokenizer(lineSansInitTab - .substring(subruleLevel - 1), " "), - subruleStack.peek()); - } - } else { - if (!subruleStack.empty()) { - while (!subruleStack.empty()) { - endSubrule.accept(state, subruleStack.pop()); - } - } - - continueRule.accept( - new FunctionalStringTokenizer(lineSansInitTab, " "), - state); - } - } - - private boolean endRule(State state, boolean ruleOpen) { - if (ruleOpen == false) { - // Ignore blank line without an open rule - } else { - if (endRule == null) { - // Nothing happens on rule end - ruleOpen = false; - } else { - endRule.accept(state); - } - - ruleOpen = false; - } - return ruleOpen; - } - - /** - * Run a stream through this reader - * - * @param inputStream - * The stream to get input - * @param initialState - * The initial state of the reader - * @return The final state of the reader - */ - public State fromStream(InputStream inputStream, State initialState) { - if (inputStream == null) { - throw new NullPointerException( - "Input stream must not be null"); - } - - State state; - - try (Scanner inputSource = new Scanner(inputStream, "\n")) { - - state = initialState; - IHolder ruleOpen = new Identity<>(false); - - inputSource.forEachRemaining((line) -> { - if (line.startsWith("#") || line.startsWith("//")) { - // It's a comment - return; - } else if (line.equals("")) { - ruleOpen.replace(endRule(state, ruleOpen.getValue())); - - return; - } else if (line.startsWith("\t")) { - continueRule(state, ruleOpen.getValue(), line); - } else { - ruleOpen.replace( - startRule(state, ruleOpen.getValue(), line)); - } - }); - } - - return state; - - } - - /** - * Set the action to execute when continuing a rule - * - * @param continueRule - * The action to execute on continuation of a rule - */ - public void setContinueRule( - BiConsumer continueRule) { - this.continueRule = continueRule; - } - - /** - * Set the action to execute when ending a rule - * - * @param endRule - * The action to execute on ending of a rule - */ - public void setEndRule(Consumer endRule) { - this.endRule = endRule; - } - - /** - * Set the action to execute when starting a rule - * - * @param startRule - * The action to execute on starting of a rule - */ - public void setStartRule( - BiConsumer> startRule) { - if (startRule == null) { - throw new NullPointerException( - "Action on rule start must be non-null"); - } - - this.startRule = startRule; - } - - private boolean startRule(State state, boolean ruleOpen, String line) { - FunctionalStringTokenizer tokenizer = new FunctionalStringTokenizer( - line, " "); - - String nextToken = tokenizer.nextToken(); - - if (nextToken.equals("pragma")) { - String token = tokenizer.nextToken(); - - pragmas.getOrDefault(token, (tokenzer, stat) -> { - throw new UnknownPragmaException( - "Unknown pragma " + token); - }).accept(tokenizer, state); - } else { - if (ruleOpen == true) { - throw new InputMismatchException("Attempted to open a" - + " rule with a rule already open. Make sure rules are" - + " seperated by blank lines"); - } - - startRule.accept(tokenizer, new Pair<>(nextToken, state)); - ruleOpen = true; - } - return ruleOpen; - } - - /** - * Set the function to use when a subrule starts - * - * @param startSubrule - * the function to use for starting a subrule - */ - public void setStartSubrule( - BiFunction startSubrule) { - this.startSubrule = startSubrule; - } - - /** - * Set the function to use when a subrule continues - * - * @param continueSubrule - * the function to use for continuing a subrule - */ - public void setContinueSubrule( - BiConsumer continueSubrule) { - this.continueSubrule = continueSubrule; - } - - /** - * Set the function to use when a subrule ends - * - * @param endSubrule - * the function to use for ending a subrule - */ - public void setEndSubrule(BiConsumer endSubrule) { - this.endSubrule = endSubrule; - } -} -- cgit v1.2.3