blob: 8728f0e475ced657cb7ae20e922aae2c36a8b2b4 [file] [log] [blame]
Shinichiro Hamaji776ca302015-06-06 03:52:48 +09001#ifndef RULE_H_
2#define RULE_H_
3
4#include <vector>
5
Shinichiro Hamaji9b16bda2015-06-19 14:25:17 +09006#include "ast.h"
Shinichiro Hamaji776ca302015-06-06 03:52:48 +09007#include "loc.h"
8#include "log.h"
9#include "string_piece.h"
10
11using namespace std;
12
Shinichiro Hamaji9b16bda2015-06-19 14:25:17 +090013class Evaluator;
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090014class Value;
15
16class Rule {
17 public:
18 Rule();
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090019
Shinichiro Hamajie30b3be2015-06-19 16:15:42 +090020 Loc cmd_loc() const { return Loc(loc.filename, cmd_lineno); }
21
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090022 string DebugString() const;
23
24 vector<StringPiece> outputs;
25 vector<StringPiece> inputs;
26 vector<StringPiece> order_only_inputs;
Shinichiro Hamaji9b16bda2015-06-19 14:25:17 +090027 vector<StringPiece> output_patterns;
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090028 bool is_double_colon;
29 bool is_suffix_rule;
30 vector<Value*> cmds;
31 Loc loc;
32 int cmd_lineno;
33
34 private:
35 void Error(const string& msg) {
36 ERROR("%s:%d: %s", loc.filename, loc.lineno, msg.c_str());
37 }
38};
39
Shinichiro Hamaji9b16bda2015-06-19 14:25:17 +090040struct RuleVar {
41 vector<StringPiece> outputs;
42 StringPiece lhs;
43 StringPiece rhs;
44 AssignOp op;
45};
46
47// If |rule| is not NULL, rule_var is filled.
48void ParseRule(Loc& loc, StringPiece line, Rule** rule, RuleVar* rule_var);
49
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090050#endif // RULE_H_