Added support for integers
[fur] / transformation.py
1 import collections
2
3 import parsing
4
5 CIntegerLiteral = collections.namedtuple(
6     'CIntegerLiteral',
7     [
8         'value',
9     ],
10 )
11
12 CStringLiteral = collections.namedtuple(
13     'CStringLiteral',
14     [
15         'value',
16     ],
17 )
18
19 CFunctionCallStatement = collections.namedtuple(
20     'CFunctionCallStatement',
21     [
22         'name',
23         'arguments',
24     ],
25 )
26
27 CProgram = collections.namedtuple(
28     'CProgram',
29     [
30         'builtins',
31         'statements',
32         'standard_libraries',
33     ],
34 )
35
36 BUILTINS = {
37     'print': ['stdio.h.'],
38 }
39
40 def transform_argument(builtin_dependencies, argument):
41     return {
42         parsing.IntegerLiteral: CIntegerLiteral,
43         parsing.StringLiteral: CStringLiteral,
44     }[type(argument)](value=argument.value)
45
46 def transform_function_call_statement(builtin_dependencies, function_call):
47     if function_call.name in BUILTINS.keys():
48         builtin_dependencies.add(function_call.name)
49
50         return CFunctionCallStatement(
51             name='builtin$' + function_call.name,
52             arguments=tuple(transform_argument(builtin_dependencies, arg) for arg in function_call.arguments),
53         )
54
55     raise Exception()
56
57
58 def transform(function_call):
59     builtins = set()
60
61     statement = transform_function_call_statement(builtins, function_call)
62
63     standard_libraries = set()
64     for builtin in builtins:
65         for standard_library in BUILTINS[builtin]:
66             standard_libraries.add(standard_library)
67
68     return CProgram(
69         builtins=builtins,
70         statements=[statement],
71         standard_libraries=standard_libraries,
72     )
73
74
75 if __name__ == '__main__':
76     import unittest
77
78     unittest.main()