blob: 137c29a3fd011d24d48ab01f9141d2632e62a5a0 [file] [log] [blame]
package main
type AST interface {
eval(*Evaluator)
show()
}
type ASTBase struct {
filename string
lineno int
}
const (
ASSIGN_SIMPLE = iota // :=
ASSIGN_RECURSIVE // =
ASSIGN_APPEND // +=
ASSIGN_CONDITIONAL // ?=
)
type AssignAST struct {
ASTBase
lhs string
rhs string
assign_type int
}
func (ast *AssignAST) eval(ev *Evaluator) {
ev.evalAssign(ast)
}
func (ast *AssignAST) show() {
Log("%s=%s", ast.lhs, ast.rhs)
}
type RuleAST struct {
ASTBase
lhs string
rhs string
cmds []string
}
func (ast *RuleAST) eval(ev *Evaluator) {
ev.evalRule(ast)
}
func (ast *RuleAST) show() {
Log("%s: %s", ast.lhs, ast.rhs)
for _, cmd := range ast.cmds {
Log("\t%s", cmd)
}
}
type RawExprAST struct {
ASTBase
expr string
}
func (ast *RawExprAST) eval(ev *Evaluator) {
ev.evalRawExpr(ast)
}
func (ast *RawExprAST) show() {
Log("%s", ast.expr)
}