-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathvisitor.py
127 lines (83 loc) · 2.6 KB
/
visitor.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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
from .astnodes import *
from collections import defaultdict
from .builder import Builder
from typing import List, Any
class Visitor:
def visit(self, node: Node) -> Any:
return node.visit(self)
# TOP LEVEL & DECLARATIONS
def Program(self, node: Program) -> Any:
pass
def VarDef(self, node: VarDef) -> Any:
pass
def ClassDef(self, node: ClassDef) -> Any:
pass
def FuncDef(self, node: FuncDef) -> Any:
pass
# STATEMENTS
def NonLocalDecl(self, node: NonLocalDecl) -> Any:
pass
def GlobalDecl(self, node: GlobalDecl) -> Any:
pass
def AssignStmt(self, node: AssignStmt) -> Any:
pass
def IfStmt(self, node: IfStmt) -> Any:
pass
def ExprStmt(self, node: ExprStmt) -> Any:
pass
def BinaryExpr(self, node: BinaryExpr) -> Any:
pass
def IndexExpr(self, node: IndexExpr) -> Any:
pass
def UnaryExpr(self, node: UnaryExpr) -> Any:
pass
def CallExpr(self, node: CallExpr) -> Any:
pass
def ForStmt(self, node: ForStmt) -> Any:
pass
def ListExpr(self, node: ListExpr) -> Any:
pass
def WhileStmt(self, node: WhileStmt) -> Any:
pass
def ReturnStmt(self, node: ReturnStmt) -> Any:
pass
def Identifier(self, node: Identifier) -> Any:
pass
def MemberExpr(self, node: MemberExpr) -> Any:
pass
def IfExpr(self, node: IfExpr) -> Any:
pass
def MethodCallExpr(self, node: MethodCallExpr) -> Any:
pass
# LITERALS
def BooleanLiteral(self, node: BooleanLiteral) -> Any:
pass
def IntegerLiteral(self, node: IntegerLiteral) -> Any:
pass
def NoneLiteral(self, node: NoneLiteral) -> Any:
pass
def StringLiteral(self, node: StringLiteral) -> Any:
pass
# TYPES
def TypedVar(self, node: TypedVar) -> Any:
pass
def ListType(self, node: ListType) -> Any:
pass
def ClassType(self, node: ClassType) -> Any:
pass
class CommonVisitor(Visitor):
returnType = None # for tracking return types in functions
counter = 0 # for labels
# helpers for handling locals
locals: List[defaultdict] = []
def enterScope(self):
self.locals.append(defaultdict(lambda: None))
def exitScope(self):
self.locals.pop()
# helpers for building code
def instr(self, instr: str):
self.currentBuilder().newLine(instr)
def currentBuilder(self) -> Builder:
raise Exception("unimplemented")
def emit(self) -> str:
return self.currentBuilder().emit()