Disambiguate parenthesized range expressions from call expressions (#100)

* disambiguate parenthesized range expressions from call expressions

* regenerate parser for 'range_expression'

Co-authored-by: resolritter <resolritter@users.noreply.github.com>
ida_star
João Paulo Silva de Souza 2021-02-17 02:17:08 +07:00 committed by GitHub
parent 2beedf23be
commit ab7f796207
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 56859 additions and 56687 deletions

@ -125,6 +125,9 @@ Range expressions
..;
1..b;
a..b;
1..(1);
(1)..1;
(1)..(1);
---
@ -134,7 +137,16 @@ a..b;
(range_expression (integer_literal))
(range_expression)
(range_expression (integer_literal) (identifier))
(range_expression (identifier) (identifier)))
(range_expression (identifier) (identifier))
(range_expression
(integer_literal)
(parenthesized_expression (integer_literal)))
(range_expression
(parenthesized_expression (integer_literal))
(integer_literal))
(range_expression
(parenthesized_expression (integer_literal))
(parenthesized_expression (integer_literal))))
============================================
Assignment expressions
@ -802,4 +814,4 @@ let three_ranges = [const { (0..=5).into_inner() }; 3];
(integer_literal)))
field: (field_identifier))
arguments: (arguments))))
length: (integer_literal))))
length: (integer_literal))))

@ -1,4 +1,5 @@
const PREC = {
range: 15,
call: 14,
field: 13,
unary: 11,
@ -11,7 +12,6 @@ const PREC = {
comparative: 4,
and: 3,
or: 2,
range: 1,
assign: 0,
closure: -1,
}
@ -914,7 +914,10 @@ module.exports = grammar({
),
range_expression: $ => prec.left(PREC.range, choice(
seq($._expression, choice('..', '...', '..='), $._expression),
prec.left(
PREC.range + 1,
seq($._expression, choice('..', '...', '..='), $._expression)
),
seq($._expression, '..'),
seq('..', $._expression),
'..'

62
src/grammar.json vendored

@ -5025,39 +5025,43 @@
},
"range_expression": {
"type": "PREC_LEFT",
"value": 1,
"value": 15,
"content": {
"type": "CHOICE",
"members": [
{
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "_expression"
},
{
"type": "CHOICE",
"members": [
{
"type": "STRING",
"value": ".."
},
{
"type": "STRING",
"value": "..."
},
{
"type": "STRING",
"value": "..="
}
]
},
{
"type": "SYMBOL",
"name": "_expression"
}
]
"type": "PREC_LEFT",
"value": 16,
"content": {
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "_expression"
},
{
"type": "CHOICE",
"members": [
{
"type": "STRING",
"value": ".."
},
{
"type": "STRING",
"value": "..."
},
{
"type": "STRING",
"value": "..="
}
]
},
{
"type": "SYMBOL",
"name": "_expression"
}
]
}
},
{
"type": "SEQ",

113461
src/parser.c vendored

File diff suppressed because it is too large Load Diff