blob: 4cbca8e1cef074431c59bd97147b6cc1a8134130 [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:
Dan Willemsen3ce083f2017-10-11 22:17:48 -070051 void Error(const string& msg) { ERROR_LOC(loc, "%s", msg.c_str()); }
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090052};
53
Shinichiro Hamajiffc52c32015-06-23 16:51:07 +090054struct RuleVarAssignment {
Shinichiro Hamajie7992752015-06-29 18:38:35 +090055 vector<Symbol> outputs;
Shinichiro Hamaji9b16bda2015-06-19 14:25:17 +090056 StringPiece lhs;
57 StringPiece rhs;
58 AssignOp op;
59};
60
Shinichiro Hamajic4f76622016-06-30 13:05:10 +090061// If |rule| is not NULL, |rule_var| is filled. If the expression
62// after the terminator |term| is needed (this happens only when
63// |term| is '='), |after_term_fn| will be called to obtain the right
64// hand side.
Dan Willemsen3ce083f2017-10-11 22:17:48 -070065void ParseRule(Loc& loc,
66 StringPiece line,
67 char term,
68 const function<string()>& after_term_fn,
69 Rule** rule,
70 RuleVarAssignment* rule_var);
Shinichiro Hamaji9b16bda2015-06-19 14:25:17 +090071
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090072#endif // RULE_H_