This repository has been archived by the owner on Apr 30, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
translate.py
57 lines (50 loc) · 1.81 KB
/
translate.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#!/usr/bin/env python3
""" Max Zinkus """
from sexpdata import load, car as left, cdr as right, Symbol
λ = 'λ'
class LCException(Exception):
pass
def load_lc(filename):
""" Load a lambda calculus file into sexpdata """
with open(filename, 'r') as f:
return load(f)
def parseTree(tree):
if type(tree) == list and tree:
if tree[0] == Symbol("+"):
return ("((%s) + (%s))" % (
parseTree(tree[1]), parseTree(tree[2]))
) + parseTree(tree[3:])
elif tree[0] == Symbol("*"):
return ("((%s) * (%s))" % (
parseTree(tree[1]), parseTree(tree[2]))
) + parseTree(tree[3:])
elif tree[0] == Symbol("println"):
return ("print(%s)" % parseTree(tree[1])) + parseTree(tree[2:])
elif tree[0] == Symbol("ifleq0"):
return ("(%s if (%s) <= 0 else %s)" % (
parseTree(tree[2]), parseTree(tree[1]),
parseTree(tree[3]))) + parseTree(tree[4:])
elif tree[0] == Symbol('λ'):
return ("(lambda %s: %s)" % (parseTree(tree[1]),
parseTree(tree[2]))) + parseTree(tree[3:])
elif len(tree) == 2:
return ("(%s)(%s)" % (
parseTree(tree[0]),
parseTree(tree[1])))
elif len(tree) == 1:
return "%s" % parseTree(tree[0])
elif tree:
return "%s" % ' '.join(list(map(parseTree, tree)))
else:
raise LCException
elif type(tree) == Symbol:
return "%s" % str(tree.value())
elif type(tree) is str:
return tree
elif type(tree) is int:
return str(tree)
return ""
if __name__ == '__main__':
from sys import argv
if len(argv) > 1:
print(parseTree(load_lc(argv[1])))