add precedence to conditionals; add test for conditional associativity
This commit is contained in:
@@ -20,7 +20,7 @@ module.exports = grammar({
|
||||
[$.object_elem, $.variable_expr],
|
||||
[$.attr_splat],
|
||||
[$.full_splat],
|
||||
[$.conditional],
|
||||
// string literals are just quoted template without template stuff
|
||||
[$.string_lit, $.quoted_template],
|
||||
],
|
||||
|
||||
@@ -215,13 +215,13 @@ module.exports = grammar({
|
||||
|
||||
ellipsis: $ => token('...'),
|
||||
|
||||
conditional: $ => seq(
|
||||
conditional: $ => prec.left(seq(
|
||||
$.expression,
|
||||
'?',
|
||||
$.expression,
|
||||
':',
|
||||
$.expression,
|
||||
),
|
||||
)),
|
||||
|
||||
operation: $ => choice($.unary_operation, $.binary_operation),
|
||||
|
||||
|
||||
@@ -798,29 +798,33 @@
|
||||
}
|
||||
},
|
||||
"conditional": {
|
||||
"type": "SEQ",
|
||||
"members": [
|
||||
{
|
||||
"type": "SYMBOL",
|
||||
"name": "expression"
|
||||
},
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": "?"
|
||||
},
|
||||
{
|
||||
"type": "SYMBOL",
|
||||
"name": "expression"
|
||||
},
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": ":"
|
||||
},
|
||||
{
|
||||
"type": "SYMBOL",
|
||||
"name": "expression"
|
||||
}
|
||||
]
|
||||
"type": "PREC_LEFT",
|
||||
"value": 0,
|
||||
"content": {
|
||||
"type": "SEQ",
|
||||
"members": [
|
||||
{
|
||||
"type": "SYMBOL",
|
||||
"name": "expression"
|
||||
},
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": "?"
|
||||
},
|
||||
{
|
||||
"type": "SYMBOL",
|
||||
"name": "expression"
|
||||
},
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": ":"
|
||||
},
|
||||
{
|
||||
"type": "SYMBOL",
|
||||
"name": "expression"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"operation": {
|
||||
"type": "CHOICE",
|
||||
@@ -1228,9 +1232,6 @@
|
||||
[
|
||||
"full_splat"
|
||||
],
|
||||
[
|
||||
"conditional"
|
||||
],
|
||||
[
|
||||
"string_lit",
|
||||
"quoted_template"
|
||||
|
||||
1290
src/parser.c
1290
src/parser.c
File diff suppressed because it is too large
Load Diff
@@ -56,3 +56,37 @@ foo = ( true ? false : true ) ? "yes" : "no"
|
||||
(literal_value
|
||||
(string_lit
|
||||
(template_literal)))))))))
|
||||
|
||||
================================================================================
|
||||
nested conditional expression expression without parentheses
|
||||
================================================================================
|
||||
|
||||
foo = true ? false : true ? "yes" : "no"
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
(config_file
|
||||
(body
|
||||
(attribute
|
||||
(identifier)
|
||||
(expression
|
||||
(conditional
|
||||
(expression
|
||||
(conditional
|
||||
(expression
|
||||
(literal_value
|
||||
(bool_lit)))
|
||||
(expression
|
||||
(literal_value
|
||||
(bool_lit)))
|
||||
(expression
|
||||
(literal_value
|
||||
(bool_lit)))))
|
||||
(expression
|
||||
(literal_value
|
||||
(string_lit
|
||||
(template_literal))))
|
||||
(expression
|
||||
(literal_value
|
||||
(string_lit
|
||||
(template_literal)))))))))
|
||||
|
||||
Reference in New Issue
Block a user