-
Notifications
You must be signed in to change notification settings - Fork 13
/
local_scope.go
50 lines (38 loc) · 909 Bytes
/
local_scope.go
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
package frontend
import "fmt"
type LocalScope struct {
VarTable Variables
}
func NewLocalScope() *LocalScope {
return &LocalScope{make(Variables)}
}
func (self *LocalScope) SetVar(v Var) {
self.VarTable[v.Id()] = v
}
func (self *LocalScope) GetVar(id string) Var {
return self.VarTable[id]
}
func (self *LocalScope) Size() (size int) {
for _, variable := range self.VarTable {
size += variable.Size()
}
return
}
func (self *LocalScope) NewVar(id string, typ varType) (Var, error) {
if self.VarTable[id] != nil {
return nil, fmt.Errorf("redeclaration of '%v'", id)
}
var v *Variable
switch typ {
case varNumTy:
v = NewNumeric(id, self.Size())
// TODO other types
default:
v = NewNumeric(id, self.Size())
}
v.offset = self.Size()
v.typ = typ
self.VarTable[id] = v
return v, nil
}
func (self *LocalScope) MakeReturn(expr *SyntaxTree, gen *IntGen) *IntInstr { return nil }