From 8a310e6c419fa9c34cb8bcac4c8fef9c132d7533 Mon Sep 17 00:00:00 2001 From: ChUrl Date: Fri, 11 Dec 2020 14:10:58 +0100 Subject: [PATCH] grammar fix bug where rightside wasnt split for actions --- src/main/java/parser/grammar/Grammar.java | 27 ++++++++++++++--------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/src/main/java/parser/grammar/Grammar.java b/src/main/java/parser/grammar/Grammar.java index 86dbf49..e79cc4f 100644 --- a/src/main/java/parser/grammar/Grammar.java +++ b/src/main/java/parser/grammar/Grammar.java @@ -93,6 +93,7 @@ public class Grammar { String leftside = split[0].trim(); String rightside = split[1].trim(); + List flagList = Collections.emptyList(); if (leftside.indexOf('[') >= 0) { // Handle actions if they exist @@ -101,10 +102,10 @@ public class Grammar { // Aus "S[C R]" wird flags = {"C", "R"} extrahiert String[] flags = leftside.substring(open + 1, close).split(" "); - List flagList = Arrays.stream(flags) - .map(String::trim) - .filter(flag -> !flag.isEmpty()) - .collect(Collectors.toList()); + flagList = Arrays.stream(flags) + .map(String::trim) + .filter(flag -> !flag.isEmpty()) + .collect(Collectors.toList()); List enumActions = Arrays.stream(Actions.values()) .map(action -> action.toString().toLowerCase()) .collect(Collectors.toList()); @@ -116,12 +117,6 @@ public class Grammar { // "S[C R]" wird zu "S" leftside = leftside.substring(0, open); - - actions.put(new SimpleEntry<>(leftside, rightside), new HashSet<>()); - actions.get(new SimpleEntry<>(leftside, rightside)).addAll(flagList); - if (!flagList.isEmpty()) { - log("Registered actions: " + flagList + "\n"); - } } // "E T2 | epsilon" wird zu prods[0] = "E T2" und prods[1] = "epsilon" @@ -130,9 +125,21 @@ public class Grammar { for (String prod : prods) { GrammarRule rule = new GrammarRule(leftside, prod.split(" ")); rules.add(rule); + + actions.put(new SimpleEntry<>(leftside, prod), new HashSet<>()); + actions.get(new SimpleEntry<>(leftside, prod)).addAll(flagList); + if (!flagList.isEmpty()) { + log("Registered actions: " + leftside + " -> " + prod + ": " + flagList); + } + } + + if (!flagList.isEmpty()) { + log("\n"); } } } + + log("\n" + actions); log("-".repeat(100)); return new Grammar(terminals, nonterminals,