Professional Documents
Culture Documents
ÂuThịQuý 20010795 nhóm5
ÂuThịQuý 20010795 nhóm5
initializeProduction(productionArray);
initializeFirstSet(startSymbol, epsilon, endSymbol);
follow.get(symbols[i]).addAll(first(symbols[j]));
if (first(symbols[j]).contains("ε")) {
follow.get(symbols[i]).addAll(follow.get(nonTerminal));
} else {
break;
}
}
}
}
for (int i = symbols.length - 1; i >= 0; i--) {
if (nonTerminals.contains(symbols[i])) {
// Rule 3: Add FOLLOW of nonTerminal to
FOLLOW of symbols[i]
if (i == symbols.length - 1) {
follow.get(symbols[i]).addAll(follow.get(nonTerminal));
} else {
if (first(symbols[i + 1]).contains("ε")) {
follow.get(symbols[i]).addAll(follow.get(nonTerminal));
}
follow.get(symbols[i]).addAll(first(symbols[i +
1]));
}
}
}
}
}
}
return follow;
}
private Set<String> first(String symbol) {
Set<String> first = new HashSet<>();
if (!nonTerminals.contains(symbol)) {
first.add(symbol);
return first;
}
for (String production : productions.get(symbol)) {
String[] symbols = production.split(" ");
for (int i = 0; i < symbols.length; i++) {
first.addAll(first(symbols[i]));
if (!first.contains("ε")) {
break;
}
if (i == symbols.length - 1 && first.contains("ε")) {
first.remove("ε");
}
}
}
return first;
}
}