-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathAst.py
48 lines (36 loc) · 1.19 KB
/
Ast.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
class Or:
def __init__(self, left, right):
self.left = left
self.right = right
class Not:
def __init__(self, expr):
self.expr = expr
class Var:
def __init__(self, name, is_bool):
self.name = name
self.isBool = is_bool
class And:
def __init__(self, left, right):
self.left = left
self.right = right
class Eq:
def __init__(self, left, right):
self.left = left
self.right = right
class Call:
def __init__(self, fun, args):
self.fun = fun
self.args = args
def stringify(ast_node):
if isinstance(ast_node, Or):
return "(%s) | (%s)" % (stringify(ast_node.left), stringify(ast_node.right))
if isinstance(ast_node, And):
return "(%s) & (%s)" % (stringify(ast_node.left), stringify(ast_node.right))
if isinstance(ast_node, Eq):
return "%s = %s" % (stringify(ast_node.left), stringify(ast_node.right))
if isinstance(ast_node, Not):
return "!(%s)" % (stringify(ast_node.expr))
if isinstance(ast_node, Var):
return ast_node.name
if isinstance(ast_node, Call):
return "%s(%s)" % (ast_node.fun, ", ".join(map(stringify, ast_node.args)))