improve grammar parsing

This commit is contained in:
ChUrl
2020-12-07 20:57:26 +01:00
parent cec76298e8
commit 509031ab31

View File

@ -35,22 +35,30 @@ public class Grammar {
.collect(Collectors.toUnmodifiableList()); .collect(Collectors.toUnmodifiableList());
try { try {
String startSymbol = lines.get(0).split(" ")[1]; String startSymbol = "";
String epsilonSymbol = lines.get(1).split(" ")[1]; String epsilonSymbol = "";
Set<String> terminals = new HashSet<>();
String[] term = lines.get(2).split(" "); Set<String> nonterminals = new HashSet<>();
term = Arrays.copyOfRange(term, 1, term.length);
Set<String> terminals = new HashSet<>(Arrays.asList(term));
String[] nterm = lines.get(3).split(" ");
nterm = Arrays.copyOfRange(nterm, 1, nterm.length);
Set<String> nonterminals = new HashSet<>(Arrays.asList(nterm));
Set<GrammarRule> rules = new HashSet<>(); Set<GrammarRule> rules = new HashSet<>();
for (int i = 4; i < lines.size(); i++) { for (String line : lines) {
if (line.startsWith("START:")) {
startSymbol = line.split(" ")[1];
} else if (line.startsWith("EPS:")) {
epsilonSymbol = line.split(" ")[1];
} else if (line.startsWith("TERM:")) {
terminals.addAll(Arrays.stream(line.split(" ")).skip(1).collect(Collectors.toSet()));
} else if (line.startsWith("NTERM:")) {
nonterminals.addAll(Arrays.stream(line.split(" ")).skip(1).collect(Collectors.toSet()));
} else {
// "S -> E T2 | EPS" wird zu leftside = "S" und rightside = "E T2 | epsilon" // "S -> E T2 | EPS" wird zu leftside = "S" und rightside = "E T2 | epsilon"
String[] split = lines.get(i) String[] split = line.replaceAll("EPS", epsilonSymbol)
.replaceAll("EPS", epsilonSymbol)
.split("->"); .split("->");
String leftside = split[0].trim(); String leftside = split[0].trim();
@ -64,6 +72,7 @@ public class Grammar {
rules.add(rule); rules.add(rule);
} }
} }
}
return new Grammar(terminals, nonterminals, return new Grammar(terminals, nonterminals,
startSymbol, epsilonSymbol, startSymbol, epsilonSymbol,