Rename value.* and ast.* to expr.* and stmt.*, respectively
diff --git a/Makefile.ckati b/Makefile.ckati
index 26dc1f7..9c1f016 100644
--- a/Makefile.ckati
+++ b/Makefile.ckati
@@ -22,11 +22,11 @@
 KATI_BIN_PATH ?= .
 
 KATI_CXX_SRCS := \
-	ast.cc \
 	command.cc \
 	dep.cc \
 	eval.cc \
 	exec.cc \
+	expr.cc \
 	file.cc \
 	file_cache.cc \
 	fileutil.cc \
@@ -40,12 +40,12 @@
 	parser.cc \
 	rule.cc \
 	stats.cc \
+	stmt.cc \
 	string_piece.cc \
 	stringprintf.cc \
 	strutil.cc \
 	symtab.cc \
 	timeutil.cc \
-	value.cc \
 	var.cc
 
 KATI_CXX_GENERATED_SRCS := \
diff --git a/eval.cc b/eval.cc
index d950b8a..3920b05 100644
--- a/eval.cc
+++ b/eval.cc
@@ -19,15 +19,15 @@
 #include <errno.h>
 #include <string.h>
 
-#include "ast.h"
+#include "expr.h"
 #include "file.h"
 #include "file_cache.h"
 #include "fileutil.h"
 #include "parser.h"
 #include "rule.h"
+#include "stmt.h"
 #include "strutil.h"
 #include "symtab.h"
-#include "value.h"
 #include "var.h"
 
 EvalResult::~EvalResult() {
@@ -96,34 +96,34 @@
   return NULL;
 }
 
