blob: 3c84c3f7e76e5304c5e8b0d6b5b7a0fa9c8ea912 [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
44 Var* LookupVar(StringPiece name);
45 // For target specific variables.
46 Var* LookupVarInCurrentScope(StringPiece name);
47
48 EvalResult* GetEvalResult();
49
Shinichiro Hamaji9619b362015-06-16 16:13:25 +090050 const Loc& loc() const { return loc_; }
51
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090052#if 0
53 const vector<Rule*>& rules() const { return rules_; }
54 const Vars* vars() const { return vars_; }
55 const unordered_map<StringPiece, Vars*>& rule_vars() const {
56 return rule_vars_;
57 }
58#endif
59
Shinichiro Hamaji9619b362015-06-16 16:13:25 +090060 void Error(const string& msg);
61
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090062 private:
63 const Vars* in_vars_;
64 Vars* vars_;
65 unordered_map<StringPiece, Vars*> rule_vars_;
66 vector<Rule*> rules_;
67 Rule* last_rule_;
68
69 Loc loc_;
70};
71
72#endif // EVAL_H_