234 lines
3.0 KiB
Go
234 lines
3.0 KiB
Go
// Code generated by gocc; DO NOT EDIT.
|
|
|
|
package lexer
|
|
|
|
import (
|
|
"os"
|
|
"unicode/utf8"
|
|
|
|
"azalea/schema/token"
|
|
)
|
|
|
|
const (
|
|
NoState = -1
|
|
NumStates = 211
|
|
NumSymbols = 101
|
|
)
|
|
|
|
type Lexer struct {
|
|
src []byte
|
|
pos int
|
|
line int
|
|
column int
|
|
Context token.Context
|
|
}
|
|
|
|
func NewLexer(src []byte) *Lexer {
|
|
lexer := &Lexer{
|
|
src: src,
|
|
pos: 0,
|
|
line: 1,
|
|
column: 1,
|
|
Context: nil,
|
|
}
|
|
return lexer
|
|
}
|
|
|
|
// SourceContext is a simple instance of a token.Context which
|
|
// contains the name of the source file.
|
|
type SourceContext struct {
|
|
Filepath string
|
|
}
|
|
|
|
func (s *SourceContext) Source() string {
|
|
return s.Filepath
|
|
}
|
|
|
|
func NewLexerFile(fpath string) (*Lexer, error) {
|
|
src, err := os.ReadFile(fpath)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
lexer := NewLexer(src)
|
|
lexer.Context = &SourceContext{Filepath: fpath}
|
|
return lexer, nil
|
|
}
|
|
|
|
func (l *Lexer) Scan() (tok *token.Token) {
|
|
tok = &token.Token{}
|
|
if l.pos >= len(l.src) {
|
|
tok.Type = token.EOF
|
|
tok.Pos.Offset, tok.Pos.Line, tok.Pos.Column = l.pos, l.line, l.column
|
|
tok.Pos.Context = l.Context
|
|
return
|
|
}
|
|
start, startLine, startColumn, end := l.pos, l.line, l.column, 0
|
|
tok.Type = token.INVALID
|
|
state, rune1, size := 0, rune(-1), 0
|
|
for state != -1 {
|
|
if l.pos >= len(l.src) {
|
|
rune1 = -1
|
|
} else {
|
|
rune1, size = utf8.DecodeRune(l.src[l.pos:])
|
|
l.pos += size
|
|
}
|
|
|
|
nextState := -1
|
|
if rune1 != -1 {
|
|
nextState = TransTab[state](rune1)
|
|
}
|
|
state = nextState
|
|
|
|
if state != -1 {
|
|
|
|
switch rune1 {
|
|
case '\n':
|
|
l.line++
|
|
l.column = 1
|
|
case '\r':
|
|
l.column = 1
|
|
case '\t':
|
|
l.column += 4
|
|
default:
|
|
l.column++
|
|
}
|
|
|
|
switch {
|
|
case ActTab[state].Accept != -1:
|
|
tok.Type = ActTab[state].Accept
|
|
end = l.pos
|
|
case ActTab[state].Ignore != "":
|
|
start, startLine, startColumn = l.pos, l.line, l.column
|
|
state = 0
|
|
if start >= len(l.src) {
|
|
tok.Type = token.EOF
|
|
}
|
|
|
|
}
|
|
} else {
|
|
if tok.Type == token.INVALID {
|
|
end = l.pos
|
|
}
|
|
}
|
|
}
|
|
if end > start {
|
|
l.pos = end
|
|
tok.Lit = l.src[start:end]
|
|
} else {
|
|
tok.Lit = []byte{}
|
|
}
|
|
tok.Pos.Offset, tok.Pos.Line, tok.Pos.Column = start, startLine, startColumn
|
|
tok.Pos.Context = l.Context
|
|
|
|
return
|
|
}
|
|
|
|
func (l *Lexer) Reset() {
|
|
l.pos = 0
|
|
}
|
|
|
|
/*
|
|
Lexer symbols:
|
|
0: '''
|
|
1: '''
|
|
2: 'i'
|
|
3: '('
|
|
4: ')'
|
|
5: '.'
|
|
6: '`'
|
|
7: '`'
|
|
8: '"'
|
|
9: '"'
|
|
10: '\'
|
|
11: 'u'
|
|
12: '\'
|
|
13: 'U'
|
|
14: '\'
|
|
15: 'a'
|
|
16: 'b'
|
|
17: 'f'
|
|
18: 'n'
|
|
19: 'r'
|
|
20: 't'
|
|
21: 'v'
|
|
22: '\'
|
|
23: '''
|
|
24: '"'
|
|
25: '\'
|
|
26: '\'
|
|
27: 'x'
|
|
28: '_'
|
|
29: '_'
|
|
30: '_'
|
|
31: '_'
|
|
32: '-'
|
|
33: '+'
|
|
34: '0'
|
|
35: 'b'
|
|
36: 'B'
|
|
37: '-'
|
|
38: '+'
|
|
39: '0'
|
|
40: 'o'
|
|
41: 'O'
|
|
42: '-'
|
|
43: '+'
|
|
44: '-'
|
|
45: '+'
|
|
46: '0'
|
|
47: 'x'
|
|
48: 'X'
|
|
49: 'e'
|
|
50: 'E'
|
|
51: '+'
|
|
52: '-'
|
|
53: '-'
|
|
54: '+'
|
|
55: '.'
|
|
56: '.'
|
|
57: 'p'
|
|
58: 'P'
|
|
59: '+'
|
|
60: '-'
|
|
61: '_'
|
|
62: '.'
|
|
63: '_'
|
|
64: '.'
|
|
65: '-'
|
|
66: '+'
|
|
67: '0'
|
|
68: 'x'
|
|
69: 'X'
|
|
70: '_'
|
|
71: '~'
|
|
72: '!'
|
|
73: '@'
|
|
74: '#'
|
|
75: '$'
|
|
76: '%'
|
|
77: '^'
|
|
78: '&'
|
|
79: '*'
|
|
80: '-'
|
|
81: '_'
|
|
82: '+'
|
|
83: '='
|
|
84: '?'
|
|
85: '/'
|
|
86: '.'
|
|
87: ' '
|
|
88: '\t'
|
|
89: '\n'
|
|
90: '\r'
|
|
91: ';'
|
|
92: '\n'
|
|
93: '0'-'1'
|
|
94: '2'-'7'
|
|
95: '8'-'9'
|
|
96: 'A'-'F'
|
|
97: 'a'-'f'
|
|
98: 'A'-'Z'
|
|
99: 'a'-'z'
|
|
100: .
|
|
*/
|