struct Token {
enum Type {
NONE,
+ UNKNOWN,
IDENT,
RULE,
BUILD,
string AsString() const {
switch (type_) {
case IDENT: return "'" + extra_ + "'";
+ case UNKNOWN: return "unknown '" + extra_ + "'";
case RULE: return "'rule'";
case BUILD: return "'build'";
case NEWLINE: return "newline";
SkipWhitespace();
if (token_.type_ == Token::NONE) {
- assert(false); // XXX
+ token_.type_ = Token::UNKNOWN;
+ token_.extra_ = *cur_;
}
+
return token_.type_;
}
if (!parser_.ExpectToken(Token::RULE, err))
return false;
string name;
- if (!parser_.ReadIdent(&name))
- return parser_.Error("expected rule name", err);
+ if (!parser_.ReadIdent(&name)) {
+ return parser_.Error("expected rule name, got " + parser_.token().AsString(),
+ err);
+ }
if (!parser_.Newline(err))
return false;
&err));
EXPECT_EQ("line 3, col 1: expected 'command =' line", err);
}
+
+ {
+ ManifestParser parser(&state);
+ string err;
+ EXPECT_FALSE(parser.Parse("rule %foo\n",
+ &err));
+ EXPECT_EQ("line 1, col 6: expected rule name, got unknown '%'", err);
+ }
}
TEST(Parser, BuildDir) {