diff options
author | Ryo Nihei <nihei.dev@gmail.com> | 2021-08-31 20:10:26 +0900 |
---|---|---|
committer | Ryo Nihei <nihei.dev@gmail.com> | 2021-08-31 20:10:26 +0900 |
commit | ccf0123d7f1b88ee7cdd4e2ea15ab9e94457538a (patch) | |
tree | 6ad35758eb1fd37a84d33266af54a4e9bd6d405e /grammar/parsing_table.go | |
parent | Refactor (diff) | |
download | cotia-ccf0123d7f1b88ee7cdd4e2ea15ab9e94457538a.tar.gz cotia-ccf0123d7f1b88ee7cdd4e2ea15ab9e94457538a.tar.xz |
Remove the expected terminals field from the parsing table
The driver searches the expected terminals corresponding to each state if necessary.
Diffstat (limited to 'grammar/parsing_table.go')
-rw-r--r-- | grammar/parsing_table.go | 29 |
1 files changed, 5 insertions, 24 deletions
diff --git a/grammar/parsing_table.go b/grammar/parsing_table.go index a82ef60..aa88ad5 100644 --- a/grammar/parsing_table.go +++ b/grammar/parsing_table.go @@ -97,12 +97,11 @@ var ( ) type ParsingTable struct { - actionTable []actionEntry - goToTable []goToEntry - stateCount int - terminalCount int - nonTerminalCount int - expectedTerminals [][]int + actionTable []actionEntry + goToTable []goToEntry + stateCount int + terminalCount int + nonTerminalCount int // errorTrapperStates's index means a state number, and when `errorTrapperStates[stateNum]` is `1`, // the state has an item having the following form. The `α` and `β` can be empty. @@ -158,7 +157,6 @@ func (b *lrTableBuilder) build() (*ParsingTable, error) { stateCount: len(b.automaton.states), terminalCount: b.termCount, nonTerminalCount: b.nonTermCount, - expectedTerminals: make([][]int, len(b.automaton.states)), errorTrapperStates: make([]int, len(b.automaton.states)), InitialState: initialState.num, } @@ -169,12 +167,9 @@ func (b *lrTableBuilder) build() (*ParsingTable, error) { ptab.errorTrapperStates[state.num] = 1 } - eTerms := map[int]struct{}{} - for sym, kID := range state.next { nextState := b.automaton.states[kID] if sym.isTerminal() { - eTerms[sym.num().Int()] = struct{}{} b.writeShiftAction(ptab, state.num, sym, nextState.num) } else { ptab.writeGoTo(state.num, sym, nextState.num) @@ -211,23 +206,9 @@ func (b *lrTableBuilder) build() (*ParsingTable, error) { } for a := range reducibleItem.lookAhead.symbols { - eTerms[a.num().Int()] = struct{}{} b.writeReduceAction(ptab, state.num, a, reducibleProd.num) } } - - ts := make([]int, len(eTerms)) - { - i := 0 - for t := range eTerms { - ts[i] = t - i++ - } - sort.Slice(ts, func(i, j int) bool { - return ts[i] < ts[j] - }) - } - ptab.expectedTerminals[state.num] = ts } return ptab, nil |