ParserTableBuilder.java
package org.sterling.source.parser;
import java.util.LinkedHashMap;
import java.util.Map;
import org.sterling.source.syntax.NodeKind;
public class ParserTableBuilder {
private final Map<ParserState, ParserRule> table;
public ParserTableBuilder() {
table = new LinkedHashMap<>();
}
public void addRule(ParserRule rule) {
if (hasState(rule)) {
ParserState state = rule.getState();
throw new IllegalStateException("Action already defined for stack " + state.getStack()
+ " and look-ahead " + state.getLookAhead());
}
table.put(rule.getState(), rule);
}
public ParserTable getTable() {
return new ParserTable(table.values());
}
public ParserTableActionBuilder when(NodeKind stack) {
return new ParserTableActionBuilder(this, stack);
}
private boolean hasState(ParserRule rule) {
return table.containsKey(rule.getState());
}
}