Skip to content

Commit e9aea00

Browse files
committed
extract parser error rendering and token labels
1 parent a79a3c7 commit e9aea00

2 files changed

Lines changed: 104 additions & 103 deletions

File tree

vibes/parser.go

Lines changed: 0 additions & 103 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,5 @@
11
package vibes
22

3-
import (
4-
"fmt"
5-
"strings"
6-
)
7-
8-
type parseError struct {
9-
pos Position
10-
msg string
11-
source string
12-
}
13-
14-
func (e *parseError) Error() string {
15-
var b strings.Builder
16-
fmt.Fprintf(&b, "parse error at %d:%d: %s", e.pos.Line, e.pos.Column, e.msg)
17-
if frame := formatCodeFrame(e.source, e.pos); frame != "" {
18-
b.WriteString("\n")
19-
b.WriteString(frame)
20-
}
21-
return b.String()
22-
}
23-
243
type (
254
prefixParseFn func() Expression
265
infixParseFn func(Expression) Expression
@@ -137,85 +116,3 @@ func (p *parser) expectPeek(tt TokenType) bool {
137116
p.errorExpected(p.peekToken, tokenLabel(tt))
138117
return false
139118
}
140-
141-
func (p *parser) errorExpected(tok Token, expected string) {
142-
p.addParseError(tok.Pos, fmt.Sprintf("expected %s, got %s", expected, tokenLabel(tok.Type)))
143-
}
144-
145-
func (p *parser) errorUnexpected(tok Token) {
146-
p.addParseError(tok.Pos, fmt.Sprintf("unexpected token %s", tokenLabel(tok.Type)))
147-
}
148-
149-
func (p *parser) addParseError(pos Position, msg string) {
150-
p.errors = append(p.errors, &parseError{pos: pos, msg: msg, source: p.l.input})
151-
}
152-
153-
func tokenLabel(tt TokenType) string {
154-
switch tt {
155-
case tokenIllegal:
156-
return "invalid token"
157-
case tokenEOF:
158-
return "end of input"
159-
case tokenIdent:
160-
return "identifier"
161-
case tokenInt:
162-
return "integer"
163-
case tokenFloat:
164-
return "float"
165-
case tokenString:
166-
return "string"
167-
case tokenSymbol:
168-
return "symbol"
169-
case tokenIvar:
170-
return "instance variable"
171-
case tokenClassVar:
172-
return "class variable"
173-
case tokenDef:
174-
return "'def'"
175-
case tokenClass:
176-
return "'class'"
177-
case tokenExport:
178-
return "'export'"
179-
case tokenSelf:
180-
return "'self'"
181-
case tokenPrivate:
182-
return "'private'"
183-
case tokenProperty:
184-
return "'property'"
185-
case tokenGetter:
186-
return "'getter'"
187-
case tokenSetter:
188-
return "'setter'"
189-
case tokenEnd:
190-
return "'end'"
191-
case tokenRaise:
192-
return "'raise'"
193-
case tokenReturn:
194-
return "'return'"
195-
case tokenYield:
196-
return "'yield'"
197-
case tokenDo:
198-
return "'do'"
199-
case tokenFor:
200-
return "'for'"
201-
case tokenIn:
202-
return "'in'"
203-
case tokenIf:
204-
return "'if'"
205-
case tokenElsif:
206-
return "'elsif'"
207-
case tokenElse:
208-
return "'else'"
209-
case tokenTrue:
210-
return "'true'"
211-
case tokenFalse:
212-
return "'false'"
213-
case tokenNil:
214-
return "'nil'"
215-
default:
216-
if len(tt) == 1 || strings.HasPrefix(string(tt), "<") || strings.HasPrefix(string(tt), ">") {
217-
return fmt.Sprintf("%q", string(tt))
218-
}
219-
return fmt.Sprintf("%q", strings.ToLower(string(tt)))
220-
}
221-
}

vibes/parser_errors.go

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
package vibes
2+
3+
import (
4+
"fmt"
5+
"strings"
6+
)
7+
8+
type parseError struct {
9+
pos Position
10+
msg string
11+
source string
12+
}
13+
14+
func (e *parseError) Error() string {
15+
var b strings.Builder
16+
fmt.Fprintf(&b, "parse error at %d:%d: %s", e.pos.Line, e.pos.Column, e.msg)
17+
if frame := formatCodeFrame(e.source, e.pos); frame != "" {
18+
b.WriteString("\n")
19+
b.WriteString(frame)
20+
}
21+
return b.String()
22+
}
23+
24+
func (p *parser) errorExpected(tok Token, expected string) {
25+
p.addParseError(tok.Pos, fmt.Sprintf("expected %s, got %s", expected, tokenLabel(tok.Type)))
26+
}
27+
28+
func (p *parser) errorUnexpected(tok Token) {
29+
p.addParseError(tok.Pos, fmt.Sprintf("unexpected token %s", tokenLabel(tok.Type)))
30+
}
31+
32+
func (p *parser) addParseError(pos Position, msg string) {
33+
p.errors = append(p.errors, &parseError{pos: pos, msg: msg, source: p.l.input})
34+
}
35+
36+
func tokenLabel(tt TokenType) string {
37+
switch tt {
38+
case tokenIllegal:
39+
return "invalid token"
40+
case tokenEOF:
41+
return "end of input"
42+
case tokenIdent:
43+
return "identifier"
44+
case tokenInt:
45+
return "integer"
46+
case tokenFloat:
47+
return "float"
48+
case tokenString:
49+
return "string"
50+
case tokenSymbol:
51+
return "symbol"
52+
case tokenIvar:
53+
return "instance variable"
54+
case tokenClassVar:
55+
return "class variable"
56+
case tokenDef:
57+
return "'def'"
58+
case tokenClass:
59+
return "'class'"
60+
case tokenExport:
61+
return "'export'"
62+
case tokenSelf:
63+
return "'self'"
64+
case tokenPrivate:
65+
return "'private'"
66+
case tokenProperty:
67+
return "'property'"
68+
case tokenGetter:
69+
return "'getter'"
70+
case tokenSetter:
71+
return "'setter'"
72+
case tokenEnd:
73+
return "'end'"
74+
case tokenRaise:
75+
return "'raise'"
76+
case tokenReturn:
77+
return "'return'"
78+
case tokenYield:
79+
return "'yield'"
80+
case tokenDo:
81+
return "'do'"
82+
case tokenFor:
83+
return "'for'"
84+
case tokenIn:
85+
return "'in'"
86+
case tokenIf:
87+
return "'if'"
88+
case tokenElsif:
89+
return "'elsif'"
90+
case tokenElse:
91+
return "'else'"
92+
case tokenTrue:
93+
return "'true'"
94+
case tokenFalse:
95+
return "'false'"
96+
case tokenNil:
97+
return "'nil'"
98+
default:
99+
if len(tt) == 1 || strings.HasPrefix(string(tt), "<") || strings.HasPrefix(string(tt), ">") {
100+
return fmt.Sprintf("%q", string(tt))
101+
}
102+
return fmt.Sprintf("%q", strings.ToLower(string(tt)))
103+
}
104+
}

0 commit comments

Comments
 (0)