-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathastAddOp.go
More file actions
60 lines (50 loc) · 919 Bytes
/
astAddOp.go
File metadata and controls
60 lines (50 loc) · 919 Bytes
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
package main
type astAddOpTail struct {
oper token
val *astMulOp
}
type astAddOp struct {
head *astMulOp
tail []astAddOpTail
}
func (p *parser) parseAddOp() *astAddOp {
head := p.parseMulOp()
if head == nil {
return nil
}
result := &astAddOp{head: head}
for {
oper := p.lex.peek().token
if !isAddOp(oper) || head.finalType() == strType && oper == '-' {
break
}
p.lex.next()
val := p.parseMulOp()
if val == nil {
return nil
}
result.tail = append(result.tail, astAddOpTail{oper: oper, val: val})
}
return result
}
func isAddOp(b token) bool {
return b == '+' || b == '-'
}
func (a astAddOp) receive(g guest) {
g.visit(a.head)
for _, t := range a.tail {
g.visit(t.val)
}
}
func (a astAddOp) finalType() astType {
if len(a.tail) == 0 {
return a.head.finalType()
}
return numType
}
var nextTemp = 0
func createTemp() int {
val := nextTemp
nextTemp++
return val
}