blob: d99c778a1f83c182d29c8cfe856869560acc6764 [file] [log] [blame]
Shinichiro Hamaji776ca302015-06-06 03:52:48 +09001#ifndef EVAL_H_
2#define EVAL_H_
3
4#include <unordered_map>
5#include <vector>
6
7#include "loc.h"
8#include "string_piece.h"
9
10using namespace std;
11
12class AssignAST;
13class CommandAST;
Shinichiro Hamaji42b625f2015-06-16 23:07:21 +090014class ExportAST;
15class IfAST;
16class IncludeAST;
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090017class Makefile;
18class Rule;
19class RuleAST;
20class Var;
21class Vars;
22
23struct EvalResult {
24 ~EvalResult();
25 vector<Rule*> rules;
26 Vars* vars;
27 unordered_map<StringPiece, Vars*> rule_vars;
28 // TODO: read_mks
29 unordered_map<StringPiece, bool> exports;
30};
31
32class Evaluator {
33 public:
34 Evaluator(const Vars* vars);
35 ~Evaluator();
36
37 void EvalAssign(const AssignAST* ast);
38 void EvalRule(const RuleAST* ast);
39 void EvalCommand(const CommandAST* ast);
Shinichiro Hamaji42b625f2015-06-16 23:07:21 +090040 void EvalIf(const IfAST* ast);
41 void EvalInclude(const IncludeAST* ast);
42 void EvalExport(const ExportAST* ast);
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090043
Shinichiro Hamaji6e6de8d2015-06-18 11:12:58 +090044
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090045 Var* LookupVar(StringPiece name);
46 // For target specific variables.
47 Var* LookupVarInCurrentScope(StringPiece name);
48
49 EvalResult* GetEvalResult();
50
Shinichiro Hamaji9619b362015-06-16 16:13:25 +090051 const Loc& loc() const { return loc_; }
52
Shinichiro Hamajicf0cd682015-06-18 16:18:13 +090053 Vars* mutable_vars() { return vars_; }
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090054
Shinichiro Hamaji9619b362015-06-16 16:13:25 +090055 void Error(const string& msg);
56
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090057 private:
Shinichiro Hamaji6e6de8d2015-06-18 11:12:58 +090058 void DoInclude(const char* fname, bool should_exist);
59
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090060 const Vars* in_vars_;
61 Vars* vars_;
62 unordered_map<StringPiece, Vars*> rule_vars_;
63 vector<Rule*> rules_;
64 Rule* last_rule_;
65
66 Loc loc_;
67};
68
69#endif // EVAL_H_