-
Notifications
You must be signed in to change notification settings - Fork 0
/
astprinter.go
46 lines (37 loc) · 940 Bytes
/
astprinter.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
package glox
import "fmt"
type ASTPrinter struct{}
func (a ASTPrinter) Print(ex Expr) string {
return accept(a, ex)
}
func (a ASTPrinter) VisitBinaryExpr(ex *Binary) interface{} {
return a.parenthesize(ex.Operator.Lexeme, ex.Left, ex.Right)
}
func (a ASTPrinter) VisitGroupingExpr(ex *Grouping) interface{} {
return a.parenthesize("group", ex.Expression)
}
func (a ASTPrinter) VisitLiteralExpr(ex *Literal) interface{} {
return fmt.Sprintf("%v", ex.Value)
}
func (a ASTPrinter) VisitUnaryExpr(ex *Unary) interface{} {
return a.parenthesize(ex.Operator.Lexeme, ex.Right)
}
func (a ASTPrinter) parenthesize(name string, exprs ...Expr) string {
var s string
s += fmt.Sprintf("(%s", name)
for _, ex := range exprs {
s += fmt.Sprint(" ")
s += accept(a, ex)
}
s += ")"
return s
}
func accept(vtor Visitor, ex Expr) string {
v := ex.Accept(vtor)
switch v := v.(type) {
case string:
return v
default:
return ""
}
}