X-Git-Url: https://code.kerkeslager.com/?a=blobdiff_plain;f=normalization.py;h=618e5d9a7d1d6e59eb8a32ed8680780963d0afc6;hb=204200cd277191bd0a272528b2a811cbdb7990a0;hp=a41eb8df0e9211d09f3191d12b8977ca54189bbd;hpb=ab984279c92601b321db123984c753aa862daad8;p=fur diff --git a/normalization.py b/normalization.py index a41eb8d..618e5d9 100644 --- a/normalization.py +++ b/normalization.py @@ -1,6 +1,7 @@ import collections import parsing +import util NormalVariableExpression = collections.namedtuple( 'NormalVariableExpression', @@ -9,6 +10,27 @@ NormalVariableExpression = collections.namedtuple( ], ) +NormalIntegerLiteralExpression = collections.namedtuple( + 'NormalIntegerLiteralExpression', + [ + 'integer', + ], +) + +NormalStringLiteralExpression = collections.namedtuple( + 'NormalStringLiteralExpression', + [ + 'string', + ], +) + +NormalSymbolExpression = collections.namedtuple( + 'NormalSymbolExpression', + [ + 'symbol', + ], +) + NormalNegationExpression = collections.namedtuple( 'NormalNegationExpression', [ @@ -66,6 +88,14 @@ NormalExpressionStatement = collections.namedtuple( ], ) +NormalAssignmentStatement = collections.namedtuple( + 'NormalAssignmentStatement', + [ + 'target', + 'expression', + ], +) + NormalIfElseStatement = collections.namedtuple( 'NormalIfElseStatement', [ @@ -75,6 +105,15 @@ NormalIfElseStatement = collections.namedtuple( ], ) +NormalFunctionDefinitionStatement = collections.namedtuple( + 'NormalFunctionDefinitionStatement', + [ + 'name', + 'argument_name_list', + 'statement_list', + ], +) + NormalProgram = collections.namedtuple( 'NormalProgram', [ @@ -85,6 +124,30 @@ NormalProgram = collections.namedtuple( def fake_normalization(counter, thing): return (counter, (), thing) +def normalize_integer_literal_expression(counter, expression): + # TODO Store this in a C variable + return ( + counter, + (), + NormalIntegerLiteralExpression(integer=expression.integer), + ) + +def normalize_string_literal_expression(counter, expression): + # TODO Store this in a C variable + return ( + counter, + (), + NormalStringLiteralExpression(string=expression.string), + ) + +def normalize_symbol_expression(counter, expression): + # TODO Store this in a C variable + return ( + counter, + (), + NormalSymbolExpression(symbol=expression.symbol), + ) + def normalize_function_call_expression(counter, expression): assert isinstance(expression, parsing.FurFunctionCallExpression) @@ -115,11 +178,19 @@ def normalize_function_call_expression(counter, expression): items=tuple(arguments), )) + counter, function_prestatements, function_expression = normalize_expression( + counter, + expression.function, + ) + + for ps in function_prestatements: + prestatements.append(ps) + return ( counter, tuple(prestatements), NormalFunctionCallExpression( - function=expression.function, # TODO Normalize the function + function=function_expression, argument_count=len(arguments), argument_items=NormalVariableExpression(variable=arguments_variable), ), @@ -149,7 +220,7 @@ def normalize_basic_infix_operation(counter, expression): counter, left_prestatements + right_prestatements + root_prestatements, NormalInfixExpression( - order=expression.order, # TODO Do we need this? + order=expression.order, operator=expression.operator, left=NormalVariableExpression(variable=left_variable), right=NormalVariableExpression(variable=right_variable), @@ -185,9 +256,8 @@ def normalize_comparison_expression(counter, expression): counter, result_prestatements, result_expression = ( counter, left_prestatements + right_prestatements + root_prestatements, - # TODO Implement short-circuiting NormalInfixExpression( - order=expression.order, # TODO Do we need this? + order=expression.order, operator=expression.operator, left=NormalVariableExpression(variable=left_variable), right=NormalVariableExpression(variable=right_variable), @@ -275,26 +345,20 @@ def normalize_negation_expression(counter, 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, NormalVariableExpression: fake_normalization, parsing.FurFunctionCallExpression: normalize_function_call_expression, parsing.FurInfixExpression: normalize_infix_expression, - parsing.FurIntegerLiteralExpression: fake_normalization, + parsing.FurIntegerLiteralExpression: normalize_integer_literal_expression, parsing.FurNegationExpression: normalize_negation_expression, - parsing.FurParenthesizedExpression: normalize_parenthesized_expression, - parsing.FurStringLiteralExpression: fake_normalization, - parsing.FurSymbolExpression: fake_normalization, + parsing.FurStringLiteralExpression: normalize_string_literal_expression, + parsing.FurSymbolExpression: normalize_symbol_expression, }[type(expression)](counter, expression) def normalize_expression_statement(counter, statement): - counter, prestatements, normalized = { - parsing.FurFunctionCallExpression: normalize_function_call_expression, - }[type(statement.expression)](counter, statement.expression) + counter, prestatements, normalized = normalize_expression(counter, statement.expression) return ( counter, @@ -302,22 +366,47 @@ def normalize_expression_statement(counter, statement): NormalExpressionStatement(expression=normalized), ) +def normalize_function_definition_statement(counter, statement): + return ( + counter, + (), + NormalFunctionDefinitionStatement( + name=statement.name, + argument_name_list=statement.argument_name_list, + statement_list=normalize_statement_list(statement.statement_list), + ), + ) + +def normalize_assignment_statement(counter, statement): + counter, prestatements, normalized_expression = normalize_expression(counter, statement.expression) + return ( + counter, + prestatements, + NormalAssignmentStatement( + target=statement.target, + expression=normalized_expression, + ), + ) + def normalize_statement(counter, statement): return { + parsing.FurAssignmentStatement: normalize_assignment_statement, parsing.FurExpressionStatement: normalize_expression_statement, - parsing.FurAssignmentStatement: fake_normalization, + parsing.FurFunctionDefinitionStatement: normalize_function_definition_statement, }[type(statement)](counter, statement) -def normalize(program): +@util.force_generator(tuple) +def normalize_statement_list(statement_list): counter = 0 - statement_list = [] - for statement in program.statement_list: + for statement in statement_list: counter, prestatements, normalized = normalize_statement(counter, statement) for s in prestatements: - statement_list.append(s) - statement_list.append(normalized) + yield s + yield normalized + +def normalize(program): return NormalProgram( - statement_list=statement_list, + statement_list=normalize_statement_list(program.statement_list), )