distinguish between different rightsides for actions

This commit is contained in:
ChUrl
2020-12-11 13:46:37 +01:00
parent 79e9fb6094
commit c7b3e7806e

View File

@ -3,6 +3,7 @@ package parser.grammar;
import java.io.IOException; import java.io.IOException;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
import java.util.AbstractMap.SimpleEntry;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
@ -21,7 +22,7 @@ public class Grammar {
private final String startSymbol; private final String startSymbol;
private final String epsilonSymbol; private final String epsilonSymbol;
private final Map<String, Set<String>> actions; private final Map<Map.Entry<String, String>, Set<String>> actions;
private final Set<GrammarRule> rules; private final Set<GrammarRule> rules;
@ -38,7 +39,7 @@ public class Grammar {
public Grammar(Set<String> terminals, Set<String> nonterminals, public Grammar(Set<String> terminals, Set<String> nonterminals,
String startSymbol, String epsilonSymbol, String startSymbol, String epsilonSymbol,
Map<String, Set<String>> actions, Set<GrammarRule> rules) { Map<Map.Entry<String, String>, Set<String>> actions, Set<GrammarRule> rules) {
this.terminals = terminals; this.terminals = terminals;
this.nonterminals = nonterminals; this.nonterminals = nonterminals;
this.startSymbol = startSymbol; this.startSymbol = startSymbol;
@ -61,7 +62,7 @@ public class Grammar {
Set<String> terminals = new HashSet<>(); Set<String> terminals = new HashSet<>();
Set<String> nonterminals = new HashSet<>(); Set<String> nonterminals = new HashSet<>();
Map<String, Set<String>> actions = new HashMap<>(); Map<Map.Entry<String, String>, Set<String>> actions = new HashMap<>();
Set<GrammarRule> rules = new HashSet<>(); Set<GrammarRule> rules = new HashSet<>();
log("Parsing Grammar from File:"); log("Parsing Grammar from File:");
@ -105,10 +106,10 @@ public class Grammar {
// "S[C R]" wird zu "S" // "S[C R]" wird zu "S"
leftside = leftside.substring(0, open); leftside = leftside.substring(0, open);
actions.put(leftside, new HashSet<>()); actions.put(new SimpleEntry<>(leftside, rightside), new HashSet<>());
actions.get(leftside).addAll(flagList); actions.get(new SimpleEntry<>(leftside, rightside)).addAll(flagList);
if (!flagList.isEmpty()) { if (!flagList.isEmpty()) {
log("Registered actions for " + leftside + ": " + flagList + "\n"); log("Registered actions: " + flagList + "\n");
} }
} }
@ -168,7 +169,7 @@ public class Grammar {
.collect(Collectors.toUnmodifiableSet()); .collect(Collectors.toUnmodifiableSet());
} }
public Set<String> getActions(String leftside) { public Set<String> getActions(String leftside, String rightside) {
return this.actions == null ? Collections.emptySet() : this.actions.get(leftside); return this.actions == null ? Collections.emptySet() : this.actions.get(new SimpleEntry<>(leftside, rightside));
} }
} }