add precedence to conditionals; add test for conditional associativity

This commit is contained in:
mhoffm
2021-06-18 07:17:21 +02:00
parent b04366fc76
commit f4b4b4f026
4 changed files with 706 additions and 677 deletions

View File

@@ -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),

View File

@@ -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"

File diff suppressed because it is too large Load Diff

View File

@@ -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)))))))))