improve grammar parsing
This commit is contained in:
@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user