]> git.ipfire.org Git - thirdparty/jinja.git/commitdiff
Add support for math expressions to grammar/parser
authorKevin <kevin@kevin-brown.com>
Thu, 14 May 2020 15:21:20 +0000 (11:21 -0400)
committerKevin <kevin@kevin-brown.com>
Thu, 14 May 2020 15:21:20 +0000 (11:21 -0400)
grammar.ebnf
src/jinja2/new_parser.py

index 3c034ef188b74367adbb7e6afb0e0920c3c3074d..2d1406a338d021785d222dab47f8b52390e0f07e 100644 (file)
@@ -163,7 +163,7 @@ variable_identifier
 \r
 variable_identifier_parentheses\r
     =\r
-    "(" @:variable_identifier ")"\r
+    "(" @:conditional_expression ")"\r
     ;\r
 \r
 variable_identifier_raw\r
@@ -239,16 +239,52 @@ variable_accessor_call_parameter_value
 \r
 conditional_expression\r
     =\r
+    | complex_expression_powers\r
+    | complex_expression_math2\r
+    | concatenate_expression\r
+    | complex_expression_math1\r
     | conditional_expression_parentheses\r
     | conditional_expression_not\r
     | conditional_expression_if\r
     | conditional_expression_logical\r
     | conditional_expression_operator\r
     | conditional_expression_test\r
-    | concatenate_expression\r
     | variable_identifier\r
     ;\r
 \r
+complex_expression_powers\r
+    =\r
+    left:variable_identifier {SP}* operator:"**" {SP}* right:variable_identifier\r
+    ;\r
+\r
+complex_expression_math2\r
+    =\r
+    left:variable_identifier\r
+    {SP}* math_operator:complex_expression_math2_operations {SP}*\r
+    right:variable_identifier\r
+    ;\r
+\r
+complex_expression_math2_operations\r
+    =\r
+    | "*"\r
+    | "/"\r
+    | "//"\r
+    | "%"\r
+    ;\r
+\r
+complex_expression_math1\r
+    =\r
+    left:variable_identifier\r
+    {SP}* math_operator:complex_expression_math1_operations {SP}*\r
+    right:variable_identifier\r
+    ;\r
+\r
+complex_expression_math1_operations\r
+    =\r
+    | "+"\r
+    | "-"\r
+    ;\r
+\r
 conditional_expression_parentheses\r
     =\r
     "(" {SP}* @:conditional_expression {SP}* ")"\r
index 5ef1a4395866b1e4b6308844a07c3324b339e845..5503d1e2ab99baaf21bbd7df053973541c91cbb7 100644 (file)
@@ -449,6 +449,9 @@ def parse_conditional_expression(ast):
     if 'logical_operator' in ast:\r
         return parse_conditional_expression_logical(ast)\r
 \r
+    if 'math_operator' in ast:\r
+        return parse_conditional_expression_math(ast)\r
+\r
     if 'not' in ast:\r
         return parse_conditional_expression_not(ast)\r
 \r
@@ -492,6 +495,24 @@ def parse_conditional_expression_logical(ast):
         lineno=lineno_from_parseinfo(ast['parseinfo'])\r
     )\r
 \r
+def parse_conditional_expression_math(ast):\r
+    node_class_map = {\r
+        '+': nodes.Add,\r
+        '-': nodes.Sub,\r
+        '*': nodes.Mul,\r
+        '/': nodes.Div,\r
+        '//': nodes.FloorDiv,\r
+        '%': nodes.Mod,\r
+    }\r
+\r
+    node_class = node_class_map[ast['math_operator']]\r
+\r
+    return node_class(\r
+        parse_conditional_expression(ast['left']),\r
+        parse_conditional_expression(ast['right']),\r
+        lineno=lineno_from_parseinfo(ast['parseinfo'])\r
+    )\r
+\r
 def parse_conditional_expression_not(ast):\r
     return nodes.Not(\r
         parse_conditional_expression(ast['not']),\r
@@ -542,7 +563,7 @@ def parse_conditional_expression_test(ast):
 \r
     if ast['test_function_parameter']:\r
         args = [\r
-            parse_variable(ast['test_function_parameter'])\r
+            parse_conditional_expression(ast['test_function_parameter'])\r
         ]\r
 \r
     test_node = nodes.Test(\r