X-Git-Url: https://code.kerkeslager.com/?p=fur;a=blobdiff_plain;f=normalization.py;h=1da656958bd91b78ea41a7017257f1584af4f03e;hp=1dbeddbd0642c5636c7b9950a905f81919fb4061;hb=1852539af30c364a11d2e2a0bb7944102293dcf6;hpb=2f7d76f2fc50763953b7268e0fe6558aac260187 diff --git a/normalization.py b/normalization.py index 1dbeddb..1da6569 100644 --- a/normalization.py +++ b/normalization.py @@ -9,6 +9,13 @@ NormalVariableExpression = collections.namedtuple( ], ) +NormalNegationExpression = collections.namedtuple( + 'NormalNegationExpression', + [ + 'internal_expression', + ], +) + NormalInfixExpression = collections.namedtuple( 'NormalInfixExpression', [ @@ -238,6 +245,21 @@ def normalize_infix_expression(counter, expression): 'or_level': normalize_boolean_expression, }[expression.order](counter, expression) +def normalize_negation_expression(counter, expression): + counter, prestatements, internal_expression = normalize_expression(counter, expression.value) + + internal_variable = '${}'.format(counter) + counter += 1 + + return ( + counter, + prestatements + (NormalVariableInitializationStatement(variable=internal_variable, expression=internal_expression),), + NormalNegationExpression(internal_expression=NormalVariableExpression(variable=internal_variable)), + ) + +def normalize_parenthesized_expression(counter, expression): + return normalize_expression(counter, expression.internal) + def normalize_expression(counter, expression): return { NormalInfixExpression: fake_normalization, @@ -245,8 +267,8 @@ def normalize_expression(counter, expression): parsing.FurFunctionCallExpression: normalize_function_call_expression, parsing.FurInfixExpression: normalize_infix_expression, parsing.FurIntegerLiteralExpression: fake_normalization, - parsing.FurNegationExpression: fake_normalization, # TODO Don't fake this - parsing.FurParenthesizedExpression: fake_normalization, # TODO Don't fake this + parsing.FurNegationExpression: normalize_negation_expression, + parsing.FurParenthesizedExpression: normalize_parenthesized_expression, parsing.FurStringLiteralExpression: fake_normalization, parsing.FurSymbolExpression: fake_normalization, }[type(expression)](counter, expression)