Move more logics for MaybeRule from eval.go to parser.go
diff --git a/ast.go b/ast.go
index d406563..1e07b87 100644
--- a/ast.go
+++ b/ast.go
@@ -71,9 +71,9 @@
// are expanded.
type MaybeRuleAST struct {
ASTBase
- expr []byte
- equalIndex int
- semicolonIndex int
+ expr []byte
+ term byte // Either ':', '=', or 0
+ afterTerm []byte
}
func (ast *MaybeRuleAST) eval(ev *Evaluator) {
diff --git a/eval.go b/eval.go
index 9c481df..222c222 100644
--- a/eval.go
+++ b/eval.go
@@ -122,12 +122,6 @@
ev.lineno = ast.lineno
expr := ast.expr
- if ast.semicolonIndex >= 0 {
- expr = expr[0:ast.semicolonIndex]
- }
- if ast.equalIndex >= 0 {
- expr = expr[0:ast.equalIndex]
- }
lexpr, _, err := parseExpr(expr, nil)
if err != nil {
panic(fmt.Errorf("parse %s:%d %v", ev.filename, ev.lineno, err))
@@ -135,8 +129,8 @@
buf := newBuf()
lexpr.Eval(buf, ev)
line := buf.Bytes()
- if ast.equalIndex >= 0 {
- line = append(line, ast.expr[ast.equalIndex:]...)
+ if ast.term == '=' {
+ line = append(line, ast.afterTerm...)
}
Log("rule? %q=>%q", ast.expr, line)
@@ -161,9 +155,9 @@
//Log("RULE: %s=%s (%d commands)", lhs, rhs, len(cmds))
if assign != nil {
- if ast.semicolonIndex >= 0 {
+ if ast.term == ';' {
// TODO(ukai): reuse lexpr above?
- lexpr, _, err := parseExpr([]byte(ast.expr), nil)
+ lexpr, _, err := parseExpr(append(ast.expr, ast.afterTerm...), nil)
if err != nil {
panic(fmt.Errorf("parse %s:%d %v", ev.filename, ev.lineno, err))
}
@@ -184,8 +178,8 @@
return
}
- if ast.semicolonIndex > 0 {
- rule.cmds = append(rule.cmds, string(ast.expr[ast.semicolonIndex+1:]))
+ if ast.term == ';' {
+ rule.cmds = append(rule.cmds, string(ast.afterTerm[1:]))
}
Log("rule outputs:%q cmds:%q", rule.outputs, rule.cmds)
ev.lastRule = rule
diff --git a/parser.go b/parser.go
index 2090c0d..b16c7d5 100644
--- a/parser.go
+++ b/parser.go
@@ -186,6 +186,10 @@
return nil
}
+ expr := line
+ var term byte
+ var afterTerm []byte
+
// Either '=' or ';' is used.
if equalIndex >= 0 && semicolonIndex >= 0 {
if equalIndex < semicolonIndex {
@@ -194,11 +198,20 @@
equalIndex = -1
}
}
+ if semicolonIndex >= 0 {
+ afterTerm = expr[semicolonIndex:]
+ expr = expr[0:semicolonIndex]
+ term = ';'
+ } else if equalIndex >= 0 {
+ afterTerm = expr[equalIndex:]
+ expr = expr[0:equalIndex]
+ term = '='
+ }
ast := &MaybeRuleAST{
- expr: line,
- equalIndex: equalIndex,
- semicolonIndex: semicolonIndex,
+ expr: expr,
+ term: term,
+ afterTerm: afterTerm,
}
ast.filename = p.mk.filename
ast.lineno = p.lineno