diff --git a/Assignment2/src/com/company/Runner.java b/Assignment2/src/com/company/Runner.java index 2cc5f9b..c5481bc 100644 --- a/Assignment2/src/com/company/Runner.java +++ b/Assignment2/src/com/company/Runner.java @@ -9,7 +9,8 @@ public class Runner { public static void main(String[] args) { try { - List results = LexicalAnalyser.analyse("public class foo { public static void main(String[] args){ int i = 0; if (i != 2) { i = i + 1; System.out.println(\"Hi\"); } else { i = i * 2; } } }"); +// List results = LexicalAnalyser.analyse("public class foo { public static void main(String[] args){ int i = 0; if (i != 2) { i = i + 1; System.out.println(\"Hi\"); } else { i = i * 2; } } }"); + List results = LexicalAnalyser.analyse("public class Test { public static void main(String[] args){ ; }}"); // List results = LexicalAnalyser.analyse("public class Test { public static void main(String[] args){ int i; }}"); System.out.println(results); ParseTree tree = SyntacticAnalyser.parse(results); diff --git a/Assignment2/src/com/company/SyntacticAnalyser.java b/Assignment2/src/com/company/SyntacticAnalyser.java index 2a29902..00f2ef5 100644 --- a/Assignment2/src/com/company/SyntacticAnalyser.java +++ b/Assignment2/src/com/company/SyntacticAnalyser.java @@ -16,6 +16,8 @@ public class SyntacticAnalyser { public static ParseTree parse(List tokens) throws SyntaxException { + if (tokens.size() == 0) + throw new SyntaxException("Syntactical exception."); HashMap> parseTable = createTable(); Deque stack = new ArrayDeque<>(); @@ -43,7 +45,12 @@ public static ParseTree parse(List tokens) throws SyntaxException { stack.getFirst().createNode(token); currentNode = stack.getFirst(); } - int ruleNum = (int) parseTable.get(currentNode.getNode().getLabel()).get(tokenToString(token)); // ----------- checks if a rule goes with the variable + int ruleNum = 0; + try { + ruleNum = (int) parseTable.get(currentNode.getNode().getLabel()).get(tokenToString(token)); // ----------- checks if a rule goes with the variable + } catch (NullPointerException e) { + throw new SyntaxException("Syntactical Exception."); + } switch (ruleNum) { case 1: stack.pop(); @@ -102,7 +109,7 @@ public static ParseTree parse(List tokens) throws SyntaxException { break; case 10: stack.pop(); - stack.push(new NodeWrapper(currentNode.getNode(), TreeNode.Label.epsilon, "")); + stack.push(new NodeWrapper(currentNode.getNode(), TreeNode.Label.terminal, ";")); break; case 11: stack.pop(); @@ -392,7 +399,7 @@ public static ParseTree parse(List tokens) throws SyntaxException { stack.push(new NodeWrapper(currentNode.getNode(), TreeNode.Label.terminal, "\"")); break; } - } else if (stack.getFirst().getLabel().equals(TreeNode.Label.terminal) && stack.getFirst().getValue().equals(tokenToString(token))) { + } else if (stack.getFirst().getLabel().equals(TreeNode.Label.terminal) && stack.getFirst().getValue().equals(tokenToString(token))) { stack.getFirst().createNode(token); stack.pop(); terminalAvailable = true;