Skip to content

Commit e8d11a0

Browse files
authored
refactor(parser): re-introduce calls to then, and recover from errors in with conditions. (VirusTotal#578)
Using `then` is required to avoid the parser from going deep into syntax rules when it already failed, however readability was improved by removing unnecessary closures. Also, the parser is now able to recover from errors inside the condition of `with` statements.
1 parent c109c87 commit e8d11a0

39 files changed

Lines changed: 485 additions & 242 deletions

parser/src/parser/mod.rs

Lines changed: 151 additions & 142 deletions
Large diffs are not rendered by default.

parser/src/parser/tests/testdata/basic-error-1.cststream

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ Token { kind: WHITESPACE, span: Span(9..10) }
77
Token { kind: L_BRACE, span: Span(10..11) }
88
Begin { kind: ERROR, span: Span(11..56) }
99
Token { kind: L_BRACE, span: Span(11..12) }
10-
Error { message: "expecting `meta`, `strings` or `condition`, found `{`", span: Span(11..12) }
1110
Token { kind: NEWLINE, span: Span(12..13) }
1211
Token { kind: WHITESPACE, span: Span(13..15) }
1312
Token { kind: META_KW, span: Span(15..19) }
@@ -30,4 +29,5 @@ End { kind: ERROR, span: Span(11..56) }
3029
Token { kind: NEWLINE, span: Span(56..57) }
3130
Token { kind: R_BRACE, span: Span(57..58) }
3231
End { kind: RULE_DECL, span: Span(0..58) }
32+
Error { message: "expecting `meta`, `strings` or `condition`, found `{`", span: Span(11..12) }
3333
End { kind: SOURCE_FILE, span: Span(0..58) }

parser/src/parser/tests/testdata/basic-error-2.cststream

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ End { kind: ERROR, span: Span(14..32) }
2121
Token { kind: WHITESPACE, span: Span(32..33) }
2222
Begin { kind: ERROR, span: Span(33..37) }
2323
Token { kind: UNKNOWN, span: Span(33..37) }
24-
Error { message: "unclosed literal string", span: Span(33..37) }
2524
End { kind: ERROR, span: Span(33..37) }
2625
Token { kind: NEWLINE, span: Span(37..38) }
2726
Token { kind: WHITESPACE, span: Span(38..40) }
@@ -39,4 +38,5 @@ End { kind: CONDITION_BLK, span: Span(40..60) }
3938
Token { kind: NEWLINE, span: Span(60..61) }
4039
Token { kind: R_BRACE, span: Span(61..62) }
4140
End { kind: RULE_DECL, span: Span(0..62) }
41+
Error { message: "unclosed literal string", span: Span(33..37) }
4242
End { kind: SOURCE_FILE, span: Span(0..62) }

parser/src/parser/tests/testdata/basic-error-4.cst

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
11
SOURCE_FILE@0..26
2-
RULE_DECL@0..26
2+
ERROR@0..26
33
RULE_KW@0..4 "rule"
4-
ERROR@4..24
5-
L_BRACE@4..5 "{"
6-
NEWLINE@5..6 "\n"
7-
WHITESPACE@6..7 "\t"
8-
CONDITION_KW@7..16 "condition"
9-
COLON@16..17 ":"
10-
NEWLINE@17..18 "\n"
11-
WHITESPACE@18..20 "\t\t"
12-
TRUE_KW@20..24 "true"
4+
L_BRACE@4..5 "{"
5+
NEWLINE@5..6 "\n"
6+
WHITESPACE@6..7 "\t"
7+
CONDITION_KW@7..16 "condition"
8+
COLON@16..17 ":"
9+
NEWLINE@17..18 "\n"
10+
WHITESPACE@18..20 "\t\t"
11+
TRUE_KW@20..24 "true"
1312
NEWLINE@24..25 "\n"
1413
R_BRACE@25..26 "}"
1514

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,16 @@
11
Begin { kind: SOURCE_FILE, span: Span(0..26) }
2-
Begin { kind: RULE_DECL, span: Span(0..26) }
2+
Begin { kind: ERROR, span: Span(0..26) }
33
Token { kind: RULE_KW, span: Span(0..4) }
4-
Begin { kind: ERROR, span: Span(4..24) }
54
Token { kind: L_BRACE, span: Span(4..5) }
6-
Error { message: "expecting identifier, found `{`", span: Span(4..5) }
75
Token { kind: NEWLINE, span: Span(5..6) }
86
Token { kind: WHITESPACE, span: Span(6..7) }
97
Token { kind: CONDITION_KW, span: Span(7..16) }
108
Token { kind: COLON, span: Span(16..17) }
119
Token { kind: NEWLINE, span: Span(17..18) }
1210
Token { kind: WHITESPACE, span: Span(18..20) }
1311
Token { kind: TRUE_KW, span: Span(20..24) }
14-
End { kind: ERROR, span: Span(4..24) }
1512
Token { kind: NEWLINE, span: Span(24..25) }
1613
Token { kind: R_BRACE, span: Span(25..26) }
17-
End { kind: RULE_DECL, span: Span(0..26) }
14+
End { kind: ERROR, span: Span(0..26) }
15+
Error { message: "expecting identifier, found `{`", span: Span(4..5) }
1816
End { kind: SOURCE_FILE, span: Span(0..26) }

parser/src/parser/tests/testdata/basic-error-5.cststream

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,6 @@ Token { kind: IDENT, span: Span(5..9) }
66
Token { kind: WHITESPACE, span: Span(9..10) }
77
Token { kind: L_BRACE, span: Span(10..11) }
88
Token { kind: R_BRACE, span: Span(11..12) }
9-
Error { message: "expecting `meta`, `strings` or `condition`, found `}`", span: Span(11..12) }
109
End { kind: RULE_DECL, span: Span(0..12) }
10+
Error { message: "expecting `meta`, `strings` or `condition`, found `}`", span: Span(11..12) }
1111
End { kind: SOURCE_FILE, span: Span(0..12) }

parser/src/parser/tests/testdata/bitwise-ops-error-1.cststream

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,6 @@ End { kind: ERROR, span: Span(30..33) }
3232
End { kind: CONDITION_BLK, span: Span(13..33) }
3333
Token { kind: NEWLINE, span: Span(33..34) }
3434
Token { kind: R_BRACE, span: Span(34..35) }
35-
Error { message: "expecting `(`, `[`, expression, `%`, operator, `of` or `}`, found `~`", span: Span(30..31) }
3635
End { kind: RULE_DECL, span: Span(0..35) }
36+
Error { message: "expecting `(`, `[`, expression, `%`, operator, `of` or `}`, found `~`", span: Span(30..31) }
3737
End { kind: SOURCE_FILE, span: Span(0..35) }

parser/src/parser/tests/testdata/expr-error-1.cststream

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,8 @@ End { kind: ERROR, span: Span(34..36) }
3434
End { kind: CONDITION_BLK, span: Span(15..36) }
3535
Token { kind: NEWLINE, span: Span(36..37) }
3636
Token { kind: R_BRACE, span: Span(37..38) }
37-
Error { message: "expecting expression or identifier, found `}`", span: Span(37..38) }
3837
End { kind: RULE_DECL, span: Span(0..38) }
38+
Error { message: "expecting expression or identifier, found `}`", span: Span(37..38) }
3939
Token { kind: NEWLINE, span: Span(38..39) }
4040
Token { kind: NEWLINE, span: Span(39..40) }
4141
Begin { kind: RULE_DECL, span: Span(40..81) }
@@ -74,8 +74,8 @@ End { kind: ERROR, span: Span(70..79) }
7474
End { kind: CONDITION_BLK, span: Span(55..79) }
7575
Token { kind: NEWLINE, span: Span(79..80) }
7676
Token { kind: R_BRACE, span: Span(80..81) }
77-
Error { message: "expecting expression or identifier, found `+`", span: Span(71..72) }
7877
End { kind: RULE_DECL, span: Span(40..81) }
78+
Error { message: "expecting expression or identifier, found `+`", span: Span(71..72) }
7979
Token { kind: NEWLINE, span: Span(81..82) }
8080
Token { kind: NEWLINE, span: Span(82..83) }
8181
Begin { kind: RULE_DECL, span: Span(83..121) }
@@ -111,8 +111,8 @@ End { kind: ERROR, span: Span(113..119) }
111111
End { kind: CONDITION_BLK, span: Span(98..119) }
112112
Token { kind: NEWLINE, span: Span(119..120) }
113113
Token { kind: R_BRACE, span: Span(120..121) }
114-
Error { message: "expecting expression or identifier, found `==`", span: Span(115..117) }
115114
End { kind: RULE_DECL, span: Span(83..121) }
115+
Error { message: "expecting expression or identifier, found `==`", span: Span(115..117) }
116116
Token { kind: NEWLINE, span: Span(121..122) }
117117
Token { kind: NEWLINE, span: Span(122..123) }
118118
Begin { kind: RULE_DECL, span: Span(123..167) }
@@ -154,8 +154,8 @@ End { kind: ERROR, span: Span(162..165) }
154154
End { kind: CONDITION_BLK, span: Span(138..165) }
155155
Token { kind: NEWLINE, span: Span(165..166) }
156156
Token { kind: R_BRACE, span: Span(166..167) }
157-
Error { message: "expecting expression, `%`, operator, `of` or `}`, found `(`", span: Span(162..163) }
158157
End { kind: RULE_DECL, span: Span(123..167) }
158+
Error { message: "expecting expression, `%`, operator, `of` or `}`, found `(`", span: Span(162..163) }
159159
Token { kind: NEWLINE, span: Span(167..168) }
160160
Token { kind: NEWLINE, span: Span(168..169) }
161161
Begin { kind: RULE_DECL, span: Span(169..250) }
@@ -213,7 +213,7 @@ End { kind: ERROR, span: Span(238..248) }
213213
End { kind: CONDITION_BLK, span: Span(214..248) }
214214
Token { kind: NEWLINE, span: Span(248..249) }
215215
Token { kind: R_BRACE, span: Span(249..250) }
216-
Error { message: "expecting operator or `}`, found `in`", span: Span(238..240) }
217216
End { kind: RULE_DECL, span: Span(169..250) }
217+
Error { message: "expecting operator or `}`, found `in`", span: Span(238..240) }
218218
Token { kind: NEWLINE, span: Span(250..251) }
219219
End { kind: SOURCE_FILE, span: Span(0..251) }

parser/src/parser/tests/testdata/hex-patterns-error-1.cststream

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ End { kind: ERROR, span: Span(13..29) }
2121
Token { kind: WHITESPACE, span: Span(29..30) }
2222
Begin { kind: ERROR, span: Span(30..43) }
2323
Token { kind: L_BRACE, span: Span(30..31) }
24-
Error { message: "expecting BYTE or `(`, found `)`", span: Span(40..41) }
2524
Token { kind: WHITESPACE, span: Span(31..32) }
2625
Token { kind: HEX_BYTE, span: Span(32..34) }
2726
Token { kind: WHITESPACE, span: Span(34..35) }
@@ -49,6 +48,7 @@ End { kind: CONDITION_BLK, span: Span(46..64) }
4948
Token { kind: NEWLINE, span: Span(64..65) }
5049
Token { kind: R_BRACE, span: Span(65..66) }
5150
End { kind: RULE_DECL, span: Span(0..66) }
51+
Error { message: "expecting BYTE or `(`, found `)`", span: Span(40..41) }
5252
Token { kind: NEWLINE, span: Span(66..67) }
5353
Token { kind: NEWLINE, span: Span(67..68) }
5454
Begin { kind: RULE_DECL, span: Span(68..124) }
@@ -73,7 +73,6 @@ End { kind: ERROR, span: Span(81..97) }
7373
Token { kind: WHITESPACE, span: Span(97..98) }
7474
Begin { kind: ERROR, span: Span(98..101) }
7575
Token { kind: L_BRACE, span: Span(98..99) }
76-
Error { message: "expecting BYTE or `(`, found `}`", span: Span(100..101) }
7776
Token { kind: WHITESPACE, span: Span(99..100) }
7877
Token { kind: R_BRACE, span: Span(100..101) }
7978
End { kind: ERROR, span: Span(98..101) }
@@ -93,4 +92,5 @@ End { kind: CONDITION_BLK, span: Span(104..122) }
9392
Token { kind: NEWLINE, span: Span(122..123) }
9493
Token { kind: R_BRACE, span: Span(123..124) }
9594
End { kind: RULE_DECL, span: Span(68..124) }
95+
Error { message: "expecting BYTE or `(`, found `}`", span: Span(100..101) }
9696
End { kind: SOURCE_FILE, span: Span(0..124) }

parser/src/parser/tests/testdata/hex-patterns-error-2.cststream

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ End { kind: ERROR, span: Span(13..29) }
2121
Token { kind: WHITESPACE, span: Span(29..30) }
2222
Begin { kind: ERROR, span: Span(30..35) }
2323
Token { kind: L_BRACE, span: Span(30..31) }
24-
Error { message: "expecting `[`, BYTE, `(` or `}`, found `0`", span: Span(33..34) }
2524
Token { kind: HEX_BYTE, span: Span(31..33) }
2625
Token { kind: INTEGER_LIT, span: Span(33..34) }
2726
Token { kind: R_BRACE, span: Span(34..35) }
@@ -42,6 +41,7 @@ End { kind: CONDITION_BLK, span: Span(38..56) }
4241
Token { kind: NEWLINE, span: Span(56..57) }
4342
Token { kind: R_BRACE, span: Span(57..58) }
4443
End { kind: RULE_DECL, span: Span(0..58) }
44+
Error { message: "expecting `[`, BYTE, `(` or `}`, found `0`", span: Span(33..34) }
4545
Token { kind: NEWLINE, span: Span(58..59) }
4646
Token { kind: NEWLINE, span: Span(59..60) }
4747
Begin { kind: RULE_DECL, span: Span(60..118) }
@@ -66,7 +66,6 @@ End { kind: ERROR, span: Span(73..89) }
6666
Token { kind: WHITESPACE, span: Span(89..90) }
6767
Begin { kind: ERROR, span: Span(90..95) }
6868
Token { kind: L_BRACE, span: Span(90..91) }
69-
Error { message: "expecting `[`, BYTE, `(` or `}`, found `a`", span: Span(93..94) }
7069
Token { kind: HEX_BYTE, span: Span(91..93) }
7170
Token { kind: IDENT, span: Span(93..94) }
7271
Token { kind: R_BRACE, span: Span(94..95) }
@@ -87,4 +86,5 @@ End { kind: CONDITION_BLK, span: Span(98..116) }
8786
Token { kind: NEWLINE, span: Span(116..117) }
8887
Token { kind: R_BRACE, span: Span(117..118) }
8988
End { kind: RULE_DECL, span: Span(60..118) }
89+
Error { message: "expecting `[`, BYTE, `(` or `}`, found `a`", span: Span(93..94) }
9090
End { kind: SOURCE_FILE, span: Span(0..118) }

0 commit comments

Comments
 (0)