-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcalc-visitor_test.go
69 lines (53 loc) · 1.37 KB
/
calc-visitor_test.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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
package main
import (
"log"
"testing"
"c2j/parser/calc"
"github.com/antlr/antlr4/runtime/Go/antlr"
)
type EvalVisitor struct {
*calc.BaseCalcVisitor
//stack map[string]int
}
func NewEvalVisitor() *EvalVisitor {
//visitor := new(EvalVisitor)
//return visitor
return &EvalVisitor{
&calc.BaseCalcVisitor{},
}
}
func (v *EvalVisitor) Visit(tree antlr.ParseTree) interface{} {
return tree.Accept(v)
}
func (v *EvalVisitor) VisitStart(ctx *calc.StartContext) interface{} {
log.Println("MMM", ctx.GetText())
return v.VisitChildren(ctx)
}
func (v *EvalVisitor) VisitNumber(ctx *calc.NumberContext) interface{} {
return v.VisitChildren(ctx)
}
func (v *EvalVisitor) VisitMulDiv(ctx *calc.MulDivContext) interface{} {
return v.VisitChildren(ctx)
}
func (v *EvalVisitor) VisitAddSub(ctx *calc.AddSubContext) interface{} {
log.Println("AddSub")
return v.VisitChildren(ctx)
}
func TestEvalVisitor(t *testing.T) {
// Setup the input
is := antlr.NewInputStream("1 + 2 + 3 * 2 +2")
// Create lexer
lexer := calc.NewCalcLexer(is)
// Create tokens
stream := antlr.NewCommonTokenStream(lexer, antlr.TokenDefaultChannel)
// Create parser
p := calc.NewCalcParser(stream)
p.BuildParseTrees = true
// Create ast tree
tree := p.Start()
log.Println("tree :", tree.GetText())
// Finilly create internal
eval := NewEvalVisitor()
log.Println("visitor:", eval)
eval.Visit(tree)
}