blob: 33ef5be0dce3bcb4ce191b51988c0b263c748152 [file] [log] [blame]
Fumitoshi Ukai119dc912015-03-30 16:52:41 +09001package main
2
Fumitoshi Ukaie1b813c2015-03-30 18:38:21 +09003import "fmt"
4
Fumitoshi Ukai119dc912015-03-30 16:52:41 +09005type AST interface {
Fumitoshi Ukaie34c1792015-03-30 17:53:47 +09006 eval(*Evaluator)
Fumitoshi Ukai119dc912015-03-30 16:52:41 +09007 show()
8}
9
10type ASTBase struct {
Shinichiro Hamaji685fecf2015-03-30 18:28:12 +090011 filename string
12 lineno int
Fumitoshi Ukai119dc912015-03-30 16:52:41 +090013}
14
15type AssignAST struct {
16 ASTBase
Fumitoshi Ukaie1b813c2015-03-30 18:38:21 +090017 lhs string
18 rhs string
19 op string
Fumitoshi Ukai119dc912015-03-30 16:52:41 +090020}
21
Fumitoshi Ukaie34c1792015-03-30 17:53:47 +090022func (ast *AssignAST) eval(ev *Evaluator) {
23 ev.evalAssign(ast)
Fumitoshi Ukai119dc912015-03-30 16:52:41 +090024}
25
Shinichiro Hamaji69b7f652015-03-31 01:01:59 +090026func (ast *AssignAST) evalRHS(ev *Evaluator, lhs string) string {
Fumitoshi Ukaie1b813c2015-03-30 18:38:21 +090027 switch ast.op {
28 case ":=":
29 return ev.evalExpr(ast.rhs)
30 case "=":
31 return ast.rhs
Shinichiro Hamaji69b7f652015-03-31 01:01:59 +090032 case "+=":
33 prev, _ := ev.getVar(lhs)
34 return fmt.Sprintf("%s %s", prev, ev.evalExpr(ast.rhs))
35 case "?=":
36 prev, present := ev.getVar(lhs)
37 if present {
38 return prev
39 }
40 return ev.evalExpr(ast.rhs)
41 default:
42 panic(fmt.Sprintf("unknown assign op: %q", ast.op))
Fumitoshi Ukaie1b813c2015-03-30 18:38:21 +090043 }
44}
45
Fumitoshi Ukai119dc912015-03-30 16:52:41 +090046func (ast *AssignAST) show() {
47 Log("%s=%s", ast.lhs, ast.rhs)
48}
49
50type RuleAST struct {
51 ASTBase
Shinichiro Hamajiae32b782015-03-31 14:41:19 +090052 lhs string
53 rhs string
54 cmds []string
Shinichiro Hamaji7c4e3252015-03-30 23:04:25 +090055 cmdLineno int
Fumitoshi Ukai119dc912015-03-30 16:52:41 +090056}
57
Fumitoshi Ukaie34c1792015-03-30 17:53:47 +090058func (ast *RuleAST) eval(ev *Evaluator) {
59 ev.evalRule(ast)
Fumitoshi Ukai119dc912015-03-30 16:52:41 +090060}
61
62func (ast *RuleAST) show() {
63 Log("%s: %s", ast.lhs, ast.rhs)
64 for _, cmd := range ast.cmds {
65 Log("\t%s", cmd)
66 }
67}
Shinichiro Hamaji685fecf2015-03-30 18:28:12 +090068
69type RawExprAST struct {
70 ASTBase
71 expr string
72}
73
74func (ast *RawExprAST) eval(ev *Evaluator) {
75 ev.evalRawExpr(ast)
76}
77
78func (ast *RawExprAST) show() {
79 Log("%s", ast.expr)
80}
Shinichiro Hamajid7bef602015-03-30 19:55:32 +090081
82type IncludeAST struct {
83 ASTBase
84 expr string
85 op string
86}
87
88func (ast *IncludeAST) eval(ev *Evaluator) {
89 ev.evalInclude(ast)
90}
91
92func (ast *IncludeAST) show() {
93 Log("include %s", ast.expr)
94}
Shinichiro Hamaji497754d2015-03-31 02:02:11 +090095
96type IfAST struct {
97 ASTBase
Shinichiro Hamajiae32b782015-03-31 14:41:19 +090098 op string
99 lhs string
100 rhs string // Empty if |op| is ifdef or ifndef.
101 trueStmts []AST
Shinichiro Hamaji497754d2015-03-31 02:02:11 +0900102 falseStmts []AST
103}
104
105func (ast *IfAST) eval(ev *Evaluator) {
106 ev.evalIf(ast)
107}
108
109func (ast *IfAST) show() {
110 // TODO
111 Log("if")
112}