blob: cf911f69529c9471e05dd3f2deb7646cf7e86616 [file] [log] [blame]
Shinichiro Hamaji776ca302015-06-06 03:52:48 +09001#ifndef EVAL_H_
2#define EVAL_H_
3
Shinichiro Hamaji0562c302015-06-19 15:30:49 +09004#include <memory>
Shinichiro Hamaji776ca302015-06-06 03:52:48 +09005#include <unordered_map>
6#include <vector>
7
Shinichiro Hamaji784b9952015-06-23 14:29:32 +09008#include "ast.h"
Shinichiro Hamaji776ca302015-06-06 03:52:48 +09009#include "loc.h"
10#include "string_piece.h"
11
12using namespace std;
13
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090014class Makefile;
15class Rule;
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090016class Var;
17class Vars;
18
19struct EvalResult {
20 ~EvalResult();
Shinichiro Hamaji0562c302015-06-19 15:30:49 +090021 vector<shared_ptr<Rule>> rules;
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090022 Vars* vars;
23 unordered_map<StringPiece, Vars*> rule_vars;
24 // TODO: read_mks
25 unordered_map<StringPiece, bool> exports;
26};
27
28class Evaluator {
29 public:
30 Evaluator(const Vars* vars);
31 ~Evaluator();
32
33 void EvalAssign(const AssignAST* ast);
34 void EvalRule(const RuleAST* ast);
35 void EvalCommand(const CommandAST* ast);
Shinichiro Hamaji42b625f2015-06-16 23:07:21 +090036 void EvalIf(const IfAST* ast);
37 void EvalInclude(const IncludeAST* ast);
38 void EvalExport(const ExportAST* ast);
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090039
40 Var* LookupVar(StringPiece name);
41 // For target specific variables.
42 Var* LookupVarInCurrentScope(StringPiece name);
43
44 EvalResult* GetEvalResult();
45
Shinichiro Hamaji9619b362015-06-16 16:13:25 +090046 const Loc& loc() const { return loc_; }
47
Shinichiro Hamajicf0cd682015-06-18 16:18:13 +090048 Vars* mutable_vars() { return vars_; }
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090049
Shinichiro Hamaji9619b362015-06-16 16:13:25 +090050 void Error(const string& msg);
51
Shinichiro Hamaji0e74c542015-06-22 16:17:08 +090052 void set_is_bootstrap(bool b) { is_bootstrap_ = b; }
53
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090054 private:
Shinichiro Hamaji784b9952015-06-23 14:29:32 +090055 void DoAssign(StringPiece lhs, Value* rhs, StringPiece orig_rhs, AssignOp op);
Shinichiro Hamaji6e6de8d2015-06-18 11:12:58 +090056 void DoInclude(const char* fname, bool should_exist);
57
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090058 const Vars* in_vars_;
59 Vars* vars_;
60 unordered_map<StringPiece, Vars*> rule_vars_;
Shinichiro Hamaji0562c302015-06-19 15:30:49 +090061 vector<shared_ptr<Rule>> rules_;
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090062 Rule* last_rule_;
Shinichiro Hamaji784b9952015-06-23 14:29:32 +090063 Vars* current_scope_;
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090064
65 Loc loc_;
Shinichiro Hamaji0e74c542015-06-22 16:17:08 +090066 bool is_bootstrap_;
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090067};
68
69#endif // EVAL_H_