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/lexer.go | |
parent | Remove Peek* functions (diff) | |
download | tre-ff10e6c495101bc0a73de66d1f28f180f3b562a7.tar.gz tre-ff10e6c495101bc0a73de66d1f28f180f3b562a7.tar.xz |
Add transition table compressor
Diffstat (limited to 'driver/lexer.go')
-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] } |