Skip to content

Commit 1271c62

Browse files
committed
Provide token friendly names in err messages
1 parent 977b171 commit 1271c62

File tree

2 files changed

+36
-16
lines changed

2 files changed

+36
-16
lines changed

internal/filter/lexer.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,21 @@ import (
1414
// Currently, it allows to match any character except a LogicalOp and CompOperator.
1515
var identifiersMatcher = regexp.MustCompile("[^!&|~<>=()]")
1616

17+
// tokenDisplayNames contains a list of all the defined parser tokens and their respective
18+
// friendly names used to output in error messages.
19+
var tokenDisplayNames = map[string]string{
20+
"$unk": "\"unknown\"",
21+
"T_EQUAL": "\"=\"",
22+
"T_UNEQUAL": "\"!=\"",
23+
"T_LIKE": "\"~\"",
24+
"T_UNLIKE": "\"!~\"",
25+
"T_LESS_THAN": "\"<\"",
26+
"T_GREATER_THAN": "\">\"",
27+
"T_LESS_THAN_OR_EQUAL": "\"<=\"",
28+
"T_GREATER_THAN_OR_EQUAL": "\">=\"",
29+
"T_IDENTIFIER": "\"column or value\"",
30+
}
31+
1732
// init just sets the global yyErrorVerbose variable to true.
1833
func init() {
1934
// Enable parsers error verbose to get more context of the parsing failures
@@ -139,6 +154,11 @@ func (l *Lexer) Lex(yyval *yySymType) int {
139154
// our lexer with some additional context instead. This function then wraps the provided err
140155
// and adds line, column number and offset to the error string.
141156
func (l *Lexer) Error(s string) {
157+
// Replace all parser token names by their corresponding friendly names.
158+
for token, name := range tokenDisplayNames {
159+
s = strings.ReplaceAll(s, token, name)
160+
}
161+
142162
l.err = fmt.Errorf("%d:%d (%d): %s", l.Line, l.Column, l.Offset, s)
143163

144164
// Always reset the current filter rule when encountering an error.

internal/filter/parser_test.go

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,13 @@ func TestParser(t *testing.T) {
1414
t.Parallel()
1515

1616
_, err := Parse("(a=b|c=d)e=f")
17-
assert.EqualError(t, err, "1:10 (9): syntax error: unexpected T_IDENTIFIER")
17+
assert.EqualError(t, err, "1:10 (9): syntax error: unexpected \"column or value\"")
1818

1919
_, err = Parse("(a=b|c=d|)e=f")
20-
assert.EqualError(t, err, "1:10 (9): syntax error: unexpected \")\", expecting T_IDENTIFIER or \"(\"")
20+
assert.EqualError(t, err, "1:10 (9): syntax error: unexpected \")\", expecting \"column or value\" or \"(\"")
2121

2222
_, err = Parse("col=(")
23-
assert.EqualError(t, err, "1:5 (4): syntax error: unexpected \"(\", expecting T_IDENTIFIER")
23+
assert.EqualError(t, err, "1:5 (4): syntax error: unexpected \"(\", expecting \"column or value\"")
2424

2525
_, err = Parse("(((x=a)&y=b")
2626
assert.EqualError(t, err, "1:12 (11): syntax error: unexpected $end, expecting \")\"")
@@ -29,10 +29,10 @@ func TestParser(t *testing.T) {
2929
assert.EqualError(t, err, "1:10 (9): syntax error: unexpected \")\"")
3030

3131
_, err = Parse("!(&")
32-
assert.EqualError(t, err, "1:3 (2): syntax error: unexpected \"&\", expecting T_IDENTIFIER or \"(\"")
32+
assert.EqualError(t, err, "1:3 (2): syntax error: unexpected \"&\", expecting \"column or value\" or \"(\"")
3333

3434
_, err = Parse("foo&bar=(te(st)")
35-
assert.EqualError(t, err, "1:9 (8): syntax error: unexpected \"(\", expecting T_IDENTIFIER")
35+
assert.EqualError(t, err, "1:9 (8): syntax error: unexpected \"(\", expecting \"column or value\"")
3636

3737
_, err = Parse("foo&bar=te(st)")
3838
assert.EqualError(t, err, "1:11 (10): syntax error: unexpected \"(\"")
@@ -41,37 +41,37 @@ func TestParser(t *testing.T) {
4141
assert.EqualError(t, err, "1:13 (12): syntax error: unexpected \")\"")
4242

4343
_, err = Parse("!()|&()&)")
44-
assert.EqualError(t, err, "1:3 (2): syntax error: unexpected \")\", expecting T_IDENTIFIER or \"(\"")
44+
assert.EqualError(t, err, "1:3 (2): syntax error: unexpected \")\", expecting \"column or value\" or \"(\"")
4545

4646
_, err = Parse("=foo")
47-
assert.EqualError(t, err, "1:1 (0): syntax error: unexpected T_EQUAL, expecting T_IDENTIFIER or \"(\"")
47+
assert.EqualError(t, err, "1:1 (0): syntax error: unexpected \"=\", expecting \"column or value\" or \"(\"")
4848

4949
_, err = Parse("foo>")
50-
assert.EqualError(t, err, "1:5 (4): syntax error: unexpected $end, expecting T_IDENTIFIER")
50+
assert.EqualError(t, err, "1:5 (4): syntax error: unexpected $end, expecting \"column or value\"")
5151

5252
_, err = Parse("foo==")
53-
assert.EqualError(t, err, "1:5 (4): syntax error: unexpected T_EQUAL, expecting T_IDENTIFIER")
53+
assert.EqualError(t, err, "1:5 (4): syntax error: unexpected \"=\", expecting \"column or value\"")
5454

5555
_, err = Parse("=>foo")
56-
assert.EqualError(t, err, "1:1 (0): syntax error: unexpected T_EQUAL, expecting T_IDENTIFIER or \"(\"")
56+
assert.EqualError(t, err, "1:1 (0): syntax error: unexpected \"=\", expecting \"column or value\" or \"(\"")
5757

5858
_, err = Parse("&foo")
59-
assert.EqualError(t, err, "1:1 (0): syntax error: unexpected \"&\", expecting T_IDENTIFIER or \"(\"")
59+
assert.EqualError(t, err, "1:1 (0): syntax error: unexpected \"&\", expecting \"column or value\" or \"(\"")
6060

6161
_, err = Parse("&&foo")
62-
assert.EqualError(t, err, "1:1 (0): syntax error: unexpected \"&\", expecting T_IDENTIFIER or \"(\"")
62+
assert.EqualError(t, err, "1:1 (0): syntax error: unexpected \"&\", expecting \"column or value\" or \"(\"")
6363

6464
_, err = Parse("(&foo=bar)")
65-
assert.EqualError(t, err, "1:2 (1): syntax error: unexpected \"&\", expecting T_IDENTIFIER or \"(\"")
65+
assert.EqualError(t, err, "1:2 (1): syntax error: unexpected \"&\", expecting \"column or value\" or \"(\"")
6666

6767
_, err = Parse("(foo=bar|)")
68-
assert.EqualError(t, err, "1:10 (9): syntax error: unexpected \")\", expecting T_IDENTIFIER or \"(\"")
68+
assert.EqualError(t, err, "1:10 (9): syntax error: unexpected \")\", expecting \"column or value\" or \"(\"")
6969

7070
_, err = Parse("((((((")
71-
assert.EqualError(t, err, "1:7 (6): syntax error: unexpected $end, expecting T_IDENTIFIER or \"(\"")
71+
assert.EqualError(t, err, "1:7 (6): syntax error: unexpected $end, expecting \"column or value\" or \"(\"")
7272

7373
_, err = Parse("foo&bar&col=val!=val")
74-
assert.EqualError(t, err, "1:17 (16): syntax error: unexpected T_UNEQUAL")
74+
assert.EqualError(t, err, "1:17 (16): syntax error: unexpected \"!=\"")
7575

7676
_, err = Parse("col%7umn")
7777
assert.EqualError(t, err, "invalid URL escape \"%7u\"")

0 commit comments

Comments
 (0)