blob: b8ee55c21d5c4018f138597c40092f2e1a6de744 [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
Fumitoshi Ukai8edcb792015-04-02 11:23:23 +090026func (ast *AssignAST) evalRHS(ev *Evaluator, lhs string) Var {
Fumitoshi Ukaie1b813c2015-03-30 18:38:21 +090027 switch ast.op {
28 case ":=":
Fumitoshi Ukai8edcb792015-04-02 11:23:23 +090029 // TODO: origin
30 return SimpleVar{value: ev.evalExpr(ast.rhs)}
Fumitoshi Ukaie1b813c2015-03-30 18:38:21 +090031 case "=":
Fumitoshi Ukai8edcb792015-04-02 11:23:23 +090032 return RecursiveVar{expr: ast.rhs}
Shinichiro Hamaji69b7f652015-03-31 01:01:59 +090033 case "+=":
Fumitoshi Ukai8edcb792015-04-02 11:23:23 +090034 prev := ev.LookupVar(lhs)
Fumitoshi Ukaic1847602015-04-02 16:18:02 +090035 if !prev.IsDefined() {
36 return RecursiveVar{expr: ast.rhs}
Fumitoshi Ukai8edcb792015-04-02 11:23:23 +090037 }
Fumitoshi Ukaic1847602015-04-02 16:18:02 +090038 return prev.Append(ev, ast.rhs)
Shinichiro Hamaji69b7f652015-03-31 01:01:59 +090039 case "?=":
Fumitoshi Ukai8edcb792015-04-02 11:23:23 +090040 prev := ev.LookupVar(lhs)
41 if prev.IsDefined() {
Shinichiro Hamaji69b7f652015-03-31 01:01:59 +090042 return prev
43 }
Fumitoshi Ukai7b428ed2015-04-02 16:41:36 +090044 return RecursiveVar{expr: ast.rhs}
Shinichiro Hamaji69b7f652015-03-31 01:01:59 +090045 default:
46 panic(fmt.Sprintf("unknown assign op: %q", ast.op))
Fumitoshi Ukaie1b813c2015-03-30 18:38:21 +090047 }
48}
49
Fumitoshi Ukai119dc912015-03-30 16:52:41 +090050func (ast *AssignAST) show() {
Fumitoshi Ukai8773e5e2015-04-01 11:23:18 +090051 Log("%s=%q", ast.lhs, ast.rhs)
Fumitoshi Ukai119dc912015-03-30 16:52:41 +090052}
53
Shinichiro Hamajide829712015-03-31 18:26:56 +090054// Note we cannot be sure what this is, until all variables in |expr|
55// are expanded.
56type MaybeRuleAST struct {
Fumitoshi Ukai119dc912015-03-30 16:52:41 +090057 ASTBase
Shinichiro Hamajide829712015-03-31 18:26:56 +090058 expr string
Shinichiro Hamajiae32b782015-03-31 14:41:19 +090059 cmds []string
Shinichiro Hamaji7c4e3252015-03-30 23:04:25 +090060 cmdLineno int
Fumitoshi Ukai119dc912015-03-30 16:52:41 +090061}
62
Shinichiro Hamajide829712015-03-31 18:26:56 +090063func (ast *MaybeRuleAST) eval(ev *Evaluator) {
64 ev.evalMaybeRule(ast)
Fumitoshi Ukai119dc912015-03-30 16:52:41 +090065}
66
Shinichiro Hamajide829712015-03-31 18:26:56 +090067func (ast *MaybeRuleAST) show() {
68 Log("%s", ast.expr)
Fumitoshi Ukai119dc912015-03-30 16:52:41 +090069 for _, cmd := range ast.cmds {
70 Log("\t%s", cmd)
71 }
72}
Shinichiro Hamaji685fecf2015-03-30 18:28:12 +090073
Shinichiro Hamajid7bef602015-03-30 19:55:32 +090074type IncludeAST struct {
75 ASTBase
76 expr string
77 op string
78}
79
80func (ast *IncludeAST) eval(ev *Evaluator) {
81 ev.evalInclude(ast)
82}
83
84func (ast *IncludeAST) show() {
85 Log("include %s", ast.expr)
86}
Shinichiro Hamaji497754d2015-03-31 02:02:11 +090087
88type IfAST struct {
89 ASTBase
Shinichiro Hamajiae32b782015-03-31 14:41:19 +090090 op string
91 lhs string
92 rhs string // Empty if |op| is ifdef or ifndef.
93 trueStmts []AST
Shinichiro Hamaji497754d2015-03-31 02:02:11 +090094 falseStmts []AST
95}
96
97func (ast *IfAST) eval(ev *Evaluator) {
98 ev.evalIf(ast)
99}
100
101func (ast *IfAST) show() {
102 // TODO
103 Log("if")
104}