X-Git-Url: https://code.kerkeslager.com/?a=blobdiff_plain;f=generation.py;h=26945a2b79054c0e2fab1919e09416fc7a29d4d6;hb=f4f13322a77eaf87328a4279c766228bb7391978;hp=4dfd115b8522fe631d5730db14dcb62ac859d300;hpb=98d42eb47acf01ace76d57942404c09132d51f79;p=fur diff --git a/generation.py b/generation.py index 4dfd115..26945a2 100644 --- a/generation.py +++ b/generation.py @@ -12,16 +12,15 @@ def generate_integer_literal(c_integer_literal): return 'integerLiteral({})'.format(c_integer_literal.value) def generate_string_literal(c_string_literal): - def c_escape(ch): - return { - '\n': r'\n', - '"': r'\"', - '\\': r'\\', - }.get(ch, ch) - - return 'stringLiteral(runtime, "{}")'.format( - ''.join(c_escape(ch for ch in c_string_literal.value)), - ) + return 'stringLiteral(STRING_LITERAL_LIST[{}])'.format(c_string_literal.index) + +CONSTANT_EXPRESSION_MAPPING = { + 'true': 'TRUE', + 'false': 'FALSE', +} + +def generate_constant_expression(c_constant_expression): + return CONSTANT_EXPRESSION_MAPPING[c_constant_expression.value] def generate_symbol_expression(c_symbol_expression): return 'Environment_get(environment, SYMBOL_LIST[{}] /* symbol: {} */)'.format( @@ -39,25 +38,21 @@ def generate_expression(c_argument): LITERAL_TYPE_MAPPING = { transformation.CIntegerLiteral: generate_integer_literal, transformation.CStringLiteral: generate_string_literal, + transformation.CConstantExpression: generate_constant_expression, transformation.CSymbolExpression: generate_symbol_expression, } if type(c_argument) in LITERAL_TYPE_MAPPING: return LITERAL_TYPE_MAPPING[type(c_argument)](c_argument) - INFIX_TYPE_MAPPING = { - transformation.CAdditionExpression: 'add', - transformation.CSubtractionExpression: 'subtract', - transformation.CMultiplicationExpression: 'multiply', - transformation.CIntegerDivisionExpression: 'integerDivide', - transformation.CModularDivisionExpression: 'modularDivide', - } + if isinstance(c_argument, transformation.CFunctionCallForFurInfixOperator): + return 'builtin${}({}, {})'.format( + c_argument.name, + generate_expression(c_argument.left), + generate_expression(c_argument.right), + ) - return 'builtin${}({}, {})'.format( - INFIX_TYPE_MAPPING[type(c_argument)], - generate_expression(c_argument.left), - generate_expression(c_argument.right), - ) + raise Exception('Could not handle expresssion "{}"'.format(c_argument)) def generate_negation_expression(c_negation_expression): return 'builtin$negate({})'.format( @@ -90,9 +85,10 @@ def generate_statement(statement): def generate(c_program): template = ENV.get_template('program.c') return template.render( - builtins=list(sorted(c_program.builtins)), + builtins=list(sorted(c_program.builtin_set)), statements=[generate_statement(statement) for statement in c_program.statements], standard_libraries=list(sorted(c_program.standard_libraries)), + string_literal_list=c_program.string_literal_list, symbol_list=c_program.symbol_list, )