blob: 6a27c6283a27c93316c110dee47bedd4eb4f9fd4 [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 Hamaji776ca302015-06-06 03:52:48 +090053#if 0
54 const vector<Rule*>& rules() const { return rules_; }
55 const Vars* vars() const { return vars_; }
56 const unordered_map<StringPiece, Vars*>& rule_vars() const {
57 return rule_vars_;
58 }
59#endif
60
Shinichiro Hamaji9619b362015-06-16 16:13:25 +090061 void Error(const string& msg);
62
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090063 private:
Shinichiro Hamaji6e6de8d2015-06-18 11:12:58 +090064 void DoInclude(const char* fname, bool should_exist);
65
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090066 const Vars* in_vars_;
67 Vars* vars_;
68 unordered_map<StringPiece, Vars*> rule_vars_;
69 vector<Rule*> rules_;
70 Rule* last_rule_;
71
72 Loc loc_;
73};
74
75#endif // EVAL_H_