ignore whitespace in makefiles
authorEvan Martin <martine@danga.com>
Fri, 4 Feb 2011 00:55:25 +0000 (16:55 -0800)
committerEvan Martin <martine@danga.com>
Fri, 4 Feb 2011 00:55:25 +0000 (16:55 -0800)
src/parsers.cc
src/parsers.h
src/parsers_test.cc

index 532d98e..8e44a38 100644 (file)
@@ -143,7 +143,7 @@ Token::Type Tokenizer::PeekToken() {
     return token_.type_;
 
   token_.pos_ = cur_;
-  if (cur_indent_ == -1) {
+  if (whitespace_significant_ && cur_indent_ == -1) {
     cur_indent_ = cur_ - cur_line_;
     if (cur_indent_ != last_indent_) {
       if (cur_indent_ > last_indent_) {
@@ -213,9 +213,13 @@ void Tokenizer::ConsumeToken() {
   token_.Clear();
 }
 
+MakefileParser::MakefileParser() : tokenizer_(false) {}
+
 bool MakefileParser::Parse(const string& input, string* err) {
   tokenizer_.Start(input.data(), input.data() + input.size());
 
+  tokenizer_.SkipWhitespace(true);
+
   if (!tokenizer_.ReadIdent(&out_))
     return tokenizer_.ErrorExpected("output filename", err);
   if (!tokenizer_.ExpectToken(Token::COLON, err))
@@ -234,7 +238,7 @@ bool MakefileParser::Parse(const string& input, string* err) {
 }
 
 ManifestParser::ManifestParser(State* state, FileReader* file_reader)
-  : state_(state), file_reader_(file_reader) {
+  : state_(state), file_reader_(file_reader), tokenizer_(true) {
   env_ = &state->bindings_;
 }
 bool ManifestParser::Load(const string& filename, string* err) {
index 13fdf25..01f65c0 100644 (file)
@@ -37,8 +37,9 @@ struct Token {
 };
 
 struct Tokenizer {
-  Tokenizer()
-      : token_(Token::NONE), line_number_(1),
+  Tokenizer(bool whitespace_significant)
+      : whitespace_significant_(whitespace_significant),
+        token_(Token::NONE), line_number_(1),
         last_indent_(0), cur_indent_(-1) {}
 
   void Start(const char* start, const char* end);
@@ -57,6 +58,8 @@ struct Tokenizer {
   Token::Type PeekToken();
   void ConsumeToken();
 
+  bool whitespace_significant_;
+
   const char* cur_;
   const char* end_;
 
@@ -67,6 +70,7 @@ struct Tokenizer {
 };
 
 struct MakefileParser {
+  MakefileParser();
   bool Parse(const string& input, string* err);
 
   Tokenizer tokenizer_;
index 18fc8bb..7810113 100644 (file)
@@ -316,3 +316,13 @@ TEST(MakefileParser, Basic) {
   ASSERT_EQ("", err);
 }
 
+TEST(MakefileParser, EarlyNewlineAndWhitespace) {
+  MakefileParser parser;
+  string err;
+  EXPECT_TRUE(parser.Parse(
+" \\\n"
+"  out: in\n",
+      &err));
+  ASSERT_EQ("", err);
+}
+