handle unexpected tokens
authorEvan Martin <martine@danga.com>
Sun, 24 Oct 2010 19:25:03 +0000 (12:25 -0700)
committerEvan Martin <martine@danga.com>
Sun, 24 Oct 2010 19:25:03 +0000 (12:25 -0700)
manifest_parser.h
ninja_test.cc

index dbc424f..6641f6e 100644 (file)
@@ -5,6 +5,7 @@
 struct Token {
   enum Type {
     NONE,
+    UNKNOWN,
     IDENT,
     RULE,
     BUILD,
@@ -21,6 +22,7 @@ struct Token {
   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";
@@ -209,8 +211,10 @@ Token::Type Parser::PeekToken() {
   SkipWhitespace();
 
   if (token_.type_ == Token::NONE) {
-    assert(false); // XXX
+    token_.type_ = Token::UNKNOWN;
+    token_.extra_ = *cur_;
   }
+
   return token_.type_;
 }
 
@@ -300,8 +304,10 @@ bool ManifestParser::ParseRule(string* err) {
   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;
 
index 37e16e9..8fa9296 100644 (file)
@@ -128,6 +128,14 @@ TEST(Parser, Errors) {
                               &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) {