Skip to content

Commit ab7f796

Browse files
authored
Disambiguate parenthesized range expressions from call expressions (#100)
* disambiguate parenthesized range expressions from call expressions * regenerate parser for 'range_expression' Co-authored-by: resolritter <[email protected]>
1 parent 2beedf2 commit ab7f796

File tree

4 files changed

+56859
-56687
lines changed

4 files changed

+56859
-56687
lines changed

corpus/expressions.txt

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,9 @@ Range expressions
125125
..;
126126
1..b;
127127
a..b;
128+
1..(1);
129+
(1)..1;
130+
(1)..(1);
128131

129132
---
130133

@@ -134,7 +137,16 @@ a..b;
134137
(range_expression (integer_literal))
135138
(range_expression)
136139
(range_expression (integer_literal) (identifier))
137-
(range_expression (identifier) (identifier)))
140+
(range_expression (identifier) (identifier))
141+
(range_expression
142+
(integer_literal)
143+
(parenthesized_expression (integer_literal)))
144+
(range_expression
145+
(parenthesized_expression (integer_literal))
146+
(integer_literal))
147+
(range_expression
148+
(parenthesized_expression (integer_literal))
149+
(parenthesized_expression (integer_literal))))
138150

139151
============================================
140152
Assignment expressions
@@ -802,4 +814,4 @@ let three_ranges = [const { (0..=5).into_inner() }; 3];
802814
(integer_literal)))
803815
field: (field_identifier))
804816
arguments: (arguments))))
805-
length: (integer_literal))))
817+
length: (integer_literal))))

grammar.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
const PREC = {
2+
range: 15,
23
call: 14,
34
field: 13,
45
unary: 11,
@@ -11,7 +12,6 @@ const PREC = {
1112
comparative: 4,
1213
and: 3,
1314
or: 2,
14-
range: 1,
1515
assign: 0,
1616
closure: -1,
1717
}
@@ -914,7 +914,10 @@ module.exports = grammar({
914914
),
915915

916916
range_expression: $ => prec.left(PREC.range, choice(
917-
seq($._expression, choice('..', '...', '..='), $._expression),
917+
prec.left(
918+
PREC.range + 1,
919+
seq($._expression, choice('..', '...', '..='), $._expression)
920+
),
918921
seq($._expression, '..'),
919922
seq('..', $._expression),
920923
'..'

src/grammar.json

Lines changed: 33 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -5025,39 +5025,43 @@
50255025
},
50265026
"range_expression": {
50275027
"type": "PREC_LEFT",
5028-
"value": 1,
5028+
"value": 15,
50295029
"content": {
50305030
"type": "CHOICE",
50315031
"members": [
50325032
{
5033-
"type": "SEQ",
5034-
"members": [
5035-
{
5036-
"type": "SYMBOL",
5037-
"name": "_expression"
5038-
},
5039-
{
5040-
"type": "CHOICE",
5041-
"members": [
5042-
{
5043-
"type": "STRING",
5044-
"value": ".."
5045-
},
5046-
{
5047-
"type": "STRING",
5048-
"value": "..."
5049-
},
5050-
{
5051-
"type": "STRING",
5052-
"value": "..="
5053-
}
5054-
]
5055-
},
5056-
{
5057-
"type": "SYMBOL",
5058-
"name": "_expression"
5059-
}
5060-
]
5033+
"type": "PREC_LEFT",
5034+
"value": 16,
5035+
"content": {
5036+
"type": "SEQ",
5037+
"members": [
5038+
{
5039+
"type": "SYMBOL",
5040+
"name": "_expression"
5041+
},
5042+
{
5043+
"type": "CHOICE",
5044+
"members": [
5045+
{
5046+
"type": "STRING",
5047+
"value": ".."
5048+
},
5049+
{
5050+
"type": "STRING",
5051+
"value": "..."
5052+
},
5053+
{
5054+
"type": "STRING",
5055+
"value": "..="
5056+
}
5057+
]
5058+
},
5059+
{
5060+
"type": "SYMBOL",
5061+
"name": "_expression"
5062+
}
5063+
]
5064+
}
50615065
},
50625066
{
50635067
"type": "SEQ",

0 commit comments

Comments
 (0)