in grammar/src/main/java/jetbrains/jetpad/grammar/base/BaseLRTableGenerator.java [109:162]
public LRParserTable generateTable() {
checkGrammar();
final List<LRState<ItemT>> states = generateStates();
LRParserTable result = new LRParserTable(grammar());
Map<LRState<ItemT>, LRParserState> statesMap = new HashMap<>();
statesMap.put(states.get(0), result.getInitialState());
for (LRState<ItemT> state : states) {
if (state == states.get(0)) continue;
statesMap.put(state, result.newState(state.getName()));
}
for (LRState<ItemT> state : states) {
LRParserState lrState = statesMap.get(state);
for (LRTransition<ItemT> trans : state.getTransitions()) {
if (trans.getSymbol() instanceof NonTerminal) {
NonTerminal nt = (NonTerminal) trans.getSymbol();
lrState.addNextState(nt, statesMap.get(trans.getTarget()));
}
}
for (Symbol s : grammar().getSymbols()) {
if (!(s instanceof Terminal)) continue;
Terminal t = (Terminal) s;
if (!state.hasRecords(s)) continue;
LRActionRecord<ItemT> rec = state.getRecord(t);
LRParserAction<LRParserState> action;
if (rec.getAction() instanceof LRParserAction.Shift<?>) {
LRParserAction.Shift<LRState<ItemT>> shift = (LRParserAction.Shift<LRState<ItemT>>) rec.getAction();
action = LRParserAction.shift(statesMap.get(shift.getState()));
} else if (rec.getAction() instanceof LRParserAction.Reduce<?>) {
LRParserAction.Reduce<LRState<ItemT>> reduce = (LRParserAction.Reduce<LRState<ItemT>>) rec.getAction();
action = LRParserAction.reduce(reduce.getRule());
} else if (rec.getAction() instanceof LRParserAction.Accept<?>) {
action = LRParserAction.accept();
} else if (rec.getAction() instanceof LRParserAction.Error<?>) {
action = LRParserAction.error();
} else {
throw new IllegalStateException();
}
lrState.addAction(t, action);
}
}
return result;
}