11d545aa8a83ba34273b4692c78cf1981fc798658Shinichiro Hamaji// Copyright 2015 Google Inc. All rights reserved
21d545aa8a83ba34273b4692c78cf1981fc798658Shinichiro Hamaji//
31d545aa8a83ba34273b4692c78cf1981fc798658Shinichiro Hamaji// Licensed under the Apache License, Version 2.0 (the "License");
41d545aa8a83ba34273b4692c78cf1981fc798658Shinichiro Hamaji// you may not use this file except in compliance with the License.
51d545aa8a83ba34273b4692c78cf1981fc798658Shinichiro Hamaji// You may obtain a copy of the License at
61d545aa8a83ba34273b4692c78cf1981fc798658Shinichiro Hamaji//
71d545aa8a83ba34273b4692c78cf1981fc798658Shinichiro Hamaji//      http://www.apache.org/licenses/LICENSE-2.0
81d545aa8a83ba34273b4692c78cf1981fc798658Shinichiro Hamaji//
91d545aa8a83ba34273b4692c78cf1981fc798658Shinichiro Hamaji// Unless required by applicable law or agreed to in writing, software
101d545aa8a83ba34273b4692c78cf1981fc798658Shinichiro Hamaji// distributed under the License is distributed on an "AS IS" BASIS,
111d545aa8a83ba34273b4692c78cf1981fc798658Shinichiro Hamaji// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
121d545aa8a83ba34273b4692c78cf1981fc798658Shinichiro Hamaji// See the License for the specific language governing permissions and
131d545aa8a83ba34273b4692c78cf1981fc798658Shinichiro Hamaji// limitations under the License.
141d545aa8a83ba34273b4692c78cf1981fc798658Shinichiro Hamaji
15776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji#ifndef RULE_H_
16776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji#define RULE_H_
17776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji
18c4f7662b112a232e313b69706f148de4e69b9f21Shinichiro Hamaji#include <functional>
19c4f7662b112a232e313b69706f148de4e69b9f21Shinichiro Hamaji#include <string>
20776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji#include <vector>
21776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji
22776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji#include "loc.h"
23776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji#include "log.h"
24645cca7910dccf4811dbf65d4c83a068a83b48c9Shinichiro Hamaji#include "stmt.h"
25776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji#include "string_piece.h"
26e7992752dbfe23d0a88312b4279531c39512b9a6Shinichiro Hamaji#include "symtab.h"
27776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji
28776ca3085c44e6570813270df75278849c37d400Shinichiro Hamajiusing namespace std;
29776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji
30776ca3085c44e6570813270df75278849c37d400Shinichiro Hamajiclass Value;
31776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji
32776ca3085c44e6570813270df75278849c37d400Shinichiro Hamajiclass Rule {
33776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji public:
34776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji  Rule();
35776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji
36e30b3bee7d149ae80a95af3ca8eb9942e295f695Shinichiro Hamaji  Loc cmd_loc() const { return Loc(loc.filename, cmd_lineno); }
37e30b3bee7d149ae80a95af3ca8eb9942e295f695Shinichiro Hamaji
38776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji  string DebugString() const;
39776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji
40e7992752dbfe23d0a88312b4279531c39512b9a6Shinichiro Hamaji  vector<Symbol> outputs;
41e7992752dbfe23d0a88312b4279531c39512b9a6Shinichiro Hamaji  vector<Symbol> inputs;
42e7992752dbfe23d0a88312b4279531c39512b9a6Shinichiro Hamaji  vector<Symbol> order_only_inputs;
43e7992752dbfe23d0a88312b4279531c39512b9a6Shinichiro Hamaji  vector<Symbol> output_patterns;
44776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji  bool is_double_colon;
45776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji  bool is_suffix_rule;
46776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji  vector<Value*> cmds;
47776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji  Loc loc;
48776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji  int cmd_lineno;
49776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji
50776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji private:
51776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji  void Error(const string& msg) {
52e41c7556c22bda359c2b97cd98d59082110add95Dan Willemsen    ERROR_LOC(loc, "%s", msg.c_str());
53776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji  }
54776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji};
55776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji
56ffc52c3c5bed9d696d0296c1674d2e75460bef40Shinichiro Hamajistruct RuleVarAssignment {
57e7992752dbfe23d0a88312b4279531c39512b9a6Shinichiro Hamaji  vector<Symbol> outputs;
589b16bda965b29b6ba5ce3178abf8e4655e5af044Shinichiro Hamaji  StringPiece lhs;
599b16bda965b29b6ba5ce3178abf8e4655e5af044Shinichiro Hamaji  StringPiece rhs;
609b16bda965b29b6ba5ce3178abf8e4655e5af044Shinichiro Hamaji  AssignOp op;
619b16bda965b29b6ba5ce3178abf8e4655e5af044Shinichiro Hamaji};
629b16bda965b29b6ba5ce3178abf8e4655e5af044Shinichiro Hamaji
63c4f7662b112a232e313b69706f148de4e69b9f21Shinichiro Hamaji// If |rule| is not NULL, |rule_var| is filled. If the expression
64c4f7662b112a232e313b69706f148de4e69b9f21Shinichiro Hamaji// after the terminator |term| is needed (this happens only when
65c4f7662b112a232e313b69706f148de4e69b9f21Shinichiro Hamaji// |term| is '='), |after_term_fn| will be called to obtain the right
66c4f7662b112a232e313b69706f148de4e69b9f21Shinichiro Hamaji// hand side.
672928f46a3097334af15d492eb0b355ed4c1a21e9Shinichiro Hamajivoid ParseRule(Loc& loc, StringPiece line, char term,
68cb2ff8558ced3ddc021823a3c86bc7ce02dcbdc3Dan Willemsen               const function<string()> &after_term_fn,
69ffc52c3c5bed9d696d0296c1674d2e75460bef40Shinichiro Hamaji               Rule** rule, RuleVarAssignment* rule_var);
709b16bda965b29b6ba5ce3178abf8e4655e5af044Shinichiro Hamaji
71776ca3085c44e6570813270df75278849c37d400Shinichiro Hamaji#endif  // RULE_H_
72