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