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