diff --git a/ast.go b/ast.go
index 19b4a31..f30668a 100644
--- a/ast.go
+++ b/ast.go
@@ -20,29 +20,29 @@
 	"strings"
 )
 
-type AST interface {
+type ast interface {
 	eval(*Evaluator)
 	show()
 }
 
-type ASTBase struct {
+type astBase struct {
 	filename string
 	lineno   int
 }
 
-type AssignAST struct {
-	ASTBase
+type assignAST struct {
+	astBase
 	lhs Value
 	rhs Value
 	op  string
 	opt string // "override", "export"
 }
 
-func (ast *AssignAST) eval(ev *Evaluator) {
+func (ast *assignAST) eval(ev *Evaluator) {
 	ev.evalAssign(ast)
 }
 
-func (ast *AssignAST) evalRHS(ev *Evaluator, lhs string) Var {
+func (ast *assignAST) evalRHS(ev *Evaluator, lhs string) Var {
 	origin := "file"
 	if ast.filename == bootstrapMakefileName {
 		origin = "default"
@@ -82,84 +82,84 @@
 	}
 }
 
-func (ast *AssignAST) show() {
+func (ast *assignAST) show() {
 	Logf("%s %s %s %q", ast.opt, ast.lhs, ast.op, ast.rhs)
 }
 
-// MaybeRuleAST is an ast for rule line.
+// maybeRuleAST is an ast for rule line.
 // Note we cannot be sure what this is, until all variables in |expr|
 // are expanded.
-type MaybeRuleAST struct {
-	ASTBase
+type maybeRuleAST struct {
+	astBase
 	expr      Value
 	term      byte // Either ':', '=', or 0
 	afterTerm []byte
 }
 
-func (ast *MaybeRuleAST) eval(ev *Evaluator) {
+func (ast *maybeRuleAST) eval(ev *Evaluator) {
 	ev.evalMaybeRule(ast)
 }
 
-func (ast *MaybeRuleAST) show() {
+func (ast *maybeRuleAST) show() {
 	Logf("%s", ast.expr)
 }
 
-type CommandAST struct {
-	ASTBase
+type commandAST struct {
+	astBase
 	cmd string
 }
 
-func (ast *CommandAST) eval(ev *Evaluator) {
+func (ast *commandAST) eval(ev *Evaluator) {
 	ev.evalCommand(ast)
 }
 
-func (ast *CommandAST) show() {
+func (ast *commandAST) show() {
 	Logf("\t%s", strings.Replace(ast.cmd, "\n", `\n`, -1))
 }
 
-type IncludeAST struct {
-	ASTBase
+type includeAST struct {
+	astBase
 	expr string
 	op   string
 }
 
-func (ast *IncludeAST) eval(ev *Evaluator) {
+func (ast *includeAST) eval(ev *Evaluator) {
 	ev.evalInclude(ast)
 }
 
-func (ast *IncludeAST) show() {
+func (ast *includeAST) show() {
 	Logf("include %s", ast.expr)
 }
 
-type IfAST struct {
-	ASTBase
+type ifAST struct {
+	astBase
 	op         string
 	lhs        Value
 	rhs        Value // Empty if |op| is ifdef or ifndef.
-	trueStmts  []AST
-	falseStmts []AST
+	trueStmts  []ast
+	falseStmts []ast
 }
 
-func (ast *IfAST) eval(ev *Evaluator) {
+func (ast *ifAST) eval(ev *Evaluator) {
 	ev.evalIf(ast)
 }
 
-func (ast *IfAST) show() {
+func (ast *ifAST) show() {
 	// TODO
 	Logf("if")
 }
 
-type ExportAST struct {
-	ASTBase
+type exportAST struct {
+	astBase
 	expr   []byte
 	export bool
 }
 
-func (ast *ExportAST) eval(ev *Evaluator) {
+func (ast *exportAST) eval(ev *Evaluator) {
 	ev.evalExport(ast)
 }
 
-func (ast *ExportAST) show() {
+func (ast *exportAST) show() {
 	// TODO
 	Logf("export")
 }
diff --git a/eval.go b/eval.go
index 8d388c6..a662f6b 100644
--- a/eval.go
+++ b/eval.go
@@ -89,7 +89,7 @@
 	return buf.args
 }
 
-func (ev *Evaluator) evalAssign(ast *AssignAST) {
+func (ev *Evaluator) evalAssign(ast *assignAST) {
 	ev.lastRule = nil
 	lhs, rhs := ev.evalAssignAST(ast)
 	if LogFlag {
@@ -101,7 +101,7 @@
 	ev.outVars.Assign(lhs, rhs)
 }
 
-func (ev *Evaluator) evalAssignAST(ast *AssignAST) (string, Var) {
+func (ev *Evaluator) evalAssignAST(ast *assignAST) (string, Var) {
 	ev.filename = ast.filename
 	ev.lineno = ast.lineno
 
@@ -121,7 +121,7 @@
 	return lhs, rhs
 }
 
-func (ev *Evaluator) setTargetSpecificVar(assign *AssignAST, output string) {
+func (ev *Evaluator) setTargetSpecificVar(assign *assignAST, output string) {
 	vars, present := ev.outRuleVars[output]
 	if !present {
 		vars = make(Vars)
@@ -136,7 +136,7 @@
 	ev.currentScope = nil
 }
 
-func (ev *Evaluator) evalMaybeRule(ast *MaybeRuleAST) {
+func (ev *Evaluator) evalMaybeRule(ast *maybeRuleAST) {
 	ev.lastRule = nil
 	ev.filename = ast.filename
 	ev.lineno = ast.lineno
@@ -209,7 +209,7 @@
 	ev.outRules = append(ev.outRules, rule)
 }
 
-func (ev *Evaluator) evalCommand(ast *CommandAST) {
+func (ev *Evaluator) evalCommand(ast *commandAST) {
 	ev.filename = ast.filename
 	ev.lineno = ast.lineno
 	if ev.lastRule == nil {
@@ -221,7 +221,7 @@
 			if err != nil {
 				panic(err)
 			}
-			if len(mk.stmts) == 1 && mk.stmts[0].(*AssignAST) != nil {
+			if len(mk.stmts) == 1 && mk.stmts[0].(*assignAST) != nil {
 				ev.eval(mk.stmts[0])
 			}
 			return
@@ -321,7 +321,7 @@
 	}
 }
 
-func (ev *Evaluator) evalInclude(ast *IncludeAST) {
+func (ev *Evaluator) evalInclude(ast *includeAST) {
 	ev.lastRule = nil
 	ev.filename = ast.filename
 	ev.lineno = ast.lineno
@@ -370,11 +370,11 @@
 	}
 }
 
-func (ev *Evaluator) evalIf(ast *IfAST) {
+func (ev *Evaluator) evalIf(iast *ifAST) {
 	var isTrue bool
-	switch ast.op {
+	switch iast.op {
 	case "ifdef", "ifndef":
-		expr := ast.lhs
+		expr := iast.lhs
 		buf := newBuf()
 		expr.Eval(buf, ev)
 		v := ev.LookupVar(buf.String())
@@ -383,38 +383,38 @@
 		value := buf.String()
 		val := buf.Len()
 		freeBuf(buf)
-		isTrue = (val > 0) == (ast.op == "ifdef")
+		isTrue = (val > 0) == (iast.op == "ifdef")
 		if LogFlag {
-			Logf("%s lhs=%q value=%q => %t", ast.op, ast.lhs, value, isTrue)
+			Logf("%s lhs=%q value=%q => %t", iast.op, iast.lhs, value, isTrue)
 		}
 	case "ifeq", "ifneq":
-		lexpr := ast.lhs
-		rexpr := ast.rhs
+		lexpr := iast.lhs
+		rexpr := iast.rhs
 		buf := newBuf()
 		params := ev.args(buf, lexpr, rexpr)
 		lhs := string(params[0])
 		rhs := string(params[1])
 		freeBuf(buf)
-		isTrue = (lhs == rhs) == (ast.op == "ifeq")
+		isTrue = (lhs == rhs) == (iast.op == "ifeq")
 		if LogFlag {
-			Logf("%s lhs=%q %q rhs=%q %q => %t", ast.op, ast.lhs, lhs, ast.rhs, rhs, isTrue)
+			Logf("%s lhs=%q %q rhs=%q %q => %t", iast.op, iast.lhs, lhs, iast.rhs, rhs, isTrue)
 		}
 	default:
-		panic(fmt.Sprintf("unknown if statement: %q", ast.op))
+		panic(fmt.Sprintf("unknown if statement: %q", iast.op))
 	}
 
-	var stmts []AST
+	var stmts []ast
 	if isTrue {
-		stmts = ast.trueStmts
+		stmts = iast.trueStmts
 	} else {
-		stmts = ast.falseStmts
+		stmts = iast.falseStmts
 	}
 	for _, stmt := range stmts {
 		ev.eval(stmt)
 	}
 }
 
-func (ev *Evaluator) evalExport(ast *ExportAST) {
+func (ev *Evaluator) evalExport(ast *exportAST) {
 	ev.lastRule = nil
 	ev.filename = ast.filename
 	ev.lineno = ast.lineno
@@ -430,8 +430,8 @@
 	}
 }
 
-func (ev *Evaluator) eval(ast AST) {
-	ast.eval(ev)
+func (ev *Evaluator) eval(stmt ast) {
+	stmt.eval(ev)
 }
 
 func createReadMakefileArray(mp map[string]*ReadMakefile) []*ReadMakefile {
diff --git a/parser.go b/parser.go
index 4e7574d..9bcba52 100644
--- a/parser.go
+++ b/parser.go
@@ -34,11 +34,11 @@
 
 type Makefile struct {
 	filename string
-	stmts    []AST
+	stmts    []ast
 }
 
 type ifState struct {
-	ast     *IfAST
+	ast     *ifAST
 	inElse  bool
 	numNest int
 }
@@ -52,7 +52,7 @@
 	unBuf       []byte
 	hasUnBuf    bool
 	done        bool
-	outStmts    *[]AST
+	outStmts    *[]ast
 	ifStack     []ifState
 	inDef       []string
 	defOpt      string
@@ -68,8 +68,8 @@
 	return p
 }
 
-func (p *parser) addStatement(ast AST) {
-	*p.outStmts = append(*p.outStmts, ast)
+func (p *parser) addStatement(stmt ast) {
+	*p.outStmts = append(*p.outStmts, stmt)
 }
 
 func (p *parser) readLine() []byte {
@@ -172,7 +172,7 @@
 	p.hasUnBuf = true
 }
 
-func newAssignAST(p *parser, lhsBytes []byte, rhsBytes []byte, op string) *AssignAST {
+func newAssignAST(p *parser, lhsBytes []byte, rhsBytes []byte, op string) *assignAST {
 	lhs, _, err := parseExpr(lhsBytes, nil, true)
 	if err != nil {
 		panic(err)
@@ -185,7 +185,7 @@
 	if p != nil {
 		opt = p.defOpt
 	}
-	return &AssignAST{
+	return &assignAST{
 		lhs: lhs,
 		rhs: rhs,
 		op:  op,
@@ -193,15 +193,15 @@
 	}
 }
 
-func (p *parser) parseAssign(line []byte, sep, esep int) AST {
+func (p *parser) parseAssign(line []byte, sep, esep int) ast {
 	Logf("parseAssign %q op:%q", line, line[sep:esep])
-	ast := newAssignAST(p, bytes.TrimSpace(line[:sep]), trimLeftSpaceBytes(line[esep:]), string(line[sep:esep]))
-	ast.filename = p.mk.filename
-	ast.lineno = p.lineno
-	return ast
+	aast := newAssignAST(p, bytes.TrimSpace(line[:sep]), trimLeftSpaceBytes(line[esep:]), string(line[sep:esep]))
+	aast.filename = p.mk.filename
+	aast.lineno = p.lineno
+	return aast
 }
 
-func (p *parser) parseMaybeRule(line []byte, equalIndex, semicolonIndex int) AST {
+func (p *parser) parseMaybeRule(line []byte, equalIndex, semicolonIndex int) ast {
 	if len(trimSpaceBytes(line)) == 0 {
 		return nil
 	}
@@ -233,42 +233,42 @@
 		panic(fmt.Errorf("parse %s:%d %v", p.mk.filename, p.lineno, err))
 	}
 
-	ast := &MaybeRuleAST{
+	rast := &maybeRuleAST{
 		expr:      v,
 		term:      term,
 		afterTerm: afterTerm,
 	}
-	ast.filename = p.mk.filename
-	ast.lineno = p.lineno
-	return ast
+	rast.filename = p.mk.filename
+	rast.lineno = p.lineno
+	return rast
 }
 
-func (p *parser) parseInclude(line string, oplen int) AST {
+func (p *parser) parseInclude(line string, oplen int) ast {
 	// TODO(ukai): parse expr here
-	ast := &IncludeAST{
+	iast := &includeAST{
 		expr: line[oplen+1:],
 		op:   line[:oplen],
 	}
-	ast.filename = p.mk.filename
-	ast.lineno = p.lineno
-	return ast
+	iast.filename = p.mk.filename
+	iast.lineno = p.lineno
+	return iast
 }
 
-func (p *parser) parseIfdef(line []byte, oplen int) AST {
+func (p *parser) parseIfdef(line []byte, oplen int) ast {
 	lhs, _, err := parseExpr(trimLeftSpaceBytes(line[oplen+1:]), nil, true)
 	if err != nil {
 		panic(fmt.Errorf("ifdef parse %s:%d %v", p.mk.filename, p.lineno, err))
 	}
-	ast := &IfAST{
+	iast := &ifAST{
 		op:  string(line[:oplen]),
 		lhs: lhs,
 	}
-	ast.filename = p.mk.filename
-	ast.lineno = p.lineno
-	p.addStatement(ast)
-	p.ifStack = append(p.ifStack, ifState{ast: ast, numNest: p.numIfNest})
-	p.outStmts = &ast.trueStmts
-	return ast
+	iast.filename = p.mk.filename
+	iast.lineno = p.lineno
+	p.addStatement(iast)
+	p.ifStack = append(p.ifStack, ifState{ast: iast, numNest: p.numIfNest})
+	p.outStmts = &iast.trueStmts
+	return iast
 }
 
 func (p *parser) parseTwoQuotes(s string, op string) ([]string, bool) {
@@ -324,7 +324,7 @@
 	return args[0], args[1], true
 }
 
-func (p *parser) parseIfeq(line string, oplen int) AST {
+func (p *parser) parseIfeq(line string, oplen int) ast {
 	op := line[:oplen]
 	lhsBytes, rhsBytes, ok := p.parseEq(strings.TrimSpace(line[oplen+1:]), op)
 	if !ok {
@@ -340,17 +340,17 @@
 		panic(fmt.Errorf("parse ifeq rhs %s:%d %v", p.mk.filename, p.lineno, err))
 	}
 
-	ast := &IfAST{
+	iast := &ifAST{
 		op:  op,
 		lhs: lhs,
 		rhs: rhs,
 	}
-	ast.filename = p.mk.filename
-	ast.lineno = p.lineno
-	p.addStatement(ast)
-	p.ifStack = append(p.ifStack, ifState{ast: ast, numNest: p.numIfNest})
-	p.outStmts = &ast.trueStmts
-	return ast
+	iast.filename = p.mk.filename
+	iast.lineno = p.lineno
+	p.addStatement(iast)
+	p.ifStack = append(p.ifStack, ifState{ast: iast, numNest: p.numIfNest})
+	p.outStmts = &iast.trueStmts
+	return iast
 }
 
 func (p *parser) checkIfStack(curKeyword string) {
@@ -519,13 +519,13 @@
 		line = line[:equalIndex]
 	}
 
-	ast := &ExportAST{
+	east := &exportAST{
 		expr:   line,
 		export: export,
 	}
-	ast.filename = p.mk.filename
-	ast.lineno = p.lineno
-	p.addStatement(ast)
+	east.filename = p.mk.filename
+	east.lineno = p.lineno
+	p.addStatement(east)
 	return hasEqual
 }
 
@@ -582,10 +582,10 @@
 			lineStr := string(p.processDefineLine(line))
 			if p.isEndef(lineStr) {
 				Logf("multilineAssign %q", p.inDef)
-				ast := newAssignAST(p, []byte(p.inDef[0]), []byte(strings.Join(p.inDef[1:], "\n")), "=")
-				ast.filename = p.mk.filename
-				ast.lineno = p.lineno - len(p.inDef)
-				p.addStatement(ast)
+				aast := newAssignAST(p, []byte(p.inDef[0]), []byte(strings.Join(p.inDef[1:], "\n")), "=")
+				aast.filename = p.mk.filename
+				aast.lineno = p.lineno - len(p.inDef)
+				p.addStatement(aast)
 				p.inDef = nil
 				p.defOpt = ""
 				continue
@@ -607,16 +607,16 @@
 			}
 		}
 		if line[0] == '\t' {
-			ast := &CommandAST{cmd: string(p.processRecipeLine(line[1:]))}
-			ast.filename = p.mk.filename
-			ast.lineno = p.lineno
-			p.addStatement(ast)
+			cast := &commandAST{cmd: string(p.processRecipeLine(line[1:]))}
+			cast.filename = p.mk.filename
+			cast.lineno = p.lineno
+			p.addStatement(cast)
 			continue
 		}
 
 		line = p.processMakefileLine(line)
 
-		var ast AST
+		var stmt ast
 		var parenStack []byte
 		equalIndex := -1
 		semicolonIndex := -1
@@ -643,7 +643,7 @@
 			case ':':
 				if i+1 < len(line) && line[i+1] == '=' {
 					if !isRule {
-						ast = p.parseAssign(line, i, i+2)
+						stmt = p.parseAssign(line, i, i+2)
 					}
 				} else {
 					isRule = true
@@ -654,25 +654,25 @@
 				}
 			case '=':
 				if !isRule {
-					ast = p.parseAssign(line, i, i+1)
+					stmt = p.parseAssign(line, i, i+1)
 				}
 				if equalIndex < 0 {
 					equalIndex = i
 				}
 			case '?', '+':
 				if !isRule && i+1 < len(line) && line[i+1] == '=' {
-					ast = p.parseAssign(line, i, i+2)
+					stmt = p.parseAssign(line, i, i+2)
 				}
 			}
-			if ast != nil {
-				p.addStatement(ast)
+			if stmt != nil {
+				p.addStatement(stmt)
 				break
 			}
 		}
-		if ast == nil {
-			ast = p.parseMaybeRule(line, equalIndex, semicolonIndex)
-			if ast != nil {
-				p.addStatement(ast)
+		if stmt == nil {
+			stmt = p.parseMaybeRule(line, equalIndex, semicolonIndex)
+			if stmt != nil {
+				p.addStatement(stmt)
 			}
 		}
 	}
diff --git a/rule_parser.go b/rule_parser.go
index ccc207d..98914fe 100644
--- a/rule_parser.go
+++ b/rule_parser.go
@@ -93,7 +93,7 @@
 	}
 }
 
-func (r *Rule) parseVar(s []byte) *AssignAST {
+func (r *Rule) parseVar(s []byte) *assignAST {
 	eq := bytes.IndexByte(s, '=')
 	if eq <= 0 {
 		return nil
@@ -122,7 +122,7 @@
 	return assign
 }
 
-func (r *Rule) parse(line []byte) (*AssignAST, error) {
+func (r *Rule) parse(line []byte) (*assignAST, error) {
 	index := bytes.IndexByte(line, ':')
 	if index < 0 {
 		return nil, errors.New("*** missing separator.")
diff --git a/rule_parser_test.go b/rule_parser_test.go
index b1db3ec..41b70c8 100644
--- a/rule_parser_test.go
+++ b/rule_parser_test.go
@@ -23,7 +23,7 @@
 	for _, tc := range []struct {
 		in     string
 		want   Rule
-		assign *AssignAST
+		assign *assignAST
 		err    string
 	}{
 		{
@@ -100,7 +100,7 @@
 			want: Rule{
 				outputs: []string{"foo"},
 			},
-			assign: &AssignAST{
+			assign: &assignAST{
 				lhs: literal("CFLAGS"),
 				rhs: literal("-g"),
 				op:  "=",
@@ -111,7 +111,7 @@
 			want: Rule{
 				outputs: []string{"foo"},
 			},
-			assign: &AssignAST{
+			assign: &assignAST{
 				lhs: literal("CFLAGS"),
 				rhs: literal("-g"),
 				op:  "=",
@@ -122,7 +122,7 @@
 			want: Rule{
 				outputs: []string{"foo"},
 			},
-			assign: &AssignAST{
+			assign: &assignAST{
 				lhs: literal("CFLAGS"),
 				rhs: literal("-g"),
 				op:  ":=",
@@ -133,7 +133,7 @@
 			want: Rule{
 				outputPatterns: []pattern{pattern{suffix: ".o"}},
 			},
-			assign: &AssignAST{
+			assign: &assignAST{
 				lhs: literal("CFLAGS"),
 				rhs: literal("-g"),
 				op:  ":=",
