blob: 48394bb62454db46604982f3b8a7c661b1a2b6a5 [file] [log] [blame]
Shinichiro Hamaji1d545aa2015-06-23 15:29:13 +09001// Copyright 2015 Google Inc. All rights reserved
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090015#ifndef RULE_H_
16#define RULE_H_
17
Shinichiro Hamajic4f76622016-06-30 13:05:10 +090018#include <functional>
19#include <string>
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090020#include <vector>
21
22#include "loc.h"
23#include "log.h"
Shinichiro Hamaji645cca72015-09-24 17:04:21 +090024#include "stmt.h"
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090025#include "string_piece.h"
Shinichiro Hamajie7992752015-06-29 18:38:35 +090026#include "symtab.h"
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090027
28using namespace std;
29
30class Value;
31
32class Rule {
33 public:
34 Rule();
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090035
Shinichiro Hamajie30b3be2015-06-19 16:15:42 +090036 Loc cmd_loc() const { return Loc(loc.filename, cmd_lineno); }
37
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090038 string DebugString() const;
39
Shinichiro Hamajie7992752015-06-29 18:38:35 +090040 vector<Symbol> outputs;
41 vector<Symbol> inputs;
42 vector<Symbol> order_only_inputs;
43 vector<Symbol> output_patterns;
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090044 bool is_double_colon;
45 bool is_suffix_rule;
46 vector<Value*> cmds;
47 Loc loc;
48 int cmd_lineno;
49
50 private:
51 void Error(const string& msg) {
Dan Willemsene41c7552017-02-22 14:31:16 -080052 ERROR_LOC(loc, "%s", msg.c_str());
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090053 }
54};
55
Shinichiro Hamajiffc52c32015-06-23 16:51:07 +090056struct RuleVarAssignment {
Shinichiro Hamajie7992752015-06-29 18:38:35 +090057 vector<Symbol> outputs;
Shinichiro Hamaji9b16bda2015-06-19 14:25:17 +090058 StringPiece lhs;
59 StringPiece rhs;
60 AssignOp op;
61};
62
Shinichiro Hamajic4f76622016-06-30 13:05:10 +090063// If |rule| is not NULL, |rule_var| is filled. If the expression
64// after the terminator |term| is needed (this happens only when
65// |term| is '='), |after_term_fn| will be called to obtain the right
66// hand side.
Shinichiro Hamaji2928f462015-06-23 20:24:53 +090067void ParseRule(Loc& loc, StringPiece line, char term,
Dan Willemsencb2ff852016-11-01 14:49:08 -070068 const function<string()> &after_term_fn,
Shinichiro Hamajiffc52c32015-06-23 16:51:07 +090069 Rule** rule, RuleVarAssignment* rule_var);
Shinichiro Hamaji9b16bda2015-06-19 14:25:17 +090070
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090071#endif // RULE_H_