\r
variable_identifier_parentheses\r
=\r
- "(" @:variable_identifier ")"\r
+ "(" @:conditional_expression ")"\r
;\r
\r
variable_identifier_raw\r
\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
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
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
\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