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