From 31996219ad714dc3e866a79feaa4eca08defac62 Mon Sep 17 00:00:00 2001 From: Danila Fedorin Date: Sat, 23 Sep 2017 15:31:35 -0700 Subject: [PATCH] Switch the Lexer and TreeBuilder to using exceptions. --- .../abacus/exception/TokenizeException.java | 23 +++++++++++++++++++ .../nwapw/abacus/parsing/LexerTokenizer.java | 5 +++- .../org/nwapw/abacus/parsing/TreeBuilder.java | 4 +--- .../main/kotlin/org/nwapw/abacus/Abacus.kt | 2 +- .../nwapw/abacus/tests/CalculationTests.java | 2 -- .../org/nwapw/abacus/fx/AbacusController.java | 3 --- 6 files changed, 29 insertions(+), 10 deletions(-) create mode 100644 core/src/main/java/org/nwapw/abacus/exception/TokenizeException.java diff --git a/core/src/main/java/org/nwapw/abacus/exception/TokenizeException.java b/core/src/main/java/org/nwapw/abacus/exception/TokenizeException.java new file mode 100644 index 0000000..df92ca1 --- /dev/null +++ b/core/src/main/java/org/nwapw/abacus/exception/TokenizeException.java @@ -0,0 +1,23 @@ +package org.nwapw.abacus.exception; + +/** + * Exception thrown by Lexers when they are unable to tokenize the input string. + */ +public class TokenizeException extends AbacusException { + + /** + * Create a new tokenize exception with no additional data. + */ + public TokenizeException() { + this(""); + } + + /** + * Create a new tokenize exception with the given message. + * @param message the message to use. + */ + public TokenizeException(String message){ + super("Failed to tokenize string", message); + } + +} diff --git a/core/src/main/java/org/nwapw/abacus/parsing/LexerTokenizer.java b/core/src/main/java/org/nwapw/abacus/parsing/LexerTokenizer.java index be57744..1096abb 100644 --- a/core/src/main/java/org/nwapw/abacus/parsing/LexerTokenizer.java +++ b/core/src/main/java/org/nwapw/abacus/parsing/LexerTokenizer.java @@ -1,5 +1,6 @@ package org.nwapw.abacus.parsing; +import org.nwapw.abacus.exception.TokenizeException; import org.nwapw.abacus.lexing.Lexer; import org.nwapw.abacus.lexing.pattern.Match; import org.nwapw.abacus.lexing.pattern.Pattern; @@ -42,7 +43,9 @@ public class LexerTokenizer implements Tokenizer>, PluginListen @Override public List> tokenizeString(String string) { - return lexer.lexAll(string, 0, TOKEN_SORTER); + List> tokens = lexer.lexAll(string, 0, TOKEN_SORTER); + if(tokens == null) throw new TokenizeException(); + return tokens; } @Override diff --git a/core/src/main/java/org/nwapw/abacus/parsing/TreeBuilder.java b/core/src/main/java/org/nwapw/abacus/parsing/TreeBuilder.java index b3d597e..78c2331 100644 --- a/core/src/main/java/org/nwapw/abacus/parsing/TreeBuilder.java +++ b/core/src/main/java/org/nwapw/abacus/parsing/TreeBuilder.java @@ -42,9 +42,7 @@ public class TreeBuilder { * @return the resulting tree. */ public TreeNode fromString(String input) { - List tokens = tokenizer.tokenizeString(input); - if (tokens == null) return null; - return parser.constructTree(tokens); + return parser.constructTree(tokenizer.tokenizeString(input)); } } diff --git a/core/src/main/kotlin/org/nwapw/abacus/Abacus.kt b/core/src/main/kotlin/org/nwapw/abacus/Abacus.kt index 4b78256..4272aa8 100644 --- a/core/src/main/kotlin/org/nwapw/abacus/Abacus.kt +++ b/core/src/main/kotlin/org/nwapw/abacus/Abacus.kt @@ -88,7 +88,7 @@ class Abacus(val configuration: Configuration) { * @param input the input string to parse * @return the resulting tree, null if the tree builder or the produced tree are null. */ - fun parseString(input: String): TreeNode? = treeBuilder.fromString(input) + fun parseString(input: String): TreeNode = treeBuilder.fromString(input) /** * Evaluates the given tree. * diff --git a/core/src/test/java/org/nwapw/abacus/tests/CalculationTests.java b/core/src/test/java/org/nwapw/abacus/tests/CalculationTests.java index 1aee10e..b1c0cd4 100755 --- a/core/src/test/java/org/nwapw/abacus/tests/CalculationTests.java +++ b/core/src/test/java/org/nwapw/abacus/tests/CalculationTests.java @@ -22,7 +22,6 @@ public class CalculationTests { private void testOutput(String input, String parseOutput, String output) { TreeNode parsedTree = abacus.parseString(input); - Assert.assertNotNull(parsedTree); Assert.assertEquals(parsedTree.toString(), parseOutput); NumberInterface result = abacus.evaluateTree(parsedTree).getValue(); Assert.assertNotNull(result); @@ -31,7 +30,6 @@ public class CalculationTests { private void testDomainException(String input, String parseOutput) { TreeNode parsedTree = abacus.parseString(input); - Assert.assertNotNull(parsedTree); Assert.assertEquals(parsedTree.toString(), parseOutput); try { abacus.evaluateTree(parsedTree); diff --git a/fx/src/main/java/org/nwapw/abacus/fx/AbacusController.java b/fx/src/main/java/org/nwapw/abacus/fx/AbacusController.java index 8c4700d..25f8632 100644 --- a/fx/src/main/java/org/nwapw/abacus/fx/AbacusController.java +++ b/fx/src/main/java/org/nwapw/abacus/fx/AbacusController.java @@ -142,9 +142,6 @@ public class AbacusController implements PluginListener { private String attemptCalculation() { try { TreeNode constructedTree = abacus.parseString(inputField.getText()); - if (constructedTree == null) { - return ERR_SYNTAX; - } EvaluationResult result = abacus.evaluateTree(constructedTree); NumberInterface evaluatedNumber = result.getValue(); String resultingString = evaluatedNumber.toString();