blob: 2997aeaa559dbd37b967a16165c9e670c902bfc4 [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
Shinichiro Hamajide829712015-03-31 18:26:56 +090050// Note we cannot be sure what this is, until all variables in |expr|
51// are expanded.
52type MaybeRuleAST struct {
Fumitoshi Ukai119dc912015-03-30 16:52:41 +090053 ASTBase
Shinichiro Hamajide829712015-03-31 18:26:56 +090054 expr string
Shinichiro Hamajiae32b782015-03-31 14:41:19 +090055 cmds []string
Shinichiro Hamaji7c4e3252015-03-30 23:04:25 +090056 cmdLineno int
Fumitoshi Ukai119dc912015-03-30 16:52:41 +090057}
58
Shinichiro Hamajide829712015-03-31 18:26:56 +090059func (ast *MaybeRuleAST) eval(ev *Evaluator) {
60 ev.evalMaybeRule(ast)
Fumitoshi Ukai119dc912015-03-30 16:52:41 +090061}
62
Shinichiro Hamajide829712015-03-31 18:26:56 +090063func (ast *MaybeRuleAST) show() {
64 Log("%s", ast.expr)
Fumitoshi Ukai119dc912015-03-30 16:52:41 +090065 for _, cmd := range ast.cmds {
66 Log("\t%s", cmd)
67 }
68}
Shinichiro Hamaji685fecf2015-03-30 18:28:12 +090069
Shinichiro Hamajid7bef602015-03-30 19:55:32 +090070type IncludeAST struct {
71 ASTBase
72 expr string
73 op string
74}
75
76func (ast *IncludeAST) eval(ev *Evaluator) {
77 ev.evalInclude(ast)
78}
79
80func (ast *IncludeAST) show() {
81 Log("include %s", ast.expr)
82}
Shinichiro Hamaji497754d2015-03-31 02:02:11 +090083
84type IfAST struct {
85 ASTBase
Shinichiro Hamajiae32b782015-03-31 14:41:19 +090086 op string
87 lhs string
88 rhs string // Empty if |op| is ifdef or ifndef.
89 trueStmts []AST
Shinichiro Hamaji497754d2015-03-31 02:02:11 +090090 falseStmts []AST
91}
92
93func (ast *IfAST) eval(ev *Evaluator) {
94 ev.evalIf(ast)
95}
96
97func (ast *IfAST) show() {
98 // TODO
99 Log("if")
100}