outs.push_back(out);
}
- string rule;
- if (!parser_.ReadToken(&rule))
+ string rule_name;
+ if (!parser_.ReadToken(&rule_name))
return parser_.Error("expected build command name", err);
+ Rule* rule = state_->LookupRule(rule_name);
+ if (!rule)
+ return parser_.Error("unknown build rule '" + rule_name + "'", err);
+
for (;;) {
string in;
if (!parser_.ReadToken(&in))
return false;
Edge* edge = state_->AddEdge(rule);
- if (!edge)
- return parser_.Error("unknown build rule name name", err);
for (vector<string>::iterator i = ins.begin(); i != ins.end(); ++i)
state_->AddInOut(edge, Edge::IN, *i);
for (vector<string>::iterator i = outs.begin(); i != outs.end(); ++i)
virtual string Evaluate(const string& var);
Rule* AddRule(const string& name, const string& command);
+ Rule* LookupRule(const string& rule_name);
Edge* AddEdge(Rule* rule);
- Edge* AddEdge(const string& rule_name);
Node* GetNode(const string& path);
void AddInOut(Edge* edge, Edge::InOut inout, const string& path);
void AddBinding(const string& key, const string& val);
return "";
}
+
+Rule* State::LookupRule(const string& rule_name) {
+ map<string, Rule*>::iterator i = rules_.find(rule_name);
+ if (i == rules_.end())
+ return NULL;
+ return i->second;
+}
+
Rule* State::AddRule(const string& name, const string& command) {
Rule* rule = new Rule(name, command);
rules_[name] = rule;
return rule;
}
-Edge* State::AddEdge(const string& rule_name) {
- return AddEdge(rules_[rule_name]);
-}
-
Edge* State::AddEdge(Rule* rule) {
Edge* edge = new Edge();
edge->rule_ = rule;
EXPECT_FALSE(parser.Parse("x = 3\ny 2", &err));
EXPECT_EQ("line 2, col 3: expected '=', got '2'", err);
}
+
+ {
+ ManifestParser parser(&state);
+ string err;
+ EXPECT_FALSE(parser.Parse("build x: y z\n", &err));
+ EXPECT_EQ("line 1, col 10: unknown build rule 'y'", err);
+ }
}
TEST(State, Basic) {