Better names
[fur] / generation.py
index 4dfd115..26945a2 100644 (file)
@@ -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,
     )