public LRParserTable generateTable()

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;
  }