-void Evaluator::EvalAssign(const AssignAST* ast) {
-  loc_ = ast->loc();
+void Evaluator::EvalAssign(const AssignStmt* stmt) {
+  loc_ = stmt->loc();
   last_rule_ = NULL;
-  Symbol lhs = Intern(ast->lhs->Eval(this));
+  Symbol lhs = Intern(stmt->lhs->Eval(this));
   if (lhs.empty())
     Error("*** empty variable name.");
-  Var* rhs = EvalRHS(lhs, ast->rhs, ast->orig_rhs, ast->op,
-                     ast->directive == AssignDirective::OVERRIDE);
+  Var* rhs = EvalRHS(lhs, stmt->rhs, stmt->orig_rhs, stmt->op,
+                     stmt->directive == AssignDirective::OVERRIDE);
   if (rhs)
     vars_->Assign(lhs, rhs);
 }
 
-void Evaluator::EvalRule(const RuleAST* ast) {
-  loc_ = ast->loc();
+void Evaluator::EvalRule(const RuleStmt* stmt) {
+  loc_ = stmt->loc();
   last_rule_ = NULL;
 
-  const string&& expr = ast->expr->Eval(this);
+  const string&& expr = stmt->expr->Eval(this);
   // See semicolon.mk.
   if (expr.find_first_not_of(" \t\n;") == string::npos)
     return;
 
   Rule* rule;
   RuleVarAssignment rule_var;
-  ParseRule(loc_, expr, ast->term, &rule, &rule_var);
+  ParseRule(loc_, expr, stmt->term, &rule, &rule_var);
 
   if (rule) {
-    if (ast->term == ';') {
-      rule->cmds.push_back(ast->after_term);
+    if (stmt->term == ';') {
+      rule->cmds.push_back(stmt->after_term);
     }
 
     LOG("Rule: %s", rule->DebugString().c_str());
@@ -138,13 +138,13 @@
       p.first->second = new Vars;
     }
 
-    Value* rhs = ast->after_term;
+    Value* rhs = stmt->after_term;
     if (!rule_var.rhs.empty()) {
       Value* lit = NewLiteral(rule_var.rhs);
       if (rhs) {
         // TODO: We always insert two whitespaces around the
         // terminator. Preserve whitespaces properly.
-        if (ast->term == ';') {
+        if (stmt->term == ';') {
           rhs = NewExpr3(lit, NewLiteral(StringPiece(" ; ")), rhs);
         } else {
           rhs = NewExpr3(lit, NewLiteral(StringPiece(" = ")), rhs);
@@ -163,41 +163,41 @@
   }
 }
 
-void Evaluator::EvalCommand(const CommandAST* ast) {
-  loc_ = ast->loc();
+void Evaluator::EvalCommand(const CommandStmt* stmt) {
+  loc_ = stmt->loc();
 
   if (!last_rule_) {
-    vector<AST*> asts;
-    ParseNotAfterRule(ast->orig, ast->loc(), &asts);
-    for (AST* a : asts)
+    vector<Stmt*> stmts;
+    ParseNotAfterRule(stmt->orig, stmt->loc(), &stmts);
+    for (Stmt* a : stmts)
       a->Eval(this);
     return;
   }
 
-  last_rule_->cmds.push_back(ast->expr);
+  last_rule_->cmds.push_back(stmt->expr);
   if (last_rule_->cmd_lineno == 0)
-    last_rule_->cmd_lineno = ast->loc().lineno;
-  LOG("Command: %s", ast->expr->DebugString().c_str());
+    last_rule_->cmd_lineno = stmt->loc().lineno;
+  LOG("Command: %s", stmt->expr->DebugString().c_str());
 }
 
-void Evaluator::EvalIf(const IfAST* ast) {
-  loc_ = ast->loc();
+void Evaluator::EvalIf(const IfStmt* stmt) {
+  loc_ = stmt->loc();
 
   bool is_true;
-  switch (ast->op) {
+  switch (stmt->op) {
     case CondOp::IFDEF:
     case CondOp::IFNDEF: {
-      Symbol lhs = Intern(ast->lhs->Eval(this));
+      Symbol lhs = Intern(stmt->lhs->Eval(this));
       Var* v = LookupVarInCurrentScope(lhs);
       const string&& s = v->Eval(this);
-      is_true = (s.empty() == (ast->op == CondOp::IFNDEF));
+      is_true = (s.empty() == (stmt->op == CondOp::IFNDEF));
       break;
     }
     case CondOp::IFEQ:
     case CondOp::IFNEQ: {
-      const string&& lhs = ast->lhs->Eval(this);
-      const string&& rhs = ast->rhs->Eval(this);
-      is_true = ((lhs == rhs) == (ast->op == CondOp::IFEQ));
+      const string&& lhs = stmt->lhs->Eval(this);
+      const string&& rhs = stmt->rhs->Eval(this);
+      is_true = ((lhs == rhs) == (stmt->op == CondOp::IFEQ));
       break;
     }
     default:
@@ -205,13 +205,13 @@
       abort();
   }
 
-  const vector<AST*>* asts;
+  const vector<Stmt*>* stmts;
   if (is_true) {
-    asts = &ast->true_asts;
+    stmts = &stmt->true_stmts;
   } else {
-    asts = &ast->false_asts;
+    stmts = &stmt->false_stmts;
   }
-  for (AST* a : *asts) {
+  for (Stmt* a : *stmts) {
     LOG("%s", a->DebugString().c_str());
     a->Eval(this);
   }
@@ -223,23 +223,23 @@
 
   Var* var_list = LookupVar(Intern("MAKEFILE_LIST"));
   var_list->AppendVar(this, NewLiteral(Intern(TrimLeadingCurdir(fname)).str()));
-  for (AST* ast : mk->asts()) {
-    LOG("%s", ast->DebugString().c_str());
-    ast->Eval(this);
+  for (Stmt* stmt : mk->stmts()) {
+    LOG("%s", stmt->DebugString().c_str());
+    stmt->Eval(this);
   }
 }
 
-void Evaluator::EvalInclude(const IncludeAST* ast) {
-  loc_ = ast->loc();
+void Evaluator::EvalInclude(const IncludeStmt* stmt) {
+  loc_ = stmt->loc();
   last_rule_ = NULL;
 
-  const string&& pats = ast->expr->Eval(this);
+  const string&& pats = stmt->expr->Eval(this);
   for (StringPiece pat : WordScanner(pats)) {
     ScopedTerminator st(pat);
     vector<string>* files;
     Glob(pat.data(), &files);
 
-    if (ast->should_exist) {
+    if (stmt->should_exist) {
       if (files->empty()) {
         Error(StringPrintf(
             "%s: %s\n"
@@ -249,7 +249,7 @@
     }
 
     for (const string& fname : *files) {
-      if (!ast->should_exist && g_flags.ignore_optional_include_pattern &&
+      if (!stmt->should_exist && g_flags.ignore_optional_include_pattern &&
           Pattern(g_flags.ignore_optional_include_pattern).Match(fname)) {
         return;
       }
@@ -258,15 +258,15 @@
   }
 }
 
-void Evaluator::EvalExport(const ExportAST* ast) {
-  loc_ = ast->loc();
+void Evaluator::EvalExport(const ExportStmt* stmt) {
+  loc_ = stmt->loc();
   last_rule_ = NULL;
 
-  const string&& exports = ast->expr->Eval(this);
+  const string&& exports = stmt->expr->Eval(this);
   for (StringPiece tok : WordScanner(exports)) {
     size_t equal_index = tok.find('=');
     if (equal_index == string::npos) {
-      exports_[Intern(tok)] = ast->is_export;
+      exports_[Intern(tok)] = stmt->is_export;
     } else if (equal_index == 0 ||
                (equal_index == 1 &&
                 (tok[0] == ':' || tok[0] == '?' || tok[0] == '+'))) {
@@ -276,7 +276,7 @@
       StringPiece lhs, rhs;
       AssignOp op;
       ParseAssignStatement(tok, equal_index, &lhs, &rhs, &op);
-      exports_[Intern(lhs)] = ast->is_export;
+      exports_[Intern(lhs)] = stmt->is_export;
     }
   }
 }
diff --git a/eval.h b/eval.h
index 1326a0e..3ebb21b 100644
--- a/eval.h
+++ b/eval.h
@@ -20,8 +20,8 @@
 #include <unordered_set>
 #include <vector>
 
-#include "ast.h"
 #include "loc.h"
+#include "stmt.h"
 #include "string_piece.h"
 #include "symtab.h"
 
@@ -46,12 +46,12 @@
   Evaluator(const Vars* vars);
   ~Evaluator();
 
-  void EvalAssign(const AssignAST* ast);
-  void EvalRule(const RuleAST* ast);
-  void EvalCommand(const CommandAST* ast);
-  void EvalIf(const IfAST* ast);
-  void EvalInclude(const IncludeAST* ast);
-  void EvalExport(const ExportAST* ast);
+  void EvalAssign(const AssignStmt* stmt);
+  void EvalRule(const RuleStmt* stmt);
+  void EvalCommand(const CommandStmt* stmt);
+  void EvalIf(const IfStmt* stmt);
+  void EvalInclude(const IncludeStmt* stmt);
+  void EvalExport(const ExportStmt* stmt);
 
   Var* LookupVar(Symbol name);
   // For target specific variables.
diff --git a/exec.cc b/exec.cc
index 563d615..afba609 100644
--- a/exec.cc
+++ b/exec.cc
@@ -27,13 +27,13 @@
 #include "command.h"
 #include "dep.h"
 #include "eval.h"
+#include "expr.h"
 #include "fileutil.h"
 #include "flags.h"
 #include "log.h"
 #include "string_piece.h"
 #include "strutil.h"
 #include "symtab.h"
-#include "value.h"
 #include "var.h"
 
 namespace {
diff --git a/value.cc b/expr.cc
similarity index 99%
rename from value.cc
rename to expr.cc
index 83c6b18..07cccc9 100644
--- a/value.cc
+++ b/expr.cc
@@ -14,7 +14,7 @@
 
 // +build ignore
 
-#include "value.h"
+#include "expr.h"
 
 #include <vector>
 
diff --git a/value.h b/expr.h
similarity index 96%
rename from value.h
rename to expr.h
index 51ca29c..606ef90 100644
--- a/value.h
+++ b/expr.h
@@ -12,8 +12,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef VALUE_H_
-#define VALUE_H_
+#ifndef EXPR_H_
+#define EXPR_H_
 
 #include <string>
 #include <vector>
@@ -68,4 +68,4 @@
 
 Value* NewLiteral(StringPiece s);
 
-#endif  // VALUE_H_
+#endif  // EXPR_H_
diff --git a/file.cc b/file.cc
index 7217a37..4c423e5 100644
--- a/file.cc
+++ b/file.cc
@@ -21,9 +21,9 @@
 #include <sys/types.h>
 #include <unistd.h>
 
-#include "ast.h"
 #include "log.h"
 #include "parser.h"
+#include "stmt.h"
 
 Makefile::Makefile(const string& filename)
     : buf_(NULL), len_(0), mtime_(0), filename_(filename) {
@@ -56,6 +56,6 @@
 
 Makefile::~Makefile() {
   delete[] buf_;
-  for (AST* ast : asts_)
-    delete ast;
+  for (Stmt* stmt : stmts_)
+    delete stmt;
 }
diff --git a/file.h b/file.h
index 5367320..1746343 100644
--- a/file.h
+++ b/file.h
@@ -22,7 +22,7 @@
 
 using namespace std;
 
-struct AST;
+struct Stmt;
 
 class Makefile {
  public:
@@ -33,8 +33,8 @@
   size_t len() const { return len_; }
   const string& filename() const { return filename_; }
 
-  const vector<AST*>& asts() const { return asts_; }
-  vector<AST*>* mutable_asts() { return &asts_; }
+  const vector<Stmt*>& stmts() const { return stmts_; }
+  vector<Stmt*>* mutable_stmts() { return &stmts_; }
 
   bool Exists() const { return buf_; }
 
@@ -43,7 +43,7 @@
   size_t len_;
   uint64_t mtime_;
   string filename_;
-  vector<AST*> asts_;
+  vector<Stmt*> stmts_;
 };
 
 #endif  // FILE_H_
diff --git a/func.cc b/func.cc
index 25c41c1..6368e02 100644
--- a/func.cc
+++ b/func.cc
@@ -27,13 +27,13 @@
 #include <memory>
 #include <unordered_map>
 
-#include "ast.h"
 #include "eval.h"
 #include "fileutil.h"
 #include "find.h"
 #include "log.h"
 #include "parser.h"
 #include "stats.h"
+#include "stmt.h"
 #include "strutil.h"
 #include "symtab.h"
 #include "var.h"
@@ -451,12 +451,12 @@
   //const string text = args[0]->Eval(ev);
   string* text = new string;
   args[0]->Eval(ev, text);
-  vector<AST*> asts;
-  Parse(*text, ev->loc(), &asts);
-  for (AST* ast : asts) {
-    LOG("%s", ast->DebugString().c_str());
-    ast->Eval(ev);
-    //delete ast;
+  vector<Stmt*> stmts;
+  Parse(*text, ev->loc(), &stmts);
+  for (Stmt* stmt : stmts) {
+    LOG("%s", stmt->DebugString().c_str());
+    stmt->Eval(ev);
+    //delete stmt;
   }
 }
 
diff --git a/func.h b/func.h
index 11fea28..8db2c7a 100644
--- a/func.h
+++ b/func.h
@@ -19,7 +19,7 @@
 #include <string>
 #include <vector>
 
-#include "value.h"
+#include "expr.h"
 
 using namespace std;
 
diff --git a/main.cc b/main.cc
index 61bedf6..d09eb4f 100644
--- a/main.cc
+++ b/main.cc
@@ -21,7 +21,6 @@
 #include <time.h>
 #include <unistd.h>
 
-#include "ast.h"
 #include "dep.h"
 #include "eval.h"
 #include "exec.h"
@@ -35,6 +34,7 @@
 #include "ninja.h"
 #include "parser.h"
 #include "stats.h"
+#include "stmt.h"
 #include "string_piece.h"
 #include "stringprintf.h"
 #include "strutil.h"
@@ -71,7 +71,7 @@
 }
 
 static void ReadBootstrapMakefile(const vector<Symbol>& targets,
-                                  vector<AST*>* asts) {
+                                  vector<Stmt*>* stmts) {
   string bootstrap = (
       "CC?=cc\n"
 #if defined(__APPLE__)
@@ -112,7 +112,7 @@
     CHECK(false);
   }
   bootstrap += StringPrintf("CURDIR:=%s\n", cwd);
-  Parse(Intern(bootstrap).str(), Loc("*bootstrap*", 0), asts);
+  Parse(Intern(bootstrap).str(), Loc("*bootstrap*", 0), stmts);
 }
 
 static void SetVar(StringPiece l, VarOrigin origin, Vars* vars) {
@@ -155,12 +155,12 @@
   }
   Evaluator* ev = new Evaluator(vars);
 
-  vector<AST*> bootstrap_asts;
+  vector<Stmt*> bootstrap_asts;
   ReadBootstrapMakefile(targets, &bootstrap_asts);
   ev->set_is_bootstrap(true);
-  for (AST* ast : bootstrap_asts) {
-    LOG("%s", ast->DebugString().c_str());
-    ast->Eval(ev);
+  for (Stmt* stmt : bootstrap_asts) {
+    LOG("%s", stmt->DebugString().c_str());
+    stmt->Eval(ev);
   }
   ev->set_is_bootstrap(false);
 
@@ -175,13 +175,13 @@
   {
     ScopedTimeReporter tr("eval time");
     Makefile* mk = cache_mgr->ReadMakefile(g_flags.makefile);
-    for (AST* ast : mk->asts()) {
-      LOG("%s", ast->DebugString().c_str());
-      ast->Eval(ev);
+    for (Stmt* stmt : mk->stmts()) {
+      LOG("%s", stmt->DebugString().c_str());
+      stmt->Eval(ev);
     }
   }
 
-  for (ParseErrorAST* err : GetParseErrors()) {
+  for (ParseErrorStmt* err : GetParseErrors()) {
     WARN("%s:%d: warning for parse error in an unevaluated line: %s",
          LOCF(err->loc()), err->msg.c_str());
   }
@@ -221,8 +221,8 @@
     Exec(nodes, ev);
   }
 
-  for (AST* ast : bootstrap_asts)
-    delete ast;
+  for (Stmt* stmt : bootstrap_asts)
+    delete stmt;
   delete ev;
   delete vars;
   delete cache_mgr;
diff --git a/parser.cc b/parser.cc
index d8b33e4..106b576 100644
--- a/parser.cc
+++ b/parser.cc
@@ -19,14 +19,14 @@
 #include <stack>
 #include <unordered_map>
 
-#include "ast.h"
+#include "expr.h"
 #include "file.h"
 #include "loc.h"
 #include "log.h"
 #include "stats.h"
+#include "stmt.h"
 #include "string_piece.h"
 #include "strutil.h"
-#include "value.h"
 
 enum struct ParserState {
   NOT_AFTER_RULE = 0,
@@ -36,7 +36,7 @@
 
 class Parser {
   struct IfState {
-    IfAST* ast;
+    IfStmt* stmt;
     bool is_in_else;
     int num_nest;
   };
@@ -46,21 +46,21 @@
   typedef unordered_map<StringPiece, DirectiveHandler> DirectiveMap;
 
  public:
-  Parser(StringPiece buf, const char* filename, vector<AST*>* asts)
+  Parser(StringPiece buf, const char* filename, vector<Stmt*>* stmts)
       : buf_(buf),
         state_(ParserState::NOT_AFTER_RULE),
-        asts_(asts),
-        out_asts_(asts),
+        stmts_(stmts),
+        out_stmts_(stmts),
         num_if_nest_(0),
         loc_(filename, 0),
         fixed_lineno_(false) {
   }
 
-  Parser(StringPiece buf, const Loc& loc, vector<AST*>* asts)
+  Parser(StringPiece buf, const Loc& loc, vector<Stmt*>* stmts)
       : buf_(buf),
         state_(ParserState::NOT_AFTER_RULE),
-        asts_(asts),
-        out_asts_(asts),
+        stmts_(stmts),
+        out_stmts_(stmts),
         num_if_nest_(0),
         loc_(loc),
         fixed_lineno_(true) {
@@ -131,15 +131,15 @@
 
   void set_state(ParserState st) { state_ = st; }
 
-  static vector<ParseErrorAST*> parse_errors;
+  static vector<ParseErrorStmt*> parse_errors;
 
  private:
   void Error(const string& msg) {
-    ParseErrorAST* ast = new ParseErrorAST();
-    ast->set_loc(loc_);
-    ast->msg = msg;
-    out_asts_->push_back(ast);
-    parse_errors.push_back(ast);
+    ParseErrorStmt* stmt = new ParseErrorStmt();
+    stmt->set_loc(loc_);
+    stmt->msg = msg;
+    out_stmts_->push_back(stmt);
+    parse_errors.push_back(stmt);
   }
 
   size_t FindEndOfLine(size_t* lf_cnt) {
@@ -162,11 +162,11 @@
     current_directive_ = AssignDirective::NONE;
 
     if (line[0] == '\t' && state_ != ParserState::NOT_AFTER_RULE) {
-      CommandAST* ast = new CommandAST();
-      ast->set_loc(loc_);
-      ast->expr = ParseExpr(line.substr(1), ParseExprOpt::COMMAND);
-      ast->orig = line;
-      out_asts_->push_back(ast);
+      CommandStmt* stmt = new CommandStmt();
+      stmt->set_loc(loc_);
+      stmt->expr = ParseExpr(line.substr(1), ParseExprOpt::COMMAND);
+      stmt->orig = line;
+      out_stmts_->push_back(stmt);
       return;
     }
 
@@ -217,23 +217,23 @@
     }
 
     const bool is_rule = sep != string::npos && line[sep] == ':';
-    RuleAST* ast = new RuleAST();
-    ast->set_loc(loc_);
+    RuleStmt* stmt = new RuleStmt();
+    stmt->set_loc(loc_);
 
     size_t found = FindTwoOutsideParen(line.substr(sep + 1), '=', ';');
     if (found != string::npos) {
       found += sep + 1;
-      ast->term = line[found];
+      stmt->term = line[found];
       ParseExprOpt opt =
-          ast->term == ';' ? ParseExprOpt::COMMAND : ParseExprOpt::NORMAL;
-      ast->after_term = ParseExpr(TrimLeftSpace(line.substr(found + 1)), opt);
-      ast->expr = ParseExpr(TrimSpace(line.substr(0, found)));
+          stmt->term == ';' ? ParseExprOpt::COMMAND : ParseExprOpt::NORMAL;
+      stmt->after_term = ParseExpr(TrimLeftSpace(line.substr(found + 1)), opt);
+      stmt->expr = ParseExpr(TrimSpace(line.substr(0, found)));
     } else {
-      ast->term = 0;
-      ast->after_term = NULL;
-      ast->expr = ParseExpr(line);
+      stmt->term = 0;
+      stmt->after_term = NULL;
+      stmt->expr = ParseExpr(line);
     }
-    out_asts_->push_back(ast);
+    out_stmts_->push_back(stmt);
     state_ = is_rule ? ParserState::AFTER_RULE : ParserState::MAYBE_AFTER_RULE;
   }
 
@@ -247,23 +247,23 @@
     AssignOp op;
     ParseAssignStatement(line, sep, &lhs, &rhs, &op);
 
-    AssignAST* ast = new AssignAST();
-    ast->set_loc(loc_);
-    ast->lhs = ParseExpr(lhs);
-    ast->rhs = ParseExpr(rhs);
-    ast->orig_rhs = rhs;
-    ast->op = op;
-    ast->directive = current_directive_;
-    out_asts_->push_back(ast);
+    AssignStmt* stmt = new AssignStmt();
+    stmt->set_loc(loc_);
+    stmt->lhs = ParseExpr(lhs);
+    stmt->rhs = ParseExpr(rhs);
+    stmt->orig_rhs = rhs;
+    stmt->op = op;
+    stmt->directive = current_directive_;
+    out_stmts_->push_back(stmt);
     state_ = ParserState::NOT_AFTER_RULE;
   }
 
   void ParseInclude(StringPiece line, StringPiece directive) {
-    IncludeAST* ast = new IncludeAST();
-    ast->set_loc(loc_);
-    ast->expr = ParseExpr(line);
-    ast->should_exist = directive[0] == 'i';
-    out_asts_->push_back(ast);
+    IncludeStmt* stmt = new IncludeStmt();
+    stmt->set_loc(loc_);
+    stmt->expr = ParseExpr(line);
+    stmt->should_exist = directive[0] == 'i';
+    out_stmts_->push_back(stmt);
     state_ = ParserState::NOT_AFTER_RULE;
   }
 
@@ -292,40 +292,40 @@
       WARN("%s:%d: extraneous text after `endef' directive", LOCF(loc_));
     }
 
-    AssignAST* ast = new AssignAST();
-    ast->set_loc(Loc(loc_.filename, define_start_line_));
-    ast->lhs = ParseExpr(define_name_);
+    AssignStmt* stmt = new AssignStmt();
+    stmt->set_loc(Loc(loc_.filename, define_start_line_));
+    stmt->lhs = ParseExpr(define_name_);
     StringPiece rhs;
     if (define_start_)
       rhs = buf_.substr(define_start_, l_ - define_start_ - 1);
-    ast->rhs = ParseExpr(rhs, ParseExprOpt::DEFINE);
-    ast->orig_rhs = rhs;
-    ast->op = AssignOp::EQ;
-    ast->directive = current_directive_;
-    out_asts_->push_back(ast);
+    stmt->rhs = ParseExpr(rhs, ParseExprOpt::DEFINE);
+    stmt->orig_rhs = rhs;
+    stmt->op = AssignOp::EQ;
+    stmt->directive = current_directive_;
+    out_stmts_->push_back(stmt);
     define_name_.clear();
   }
 
-  void EnterIf(IfAST* ast) {
+  void EnterIf(IfStmt* stmt) {
     IfState* st = new IfState();
-    st->ast = ast;
+    st->stmt = stmt;
     st->is_in_else = false;
     st->num_nest = num_if_nest_;
     if_stack_.push(st);
-    out_asts_ = &ast->true_asts;
+    out_stmts_ = &stmt->true_stmts;
   }
 
   void ParseIfdef(StringPiece line, StringPiece directive) {
-    IfAST* ast = new IfAST();
-    ast->set_loc(loc_);
-    ast->op = directive[2] == 'n' ? CondOp::IFNDEF : CondOp::IFDEF;
-    ast->lhs = ParseExpr(line);
-    ast->rhs = NULL;
-    out_asts_->push_back(ast);
-    EnterIf(ast);
+    IfStmt* stmt = new IfStmt();
+    stmt->set_loc(loc_);
+    stmt->op = directive[2] == 'n' ? CondOp::IFNDEF : CondOp::IFDEF;
+    stmt->lhs = ParseExpr(line);
+    stmt->rhs = NULL;
+    out_stmts_->push_back(stmt);
+    EnterIf(stmt);
   }
 
-  bool ParseIfEqCond(StringPiece s, IfAST* ast) {
+  bool ParseIfEqCond(StringPiece s, IfStmt* stmt) {
     if (s.empty()) {
       return false;
     }
@@ -334,11 +334,11 @@
       s = s.substr(1, s.size() - 2);
       char terms[] = {',', '\0'};
       size_t n;
-      ast->lhs = ParseExprImpl(loc_, s, terms, ParseExprOpt::NORMAL, &n, true);
+      stmt->lhs = ParseExprImpl(loc_, s, terms, ParseExprOpt::NORMAL, &n, true);
       if (s[n] != ',')
         return false;
       s = TrimLeftSpace(s.substr(n+1));
-      ast->rhs = ParseExprImpl(loc_, s, NULL, ParseExprOpt::NORMAL, &n);
+      stmt->rhs = ParseExprImpl(loc_, s, NULL, ParseExprOpt::NORMAL, &n);
       s = TrimLeftSpace(s.substr(n));
     } else {
       for (int i = 0; i < 2; i++) {
@@ -352,9 +352,9 @@
           return false;
         Value* v = ParseExpr(s.substr(1, end - 1), ParseExprOpt::NORMAL);
         if (i == 0)
-          ast->lhs = v;
+          stmt->lhs = v;
         else
-          ast->rhs = v;
+          stmt->rhs = v;
         s = TrimLeftSpace(s.substr(end+1));
       }
     }
@@ -366,17 +366,17 @@
   }
 
   void ParseIfeq(StringPiece line, StringPiece directive) {
-    IfAST* ast = new IfAST();
-    ast->set_loc(loc_);
-    ast->op = directive[2] == 'n' ? CondOp::IFNEQ : CondOp::IFEQ;
+    IfStmt* stmt = new IfStmt();
+    stmt->set_loc(loc_);
+    stmt->op = directive[2] == 'n' ? CondOp::IFNEQ : CondOp::IFEQ;
 
-    if (!ParseIfEqCond(line, ast)) {
+    if (!ParseIfEqCond(line, stmt)) {
       Error("*** invalid syntax in conditional.");
       return;
     }
 
-    out_asts_->push_back(ast);
-    EnterIf(ast);
+    out_stmts_->push_back(stmt);
+    EnterIf(stmt);
   }
 
   void ParseElse(StringPiece line, StringPiece) {
@@ -388,7 +388,7 @@
       return;
     }
     st->is_in_else = true;
-    out_asts_ = &st->ast->false_asts;
+    out_stmts_ = &st->stmt->false_stmts;
 
     StringPiece next_if = TrimLeftSpace(line);
     if (next_if.empty())
@@ -413,13 +413,13 @@
       delete if_stack_.top();
       if_stack_.pop();
       if (if_stack_.empty()) {
-        out_asts_ = asts_;
+        out_stmts_ = stmts_;
       } else {
         IfState* st = if_stack_.top();
         if (st->is_in_else)
-          out_asts_ = &st->ast->false_asts;
+          out_stmts_ = &st->stmt->false_stmts;
         else
-          out_asts_ = &st->ast->true_asts;
+          out_stmts_ = &st->stmt->true_stmts;
       }
     }
   }
@@ -430,11 +430,11 @@
   }
 
   void CreateExport(StringPiece line, bool is_export) {
-    ExportAST* ast = new ExportAST;
-    ast->set_loc(loc_);
-    ast->expr = ParseExpr(line);
-    ast->is_export = is_export;
-    out_asts_->push_back(ast);
+    ExportStmt* stmt = new ExportStmt;
+    stmt->set_loc(loc_);
+    stmt->expr = ParseExpr(line);
+    stmt->is_export = is_export;
+    out_stmts_->push_back(stmt);
   }
 
   void ParseOverride(StringPiece line, StringPiece) {
@@ -504,8 +504,8 @@
   size_t l_;
   ParserState state_;
 
-  vector<AST*>* asts_;
-  vector<AST*>* out_asts_;
+  vector<Stmt*>* stmts_;
+  vector<Stmt*>* out_stmts_;
 
   StringPiece define_name_;
   size_t define_start_;
@@ -531,19 +531,19 @@
   COLLECT_STATS("parse file time");
   Parser parser(StringPiece(mk->buf(), mk->len()),
                 mk->filename().c_str(),
-                mk->mutable_asts());
+                mk->mutable_stmts());
   parser.Parse();
 }
 
-void Parse(StringPiece buf, const Loc& loc, vector<AST*>* out_asts) {
+void Parse(StringPiece buf, const Loc& loc, vector<Stmt*>* out_stmts) {
   COLLECT_STATS("parse eval time");
-  Parser parser(buf, loc, out_asts);
+  Parser parser(buf, loc, out_stmts);
   parser.Parse();
 }
 
 void ParseNotAfterRule(StringPiece buf, const Loc& loc,
-                       vector<AST*>* out_asts) {
-  Parser parser(buf, loc, out_asts);
+                       vector<Stmt*>* out_stmts) {
+  Parser parser(buf, loc, out_stmts);
   parser.set_state(ParserState::NOT_AFTER_RULE);
   parser.Parse();
 }
@@ -561,7 +561,7 @@
 Parser::DirectiveMap* Parser::assign_directives_;
 size_t Parser::shortest_directive_len_;
 size_t Parser::longest_directive_len_;
-vector<ParseErrorAST*> Parser::parse_errors;
+vector<ParseErrorStmt*> Parser::parse_errors;
 
 void ParseAssignStatement(StringPiece line, size_t sep,
                           StringPiece* lhs, StringPiece* rhs, AssignOp* op) {
@@ -586,6 +586,6 @@
   *rhs = TrimSpace(line.substr(sep + 1));
 }
 
-const vector<ParseErrorAST*>& GetParseErrors() {
+const vector<ParseErrorStmt*>& GetParseErrors() {
   return Parser::parse_errors;
 }
diff --git a/parser.h b/parser.h
index 857219d..95b7241 100644
--- a/parser.h
+++ b/parser.h
@@ -17,8 +17,8 @@
 
 #include <vector>
 
-#include "ast.h"
 #include "loc.h"
+#include "stmt.h"
 #include "string_piece.h"
 
 using namespace std;
@@ -26,9 +26,9 @@
 class Makefile;
 
 void Parse(Makefile* mk);
-void Parse(StringPiece buf, const Loc& loc, vector<AST*>* out_asts);
+void Parse(StringPiece buf, const Loc& loc, vector<Stmt*>* out_asts);
 void ParseNotAfterRule(StringPiece buf, const Loc& loc,
-                       vector<AST*>* out_asts);
+                       vector<Stmt*>* out_asts);
 
 void ParseAssignStatement(StringPiece line, size_t sep,
                           StringPiece* lhs, StringPiece* rhs, AssignOp* op);
@@ -36,6 +36,6 @@
 void InitParser();
 void QuitParser();
 
-const vector<ParseErrorAST*>& GetParseErrors();
+const vector<ParseErrorStmt*>& GetParseErrors();
 
 #endif  // PARSER_H_
diff --git a/rule.cc b/rule.cc
index 175b43a..a77366a 100644
--- a/rule.cc
+++ b/rule.cc
@@ -16,12 +16,12 @@
 
 #include "rule.h"
 
+#include "expr.h"
 #include "log.h"
 #include "parser.h"
 #include "stringprintf.h"
 #include "strutil.h"
 #include "symtab.h"
-#include "value.h"
 
 namespace {
 
diff --git a/rule.h b/rule.h
index c6fd72c..2a67368 100644
--- a/rule.h
+++ b/rule.h
@@ -17,9 +17,9 @@
 
 #include <vector>
 
-#include "ast.h"
 #include "loc.h"
 #include "log.h"
+#include "stmt.h"
 #include "string_piece.h"
 #include "symtab.h"
 
diff --git a/ast.cc b/stmt.cc
similarity index 66%
rename from ast.cc
rename to stmt.cc
index 50f2a6b..1abab32 100644
--- a/ast.cc
+++ b/stmt.cc
@@ -14,26 +14,26 @@
 
 // +build ignore
 
-#include "ast.h"
+#include "stmt.h"
 
 #include "eval.h"
+#include "expr.h"
 #include "stringprintf.h"
 #include "strutil.h"
-#include "value.h"
 
-AST::AST() {}
+Stmt::Stmt() {}
 
-AST::~AST() {}
+Stmt::~Stmt() {}
 
-string RuleAST::DebugString() const {
-  return StringPrintf("RuleAST(expr=%s term=%d after_term=%s loc=%s:%d)",
+string RuleStmt::DebugString() const {
+  return StringPrintf("RuleStmt(expr=%s term=%d after_term=%s loc=%s:%d)",
                       expr->DebugString().c_str(),
                       term,
                       after_term->DebugString().c_str(),
                       LOCF(loc()));
 }
 
-string AssignAST::DebugString() const {
+string AssignStmt::DebugString() const {
   const char* opstr = "???";
   switch (op) {
     case AssignOp::EQ: opstr = "EQ"; break;
@@ -47,7 +47,7 @@
     case AssignDirective::OVERRIDE: dirstr = "override"; break;
     case AssignDirective::EXPORT: dirstr = "export"; break;
   }
-  return StringPrintf("AssignAST(lhs=%s rhs=%s (%s) "
+  return StringPrintf("AssignStmt(lhs=%s rhs=%s (%s) "
                       "opstr=%s dir=%s loc=%s:%d)",
                       lhs->DebugString().c_str(),
                       rhs->DebugString().c_str(),
@@ -55,12 +55,12 @@
                       opstr, dirstr, LOCF(loc()));
 }
 
-string CommandAST::DebugString() const {
-  return StringPrintf("CommandAST(%s, loc=%s:%d)",
+string CommandStmt::DebugString() const {
+  return StringPrintf("CommandStmt(%s, loc=%s:%d)",
                       expr->DebugString().c_str(), LOCF(loc()));
 }
 
-string IfAST::DebugString() const {
+string IfStmt::DebugString() const {
   const char* opstr = "???";
   switch (op) {
     case CondOp::IFEQ: opstr = "ifeq"; break;
@@ -68,88 +68,88 @@
     case CondOp::IFDEF: opstr = "ifdef"; break;
     case CondOp::IFNDEF: opstr = "ifndef"; break;
   }
-  return StringPrintf("IfAST(op=%s, lhs=%s, rhs=%s t=%zu f=%zu loc=%s:%d)",
+  return StringPrintf("IfStmt(op=%s, lhs=%s, rhs=%s t=%zu f=%zu loc=%s:%d)",
                       opstr,
                       lhs->DebugString().c_str(),
                       rhs->DebugString().c_str(),
-                      true_asts.size(),
-                      false_asts.size(),
+                      true_stmts.size(),
+                      false_stmts.size(),
                       LOCF(loc()));
 }
 
-string IncludeAST::DebugString() const {
-  return StringPrintf("IncludeAST(%s, loc=%s:%d)",
+string IncludeStmt::DebugString() const {
+  return StringPrintf("IncludeStmt(%s, loc=%s:%d)",
                       expr->DebugString().c_str(), LOCF(loc()));
 }
 
-string ExportAST::DebugString() const {
-  return StringPrintf("ExportAST(%s, %d, loc=%s:%d)",
+string ExportStmt::DebugString() const {
+  return StringPrintf("ExportStmt(%s, %d, loc=%s:%d)",
                       expr->DebugString().c_str(),
                       is_export,
                       LOCF(loc()));
 }
 
-string ParseErrorAST::DebugString() const {
-  return StringPrintf("ParseErrorAST(%s, loc=%s:%d)",
+string ParseErrorStmt::DebugString() const {
+  return StringPrintf("ParseErrorStmt(%s, loc=%s:%d)",
                       msg.c_str(),
                       LOCF(loc()));
 }
 
-RuleAST::~RuleAST() {
+RuleStmt::~RuleStmt() {
   delete expr;
   delete after_term;
 }
 
-void RuleAST::Eval(Evaluator* ev) const {
+void RuleStmt::Eval(Evaluator* ev) const {
   ev->EvalRule(this);
 }
 
-AssignAST::~AssignAST() {
+AssignStmt::~AssignStmt() {
   delete lhs;
   delete rhs;
 }
 
-void AssignAST::Eval(Evaluator* ev) const {
+void AssignStmt::Eval(Evaluator* ev) const {
   ev->EvalAssign(this);
 }
 
-CommandAST::~CommandAST() {
+CommandStmt::~CommandStmt() {
   delete expr;
 }
 
-void CommandAST::Eval(Evaluator* ev) const {
+void CommandStmt::Eval(Evaluator* ev) const {
   ev->EvalCommand(this);
 }
 
-IfAST::~IfAST() {
+IfStmt::~IfStmt() {
   delete lhs;
   delete rhs;
 }
 
-void IfAST::Eval(Evaluator* ev) const {
+void IfStmt::Eval(Evaluator* ev) const {
   ev->EvalIf(this);
 }
 
-IncludeAST::~IncludeAST() {
+IncludeStmt::~IncludeStmt() {
   delete expr;
 }
 
-void IncludeAST::Eval(Evaluator* ev) const {
+void IncludeStmt::Eval(Evaluator* ev) const {
   ev->EvalInclude(this);
 }
 
-ExportAST::~ExportAST() {
+ExportStmt::~ExportStmt() {
   delete expr;
 }
 
-void ExportAST::Eval(Evaluator* ev) const {
+void ExportStmt::Eval(Evaluator* ev) const {
   ev->EvalExport(this);
 }
 
-ParseErrorAST::~ParseErrorAST() {
+ParseErrorStmt::~ParseErrorStmt() {
 }
 
-void ParseErrorAST::Eval(Evaluator* ev) const {
+void ParseErrorStmt::Eval(Evaluator* ev) const {
   ev->set_loc(loc());
   ev->Error(msg);
 }
diff --git a/ast.h b/stmt.h
similarity index 79%
rename from ast.h
rename to stmt.h
index 0289853..4d4c5eb 100644
--- a/ast.h
+++ b/stmt.h
@@ -12,8 +12,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#ifndef AST_H_
-#define AST_H_
+#ifndef STMT_H_
+#define STMT_H_
 
 #include <string>
 #include <vector>
@@ -46,9 +46,9 @@
   IFNDEF,
 };
 
-struct AST {
+struct Stmt {
  public:
-  virtual ~AST();
+  virtual ~Stmt();
 
   Loc loc() const { return loc_; }
   void set_loc(Loc loc) { loc_ = loc; }
@@ -59,94 +59,94 @@
   virtual string DebugString() const = 0;
 
  protected:
-  AST();
+  Stmt();
 
  private:
   Loc loc_;
   StringPiece orig_;
 };
 
-struct RuleAST : public AST {
+struct RuleStmt : public Stmt {
   Value* expr;
   char term;
   Value* after_term;
 
-  virtual ~RuleAST();
+  virtual ~RuleStmt();
 
   virtual void Eval(Evaluator* ev) const;
 
   virtual string DebugString() const;
 };
 
-struct AssignAST : public AST {
+struct AssignStmt : public Stmt {
   Value* lhs;
   Value* rhs;
   StringPiece orig_rhs;
   AssignOp op;
   AssignDirective directive;
 
-  virtual ~AssignAST();
+  virtual ~AssignStmt();
 
   virtual void Eval(Evaluator* ev) const;
 
   virtual string DebugString() const;
 };
 
-struct CommandAST : public AST {
+struct CommandStmt : public Stmt {
   Value* expr;
   StringPiece orig;
 
-  virtual ~CommandAST();
+  virtual ~CommandStmt();
 
   virtual void Eval(Evaluator* ev) const;
 
   virtual string DebugString() const;
 };
 
-struct IfAST : public AST {
+struct IfStmt : public Stmt {
   CondOp op;
   Value* lhs;
   Value* rhs;
-  vector<AST*> true_asts;
-  vector<AST*> false_asts;
+  vector<Stmt*> true_stmts;
+  vector<Stmt*> false_stmts;
 
-  virtual ~IfAST();
+  virtual ~IfStmt();
 
   virtual void Eval(Evaluator* ev) const;
 
   virtual string DebugString() const;
 };
 
-struct IncludeAST : public AST {
+struct IncludeStmt : public Stmt {
   Value* expr;
   bool should_exist;
 
-  virtual ~IncludeAST();
+  virtual ~IncludeStmt();
 
   virtual void Eval(Evaluator* ev) const;
 
   virtual string DebugString() const;
 };
 
-struct ExportAST : public AST {
+struct ExportStmt : public Stmt {
   Value* expr;
   bool is_export;
 
-  virtual ~ExportAST();
+  virtual ~ExportStmt();
 
   virtual void Eval(Evaluator* ev) const;
 
   virtual string DebugString() const;
 };
 
-struct ParseErrorAST : public AST {
+struct ParseErrorStmt : public Stmt {
   string msg;
 
-  virtual ~ParseErrorAST();
+  virtual ~ParseErrorStmt();
 
   virtual void Eval(Evaluator* ev) const;
 
   virtual string DebugString() const;
 };
 
-#endif  // AST_H_
+#endif  // STMT_H_
diff --git a/var.cc b/var.cc
index 8ee7588..d21dc4f 100644
--- a/var.cc
+++ b/var.cc
@@ -16,8 +16,8 @@
 
 #include "var.h"
 
+#include "expr.h"
 #include "log.h"
-#include "value.h"
 
 UndefinedVar kUndefinedBuf;
 UndefinedVar* kUndefined = &kUndefinedBuf;
diff --git a/var.h b/var.h
index e2eddc7..3bae262 100644
--- a/var.h
+++ b/var.h
@@ -19,10 +19,10 @@
 #include <unordered_map>
 #include <unordered_set>
 
-#include "ast.h"
+#include "expr.h"
+#include "stmt.h"
 #include "string_piece.h"
 #include "symtab.h"
-#include "value.h"
 
 using namespace std;