]> git.ipfire.org Git - thirdparty/jinja.git/commitdiff
Fix AST for conditional expressions
authorKevin <kevin@kevin-brown.com>
Sun, 10 May 2020 21:34:50 +0000 (17:34 -0400)
committerKevin <kevin@kevin-brown.com>
Sun, 10 May 2020 21:34:50 +0000 (17:34 -0400)
Previously all conditional expressions were left associative which
produced an AST that was nothing like the one in Jinja and one which
did not respect order of operations within conditions. The conditional
expression part of the grammar has been rewritten to be more explicit
about what can and cannot match which appears to have fixed those
issues with the AST.

grammar.ebnf

index f04cede105ec508990473cb31ccb2b212cedb090..0c47bba99fdb27daa4a87faa72cb5b333d01d660 100644 (file)
@@ -212,17 +212,45 @@ variable_accessor_call_parameter_key
 \r
 variable_accessor_call_parameter_value\r
     =\r
-    | variable_tests\r
+    | conditional_expression\r
     | variable_identifier\r
     ;\r
 \r
+conditional_expression\r
+    =\r
+    | conditional_expression_logical\r
+    | conditional_expression_comparator\r
+    | conditional_expression_test\r
+    ;\r
+\r
+conditional_expression_logical\r
+    =\r
+    left:conditional_expression\r
+    {SP}* logical_operator:variable_tests_logical_operator {SP}*\r
+    right:conditional_expression\r
+    ;\r
+\r
+conditional_expression_comparator\r
+    =\r
+    left:variable_identifier\r
+    {SP}* comparator:variable_tests_comparator {SP}*\r
+    right:variable_identifier\r
+    ;\r
+\r
+conditional_expression_test\r
+    =\r
+    test_variable:variable_identifier\r
+    {SP}* "is" {SP}*\r
+    test_function:variable_identifier\r
+    ;\r
+\r
 variable_tests\r
     =\r
-    left:variable_identifier {SP}*\r
+    left:variable_tests {SP}*\r
     (\r
+        | ( logical_operator:variable_tests_logical_operator {SP}* right:variable_tests )\r
+        | ( comparator:variable_tests_comparator {SP}* right:variable_tests )\r
         | ( "is" {SP}* test_function:variable_accessor_call_parameter_value )\r
-        | ( comparator:variable_tests_comparator {SP}* right:variable_accessor_call_parameter_value )\r
-        | ( logical_operator:variable_tests_logical_operator {SP}* right:variable_accessor_call_parameter_value )\r
     )\r
     ;\r
 \r