-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathimpl.go
126 lines (101 loc) · 2.05 KB
/
impl.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
package parser
import "github.com/iNamik/go_lexer"
// Parser::Line
func (p *parser) Line() int {
return p.PeekToken(0).Line()
}
// Parser::Column
func (p *parser) Column() int {
return p.PeekToken(0).Column()
}
// Parser::Next - Returns the next emit from the parser.
func (p *parser) Next() interface{} {
for {
select {
case i := <-p.chn:
return i
default:
p.state = p.state(p)
}
}
panic("not reached")
}
// Parser::PeekTokenType
func (p *parser) PeekTokenType(n int) lexer.TokenType {
return p.PeekToken(n).Type()
}
// Parser::PeekToken
func (p *parser) PeekToken(n int) *lexer.Token {
ok := p.ensureTokenLen(p.pos + n + 1) // Correct for 0-based 'n'
if !ok {
if nil == p.eofToken {
panic("illegal state: eofToken is nil")
}
return p.eofToken
}
i := p.tokens.Peek(p.pos + n)
return i.(*lexer.Token)
}
// Parser::NextToken
func (p *parser) NextToken() *lexer.Token {
ok := p.ensureTokenLen(p.pos + 1)
if !ok {
if nil == p.eofToken {
panic("illegal state: eofToken is nil")
}
return p.eofToken
}
i := p.tokens.Peek(p.pos) // 0-based
p.pos++
return i.(*lexer.Token)
}
// Parser::SkipToken
func (p *parser) SkipToken() {
ok := p.ensureTokenLen(p.pos + 1)
if ok {
p.pos++
}
}
// Parser::SkipTokens
func (p *parser) SkipTokens(n int) {
ok := p.ensureTokenLen(p.pos + n + 1)
if ok {
p.pos += n
}
}
// Parser::BackupToken
func (p *parser) BackupToken() {
p.BackupTokens(1)
}
// Parser::BackupTokens
func (p *parser) BackupTokens(n int) {
if n > p.pos {
panic("Underflow Exception")
}
p.pos -= n
}
// Parser::ClearTokens
func (p *parser) ClearTokens() {
for ; p.pos > 0; p.pos-- {
p.tokens.Remove()
}
}
// Parser::Emit
func (p *parser) Emit(i interface{}) {
p.chn <- i
}
// Parser::EOF
func (p *parser) EOF() bool {
return p.eof
}
// Parser::Marker
func (p *parser) Marker() *Marker {
return &Marker{sequence: p.sequence, pos: p.pos}
}
// Parser::Reset
func (p *parser) Reset(m *Marker) {
if m.sequence != p.sequence || m.pos < 0 || m.pos >= p.tokens.Len() {
panic("Invalid marker")
}
p.pos = m.pos
}