Skip to content

Commit 0014271

Browse files
committed
Fix the precedence of as casts
1 parent 41e23b4 commit 0014271

File tree

4 files changed

+2973
-2933
lines changed

4 files changed

+2973
-2933
lines changed

corpus/expressions.txt

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -285,7 +285,7 @@ Type cast expressions
285285

286286
1000 as u8;
287287
let character = integer as char;
288-
let size: f64 = len(values) as f64;
288+
let size: f64 = 1.0 + -len(values) as f64 + 1.0;
289289

290290
--------------------------------------------------------------------------------
291291

@@ -302,12 +302,17 @@ let size: f64 = len(values) as f64;
302302
(let_declaration
303303
pattern: (identifier)
304304
type: (primitive_type)
305-
value: (type_cast_expression
306-
value: (call_expression
307-
function: (identifier)
308-
arguments: (arguments
309-
(identifier)))
310-
type: (primitive_type))))
305+
value: (binary_expression
306+
left: (binary_expression
307+
left: (float_literal)
308+
right: (type_cast_expression
309+
value: (unary_expression
310+
(call_expression
311+
function: (identifier)
312+
arguments: (arguments
313+
(identifier))))
314+
type: (primitive_type)))
315+
right: (float_literal))))
311316

312317
================================================================================
313318
Call expressions

grammar.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@ const PREC = {
22
range: 15,
33
call: 14,
44
field: 13,
5-
unary: 11,
5+
unary: 12,
6+
cast: 11,
67
multiplicative: 10,
78
additive: 9,
89
shift: 8,
@@ -1074,11 +1075,11 @@ module.exports = grammar({
10741075
field('right', $._expression)
10751076
)),
10761077

1077-
type_cast_expression: $ => seq(
1078+
type_cast_expression: $ => prec.left(PREC.cast, seq(
10781079
field('value', $._expression),
10791080
'as',
10801081
field('type', $._type)
1081-
),
1082+
)),
10821083

10831084
return_expression: $ => choice(
10841085
prec.left(seq('return', $._expression)),

src/grammar.json

Lines changed: 28 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -5798,7 +5798,7 @@
57985798
},
57995799
"unary_expression": {
58005800
"type": "PREC",
5801-
"value": 11,
5801+
"value": 12,
58025802
"content": {
58035803
"type": "SEQ",
58045804
"members": [
@@ -5841,7 +5841,7 @@
58415841
},
58425842
"reference_expression": {
58435843
"type": "PREC",
5844-
"value": 11,
5844+
"value": 12,
58455845
"content": {
58465846
"type": "SEQ",
58475847
"members": [
@@ -6334,29 +6334,33 @@
63346334
}
63356335
},
63366336
"type_cast_expression": {
6337-
"type": "SEQ",
6338-
"members": [
6339-
{
6340-
"type": "FIELD",
6341-
"name": "value",
6342-
"content": {
6343-
"type": "SYMBOL",
6344-
"name": "_expression"
6345-
}
6346-
},
6347-
{
6348-
"type": "STRING",
6349-
"value": "as"
6350-
},
6351-
{
6352-
"type": "FIELD",
6353-
"name": "type",
6354-
"content": {
6355-
"type": "SYMBOL",
6356-
"name": "_type"
6337+
"type": "PREC_LEFT",
6338+
"value": 11,
6339+
"content": {
6340+
"type": "SEQ",
6341+
"members": [
6342+
{
6343+
"type": "FIELD",
6344+
"name": "value",
6345+
"content": {
6346+
"type": "SYMBOL",
6347+
"name": "_expression"
6348+
}
6349+
},
6350+
{
6351+
"type": "STRING",
6352+
"value": "as"
6353+
},
6354+
{
6355+
"type": "FIELD",
6356+
"name": "type",
6357+
"content": {
6358+
"type": "SYMBOL",
6359+
"name": "_type"
6360+
}
63576361
}
6358-
}
6359-
]
6362+
]
6363+
}
63606364
},
63616365
"return_expression": {
63626366
"type": "CHOICE",

0 commit comments

Comments
 (0)