diff options
| author | Ryo Nihei <nihei.dev@gmail.com> | 2021-05-07 21:57:47 +0900 |
|---|---|---|
| committer | Ryo Nihei <nihei.dev@gmail.com> | 2021-05-07 21:57:47 +0900 |
| commit | ff10e6c495101bc0a73de66d1f28f180f3b562a7 (patch) | |
| tree | e92904c540855e52f5dce3ccd53fb9a586657b04 /driver | |
| parent | Remove Peek* functions (diff) | |
| download | tre-ff10e6c495101bc0a73de66d1f28f180f3b562a7.tar.gz tre-ff10e6c495101bc0a73de66d1f28f180f3b562a7.tar.xz | |
Add transition table compressor
Diffstat (limited to 'driver')
| -rw-r--r-- | driver/lexer.go | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/driver/lexer.go b/driver/lexer.go index 486ff7d..485bfd9 100644 --- a/driver/lexer.go +++ b/driver/lexer.go @@ -255,12 +255,8 @@ func (l *lexer) next() (*Token, error) { } buf = append(buf, v) unfixedBufLen++ - entry := spec.DFA.Transition[state] - if len(entry) == 0 { - return nil, fmt.Errorf("no transition entry; state: %v", state) - } - nextState := entry[v] - if nextState == 0 { + nextState, ok := l.lookupNextState(mode, state, int(v)) + if !ok { if tok != nil { l.unread(unfixedBufLen) return tok, nil @@ -276,6 +272,16 @@ func (l *lexer) next() (*Token, error) { } } +func (l *lexer) lookupNextState(mode spec.LexModeNum, state int, v int) (int, bool) { + tab := l.clspec.Specs[mode].DFA.Transition + rowNum := tab.RowNums[state] + d := tab.UniqueEntries.RowDisplacement[rowNum] + if tab.UniqueEntries.Bounds[d+v] != rowNum { + return tab.UniqueEntries.EmptyValue, false + } + return tab.UniqueEntries.Entries[d+v], true +} + func (l *lexer) mode() spec.LexModeNum { return l.modeStack[len(l.modeStack)-1] } |
