Skip to content

Commit bd38dc6

Browse files
committed
feat(parser): recover from errors in for conditions.
In the same way that `with` expressions, now `for` expressions recover from syntax errors in their conditions.
1 parent e8d11a0 commit bd38dc6

5 files changed

Lines changed: 156 additions & 1 deletion

File tree

parser/src/parser/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1630,7 +1630,7 @@ impl ParserImpl<'_> {
16301630
.end_alt()
16311631
.expect(t!(COLON))
16321632
.expect(t!(L_PAREN))
1633-
.then(Self::boolean_expr)
1633+
.then(|p| p.boolean_expr().recover(t!(R_PAREN)))
16341634
.expect(t!(R_PAREN))
16351635
.end()
16361636
}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
ERRORS:
2+
- SyntaxError { message: "expecting identifier, found `)`", span: Span(95..96) }
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
SOURCE_FILE@0..98
2+
RULE_DECL@0..98
3+
RULE_KW@0..4 "rule"
4+
WHITESPACE@4..5 " "
5+
IDENT@5..9 "test"
6+
WHITESPACE@9..10 " "
7+
L_BRACE@10..11 "{"
8+
NEWLINE@11..12 "\n"
9+
WHITESPACE@12..14 " "
10+
PATTERNS_BLK@14..52
11+
STRINGS_KW@14..21 "strings"
12+
COLON@21..22 ":"
13+
NEWLINE@22..23 "\n"
14+
WHITESPACE@23..27 " "
15+
PATTERN_DEF@27..37
16+
PATTERN_IDENT@27..29 "$a"
17+
WHITESPACE@29..30 " "
18+
EQUAL@30..31 "="
19+
WHITESPACE@31..32 " "
20+
STRING_LIT@32..37 "\"foo\""
21+
NEWLINE@37..38 "\n"
22+
WHITESPACE@38..42 " "
23+
PATTERN_DEF@42..52
24+
PATTERN_IDENT@42..44 "$b"
25+
WHITESPACE@44..45 " "
26+
EQUAL@45..46 "="
27+
WHITESPACE@46..47 " "
28+
STRING_LIT@47..52 "\"bar\""
29+
NEWLINE@52..53 "\n"
30+
WHITESPACE@53..55 " "
31+
CONDITION_BLK@55..96
32+
CONDITION_KW@55..64 "condition"
33+
COLON@64..65 ":"
34+
NEWLINE@65..66 "\n"
35+
WHITESPACE@66..70 " "
36+
BOOLEAN_EXPR@70..96
37+
BOOLEAN_TERM@70..96
38+
FOR_EXPR@70..96
39+
FOR_KW@70..73 "for"
40+
WHITESPACE@73..74 " "
41+
QUANTIFIER@74..77
42+
ALL_KW@74..77 "all"
43+
WHITESPACE@77..78 " "
44+
OF_KW@78..80 "of"
45+
WHITESPACE@80..81 " "
46+
THEM_KW@81..85 "them"
47+
WHITESPACE@85..86 " "
48+
COLON@86..87 ":"
49+
WHITESPACE@87..88 " "
50+
L_PAREN@88..89 "("
51+
WHITESPACE@89..90 " "
52+
BOOLEAN_EXPR@90..93
53+
BOOLEAN_TERM@90..93
54+
EXPR@90..93
55+
TERM@90..93
56+
PRIMARY_EXPR@90..93
57+
IDENT@90..93 "foo"
58+
ERROR@93..94
59+
DOT@93..94 "."
60+
WHITESPACE@94..95 " "
61+
R_PAREN@95..96 ")"
62+
NEWLINE@96..97 "\n"
63+
R_BRACE@97..98 "}"
64+
65+
ERRORS:
66+
- [95..96]: expecting identifier, found `)`
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
Begin { kind: SOURCE_FILE, span: Span(0..98) }
2+
Begin { kind: RULE_DECL, span: Span(0..98) }
3+
Token { kind: RULE_KW, span: Span(0..4) }
4+
Token { kind: WHITESPACE, span: Span(4..5) }
5+
Token { kind: IDENT, span: Span(5..9) }
6+
Token { kind: WHITESPACE, span: Span(9..10) }
7+
Token { kind: L_BRACE, span: Span(10..11) }
8+
Token { kind: NEWLINE, span: Span(11..12) }
9+
Token { kind: WHITESPACE, span: Span(12..14) }
10+
Begin { kind: PATTERNS_BLK, span: Span(14..52) }
11+
Token { kind: STRINGS_KW, span: Span(14..21) }
12+
Token { kind: COLON, span: Span(21..22) }
13+
Token { kind: NEWLINE, span: Span(22..23) }
14+
Token { kind: WHITESPACE, span: Span(23..27) }
15+
Begin { kind: PATTERN_DEF, span: Span(27..37) }
16+
Token { kind: PATTERN_IDENT, span: Span(27..29) }
17+
Token { kind: WHITESPACE, span: Span(29..30) }
18+
Token { kind: EQUAL, span: Span(30..31) }
19+
Token { kind: WHITESPACE, span: Span(31..32) }
20+
Token { kind: STRING_LIT, span: Span(32..37) }
21+
End { kind: PATTERN_DEF, span: Span(27..37) }
22+
Token { kind: NEWLINE, span: Span(37..38) }
23+
Token { kind: WHITESPACE, span: Span(38..42) }
24+
Begin { kind: PATTERN_DEF, span: Span(42..52) }
25+
Token { kind: PATTERN_IDENT, span: Span(42..44) }
26+
Token { kind: WHITESPACE, span: Span(44..45) }
27+
Token { kind: EQUAL, span: Span(45..46) }
28+
Token { kind: WHITESPACE, span: Span(46..47) }
29+
Token { kind: STRING_LIT, span: Span(47..52) }
30+
End { kind: PATTERN_DEF, span: Span(42..52) }
31+
End { kind: PATTERNS_BLK, span: Span(14..52) }
32+
Token { kind: NEWLINE, span: Span(52..53) }
33+
Token { kind: WHITESPACE, span: Span(53..55) }
34+
Begin { kind: CONDITION_BLK, span: Span(55..96) }
35+
Token { kind: CONDITION_KW, span: Span(55..64) }
36+
Token { kind: COLON, span: Span(64..65) }
37+
Token { kind: NEWLINE, span: Span(65..66) }
38+
Token { kind: WHITESPACE, span: Span(66..70) }
39+
Begin { kind: BOOLEAN_EXPR, span: Span(70..96) }
40+
Begin { kind: BOOLEAN_TERM, span: Span(70..96) }
41+
Begin { kind: FOR_EXPR, span: Span(70..96) }
42+
Token { kind: FOR_KW, span: Span(70..73) }
43+
Token { kind: WHITESPACE, span: Span(73..74) }
44+
Begin { kind: QUANTIFIER, span: Span(74..77) }
45+
Token { kind: ALL_KW, span: Span(74..77) }
46+
End { kind: QUANTIFIER, span: Span(74..77) }
47+
Token { kind: WHITESPACE, span: Span(77..78) }
48+
Token { kind: OF_KW, span: Span(78..80) }
49+
Token { kind: WHITESPACE, span: Span(80..81) }
50+
Token { kind: THEM_KW, span: Span(81..85) }
51+
Token { kind: WHITESPACE, span: Span(85..86) }
52+
Token { kind: COLON, span: Span(86..87) }
53+
Token { kind: WHITESPACE, span: Span(87..88) }
54+
Token { kind: L_PAREN, span: Span(88..89) }
55+
Token { kind: WHITESPACE, span: Span(89..90) }
56+
Begin { kind: BOOLEAN_EXPR, span: Span(90..93) }
57+
Begin { kind: BOOLEAN_TERM, span: Span(90..93) }
58+
Begin { kind: EXPR, span: Span(90..93) }
59+
Begin { kind: TERM, span: Span(90..93) }
60+
Begin { kind: PRIMARY_EXPR, span: Span(90..93) }
61+
Token { kind: IDENT, span: Span(90..93) }
62+
End { kind: PRIMARY_EXPR, span: Span(90..93) }
63+
End { kind: TERM, span: Span(90..93) }
64+
End { kind: EXPR, span: Span(90..93) }
65+
End { kind: BOOLEAN_TERM, span: Span(90..93) }
66+
End { kind: BOOLEAN_EXPR, span: Span(90..93) }
67+
Begin { kind: ERROR, span: Span(93..94) }
68+
Token { kind: DOT, span: Span(93..94) }
69+
End { kind: ERROR, span: Span(93..94) }
70+
Token { kind: WHITESPACE, span: Span(94..95) }
71+
Token { kind: R_PAREN, span: Span(95..96) }
72+
End { kind: FOR_EXPR, span: Span(70..96) }
73+
End { kind: BOOLEAN_TERM, span: Span(70..96) }
74+
End { kind: BOOLEAN_EXPR, span: Span(70..96) }
75+
End { kind: CONDITION_BLK, span: Span(55..96) }
76+
Token { kind: NEWLINE, span: Span(96..97) }
77+
Token { kind: R_BRACE, span: Span(97..98) }
78+
End { kind: RULE_DECL, span: Span(0..98) }
79+
Error { message: "expecting identifier, found `)`", span: Span(95..96) }
80+
End { kind: SOURCE_FILE, span: Span(0..98) }
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
rule test {
2+
strings:
3+
$a = "foo"
4+
$b = "bar"
5+
condition:
6+
for all of them : ( foo. )
7+
}

0 commit comments

Comments
 (0)