diff options
-rw-r--r-- | src/depfile_parser.cc | 476 | ||||
-rw-r--r-- | src/graphviz.h | 5 | ||||
-rw-r--r-- | src/lexer.cc | 1734 | ||||
-rw-r--r-- | src/ninja.cc | 2 |
4 files changed, 1108 insertions, 1109 deletions
diff --git a/src/depfile_parser.cc b/src/depfile_parser.cc index 7268f31..c5bc291 100644 --- a/src/depfile_parser.cc +++ b/src/depfile_parser.cc @@ -1,238 +1,238 @@ -/* Generated by re2c 0.13.5 */ -// Copyright 2011 Google Inc. All Rights Reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#include "depfile_parser.h" - -// A note on backslashes in Makefiles, from reading the docs: -// Backslash-newline is the line continuation character. -// Backslash-# escapes a # (otherwise meaningful as a comment start). -// Backslash-% escapes a % (otherwise meaningful as a special). -// Finally, quoting the GNU manual, "Backslashes that are not in danger -// of quoting ‘%’ characters go unmolested." -// How do you end a line with a backslash? The netbsd Make docs suggest -// reading the result of a shell command echoing a backslash! -// -// Rather than implement all of above, we do a simpler thing here: -// Backslashes escape a set of characters (see "escapes" defined below), -// otherwise they are passed through verbatim. -// If anyone actually has depfiles that rely on the more complicated -// behavior we can adjust this. -bool DepfileParser::Parse(string* content, string* err) { - // in: current parser input point. - // end: end of input. - // parsing_targets: whether we are parsing targets or dependencies. - char* in = &(*content)[0]; - char* end = in + content->size(); - bool parsing_targets = true; - while (in < end) { - // out: current output point (typically same as in, but can fall behind - // as we de-escape backslashes). - char* out = in; - // filename: start of the current parsed filename. - char* filename = out; - for (;;) { - // start: beginning of the current parsed span. - const char* start = in; - - { - char yych; - static const unsigned char yybm[] = { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 128, 0, 0, 0, 0, 0, 0, - 128, 128, 0, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 0, 0, 128, 0, 0, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 0, 0, 0, 0, 128, - 0, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 0, 128, 128, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - }; - - yych = *in; - if (yych <= '=') { - if (yych <= '$') { - if (yych <= ' ') { - if (yych <= 0x00) goto yy7; - goto yy9; - } else { - if (yych <= '!') goto yy5; - if (yych <= '#') goto yy9; - goto yy4; - } - } else { - if (yych <= '*') { - if (yych <= '\'') goto yy9; - if (yych <= ')') goto yy5; - goto yy9; - } else { - if (yych <= ':') goto yy5; - if (yych <= '<') goto yy9; - goto yy5; - } - } - } else { - if (yych <= '^') { - if (yych <= 'Z') { - if (yych <= '?') goto yy9; - goto yy5; - } else { - if (yych != '\\') goto yy9; - } - } else { - if (yych <= '{') { - if (yych == '`') goto yy9; - goto yy5; - } else { - if (yych <= '|') goto yy9; - if (yych <= '~') goto yy5; - goto yy9; - } - } - } - ++in; - if ((yych = *in) <= '"') { - if (yych <= '\f') { - if (yych <= 0x00) goto yy3; - if (yych != '\n') goto yy14; - } else { - if (yych <= '\r') goto yy3; - if (yych == ' ') goto yy16; - goto yy14; - } - } else { - if (yych <= 'Z') { - if (yych <= '#') goto yy16; - if (yych == '*') goto yy16; - goto yy14; - } else { - if (yych <= '\\') goto yy16; - if (yych == '|') goto yy16; - goto yy14; - } - } -yy3: - { - // For any other character (e.g. whitespace), swallow it here, - // allowing the outer logic to loop around again. - break; - } -yy4: - yych = *++in; - if (yych == '$') goto yy12; - goto yy3; -yy5: - ++in; - yych = *in; - goto yy11; -yy6: - { - // Got a span of plain text. - int len = (int)(in - start); - // Need to shift it over if we're overwriting backslashes. - if (out < start) - memmove(out, start, len); - out += len; - continue; - } -yy7: - ++in; - { - break; - } -yy9: - yych = *++in; - goto yy3; -yy10: - ++in; - yych = *in; -yy11: - if (yybm[0+yych] & 128) { - goto yy10; - } - goto yy6; -yy12: - ++in; - { - // De-escape dollar character. - *out++ = '$'; - continue; - } -yy14: - ++in; - { - // Let backslash before other characters through verbatim. - *out++ = '\\'; - *out++ = yych; - continue; - } -yy16: - ++in; - { - // De-escape backslashed character. - *out++ = yych; - continue; - } - } - - } - - int len = (int)(out - filename); - const bool is_target = parsing_targets; - if (len > 0 && filename[len - 1] == ':') { - len--; // Strip off trailing colon, if any. - parsing_targets = false; - } - - if (len == 0) - continue; - - if (!is_target) { - ins_.push_back(StringPiece(filename, len)); - } else if (!out_.str_) { - out_ = StringPiece(filename, len); - } else if (out_ != StringPiece(filename, len)) { - *err = "depfile has multiple output paths"; - return false; - } - } - if (parsing_targets) { - *err = "expected ':' in depfile"; - return false; - } - return true; -} +/* Generated by re2c 0.13.5 */
+// Copyright 2011 Google Inc. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "depfile_parser.h"
+
+// A note on backslashes in Makefiles, from reading the docs:
+// Backslash-newline is the line continuation character.
+// Backslash-# escapes a # (otherwise meaningful as a comment start).
+// Backslash-% escapes a % (otherwise meaningful as a special).
+// Finally, quoting the GNU manual, "Backslashes that are not in danger
+// of quoting ‘%’ characters go unmolested."
+// How do you end a line with a backslash? The netbsd Make docs suggest
+// reading the result of a shell command echoing a backslash!
+//
+// Rather than implement all of above, we do a simpler thing here:
+// Backslashes escape a set of characters (see "escapes" defined below),
+// otherwise they are passed through verbatim.
+// If anyone actually has depfiles that rely on the more complicated
+// behavior we can adjust this.
+bool DepfileParser::Parse(string* content, string* err) {
+ // in: current parser input point.
+ // end: end of input.
+ // parsing_targets: whether we are parsing targets or dependencies.
+ char* in = &(*content)[0];
+ char* end = in + content->size();
+ bool parsing_targets = true;
+ while (in < end) {
+ // out: current output point (typically same as in, but can fall behind
+ // as we de-escape backslashes).
+ char* out = in;
+ // filename: start of the current parsed filename.
+ char* filename = out;
+ for (;;) {
+ // start: beginning of the current parsed span.
+ const char* start = in;
+
+ {
+ char yych;
+ static const unsigned char yybm[] = {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 128, 0, 0, 0, 0, 0, 0,
+ 128, 128, 0, 128, 128, 128, 128, 128,
+ 128, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 128, 0, 0, 128, 0, 0,
+ 128, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 128, 0, 0, 0, 0, 128,
+ 0, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 128, 128, 0, 128, 128, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ };
+
+ yych = *in;
+ if (yych <= '=') {
+ if (yych <= '$') {
+ if (yych <= ' ') {
+ if (yych <= 0x00) goto yy7;
+ goto yy9;
+ } else {
+ if (yych <= '!') goto yy5;
+ if (yych <= '#') goto yy9;
+ goto yy4;
+ }
+ } else {
+ if (yych <= '*') {
+ if (yych <= '\'') goto yy9;
+ if (yych <= ')') goto yy5;
+ goto yy9;
+ } else {
+ if (yych <= ':') goto yy5;
+ if (yych <= '<') goto yy9;
+ goto yy5;
+ }
+ }
+ } else {
+ if (yych <= '^') {
+ if (yych <= 'Z') {
+ if (yych <= '?') goto yy9;
+ goto yy5;
+ } else {
+ if (yych != '\\') goto yy9;
+ }
+ } else {
+ if (yych <= '{') {
+ if (yych == '`') goto yy9;
+ goto yy5;
+ } else {
+ if (yych <= '|') goto yy9;
+ if (yych <= '~') goto yy5;
+ goto yy9;
+ }
+ }
+ }
+ ++in;
+ if ((yych = *in) <= '"') {
+ if (yych <= '\f') {
+ if (yych <= 0x00) goto yy3;
+ if (yych != '\n') goto yy14;
+ } else {
+ if (yych <= '\r') goto yy3;
+ if (yych == ' ') goto yy16;
+ goto yy14;
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '#') goto yy16;
+ if (yych == '*') goto yy16;
+ goto yy14;
+ } else {
+ if (yych <= '\\') goto yy16;
+ if (yych == '|') goto yy16;
+ goto yy14;
+ }
+ }
+yy3:
+ {
+ // For any other character (e.g. whitespace), swallow it here,
+ // allowing the outer logic to loop around again.
+ break;
+ }
+yy4:
+ yych = *++in;
+ if (yych == '$') goto yy12;
+ goto yy3;
+yy5:
+ ++in;
+ yych = *in;
+ goto yy11;
+yy6:
+ {
+ // Got a span of plain text.
+ int len = (int)(in - start);
+ // Need to shift it over if we're overwriting backslashes.
+ if (out < start)
+ memmove(out, start, len);
+ out += len;
+ continue;
+ }
+yy7:
+ ++in;
+ {
+ break;
+ }
+yy9:
+ yych = *++in;
+ goto yy3;
+yy10:
+ ++in;
+ yych = *in;
+yy11:
+ if (yybm[0+yych] & 128) {
+ goto yy10;
+ }
+ goto yy6;
+yy12:
+ ++in;
+ {
+ // De-escape dollar character.
+ *out++ = '$';
+ continue;
+ }
+yy14:
+ ++in;
+ {
+ // Let backslash before other characters through verbatim.
+ *out++ = '\\';
+ *out++ = yych;
+ continue;
+ }
+yy16:
+ ++in;
+ {
+ // De-escape backslashed character.
+ *out++ = yych;
+ continue;
+ }
+ }
+
+ }
+
+ int len = (int)(out - filename);
+ const bool is_target = parsing_targets;
+ if (len > 0 && filename[len - 1] == ':') {
+ len--; // Strip off trailing colon, if any.
+ parsing_targets = false;
+ }
+
+ if (len == 0)
+ continue;
+
+ if (!is_target) {
+ ins_.push_back(StringPiece(filename, len));
+ } else if (!out_.str_) {
+ out_ = StringPiece(filename, len);
+ } else if (out_ != StringPiece(filename, len)) {
+ *err = "depfile has multiple output paths";
+ return false;
+ }
+ }
+ if (parsing_targets) {
+ *err = "expected ':' in depfile";
+ return false;
+ }
+ return true;
+}
diff --git a/src/graphviz.h b/src/graphviz.h index 1e2a29d..408496d 100644 --- a/src/graphviz.h +++ b/src/graphviz.h @@ -16,7 +16,6 @@ #define NINJA_GRAPHVIZ_H_ #include <set> -using namespace std; struct Node; struct Edge; @@ -27,8 +26,8 @@ struct GraphViz { void AddTarget(Node* node); void Finish(); - set<Node*> visited_nodes_; - set<Edge*> visited_edges_; + std::set<Node*> visited_nodes_; + std::set<Edge*> visited_edges_; }; #endif // NINJA_GRAPHVIZ_H_ diff --git a/src/lexer.cc b/src/lexer.cc index 37b8678..81264bd 100644 --- a/src/lexer.cc +++ b/src/lexer.cc @@ -1,867 +1,867 @@ -/* Generated by re2c 0.13.5 */ -// Copyright 2011 Google Inc. All Rights Reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#include "lexer.h" - -#include <stdio.h> - -#include "eval_env.h" -#include "util.h" - -bool Lexer::Error(const string& message, string* err) { - // Compute line/column. - int line = 1; - const char* context = input_.str_; - for (const char* p = input_.str_; p < last_token_; ++p) { - if (*p == '\n') { - ++line; - context = p + 1; - } - } - int col = last_token_ ? (int)(last_token_ - context) : 0; - - char buf[1024]; - snprintf(buf, sizeof(buf), "%s:%d: ", filename_.AsString().c_str(), line); - *err = buf; - *err += message + "\n"; - - // Add some context to the message. - const int kTruncateColumn = 72; - if (col > 0 && col < kTruncateColumn) { - int len; - bool truncated = true; - for (len = 0; len < kTruncateColumn; ++len) { - if (context[len] == 0 || context[len] == '\n') { - truncated = false; - break; - } - } - *err += string(context, len); - if (truncated) - *err += "..."; - *err += "\n"; - *err += string(col, ' '); - *err += "^ near here"; - } - - return false; -} - -Lexer::Lexer(const char* input) { - Start("input", input); -} - -void Lexer::Start(StringPiece filename, StringPiece input) { - filename_ = filename; - input_ = input; - ofs_ = input_.str_; - last_token_ = NULL; -} - -const char* Lexer::TokenName(Token t) { - switch (t) { - case ERROR: return "lexing error"; - case BUILD: return "'build'"; - case COLON: return "':'"; - case DEFAULT: return "'default'"; - case EQUALS: return "'='"; - case IDENT: return "identifier"; - case INCLUDE: return "'include'"; - case INDENT: return "indent"; - case NEWLINE: return "newline"; - case PIPE2: return "'||'"; - case PIPE: return "'|'"; - case POOL: return "'pool'"; - case RULE: return "'rule'"; - case SUBNINJA: return "'subninja'"; - case TEOF: return "eof"; - } - return NULL; // not reached -} - -const char* Lexer::TokenErrorHint(Token expected) { - switch (expected) { - case COLON: - return " ($ also escapes ':')"; - default: - return ""; - } -} - -string Lexer::DescribeLastError() { - if (last_token_) { - switch (last_token_[0]) { - case '\t': - return "tabs are not allowed, use spaces"; - } - } - return "lexing error"; -} - -void Lexer::UnreadToken() { - ofs_ = last_token_; -} - -Lexer::Token Lexer::ReadToken() { - const char* p = ofs_; - const char* q; - const char* start; - Lexer::Token token; - for (;;) { - start = p; - -{ - unsigned char yych; - unsigned int yyaccept = 0; - static const unsigned char yybm[] = { - 0, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 0, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 192, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 96, 96, 64, - 96, 96, 96, 96, 96, 96, 96, 96, - 96, 96, 64, 64, 64, 64, 64, 64, - 64, 96, 96, 96, 96, 96, 96, 96, - 96, 96, 96, 96, 96, 96, 96, 96, - 96, 96, 96, 96, 96, 96, 96, 96, - 96, 96, 96, 64, 64, 64, 64, 96, - 64, 96, 96, 96, 96, 96, 96, 96, - 96, 96, 96, 96, 96, 96, 96, 96, - 96, 96, 96, 96, 96, 96, 96, 96, - 96, 96, 96, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - }; - - yych = *p; - if (yych <= 'Z') { - if (yych <= '#') { - if (yych <= '\f') { - if (yych <= 0x00) goto yy23; - if (yych == '\n') goto yy7; - goto yy25; - } else { - if (yych <= 0x1F) { - if (yych <= '\r') goto yy6; - goto yy25; - } else { - if (yych <= ' ') goto yy2; - if (yych <= '"') goto yy25; - goto yy4; - } - } - } else { - if (yych <= '9') { - if (yych <= ',') goto yy25; - if (yych == '/') goto yy25; - goto yy22; - } else { - if (yych <= '<') { - if (yych <= ':') goto yy16; - goto yy25; - } else { - if (yych <= '=') goto yy14; - if (yych <= '@') goto yy25; - goto yy22; - } - } - } - } else { - if (yych <= 'i') { - if (yych <= 'a') { - if (yych == '_') goto yy22; - if (yych <= '`') goto yy25; - goto yy22; - } else { - if (yych <= 'c') { - if (yych <= 'b') goto yy9; - goto yy22; - } else { - if (yych <= 'd') goto yy13; - if (yych <= 'h') goto yy22; - goto yy20; - } - } - } else { - if (yych <= 'r') { - if (yych == 'p') goto yy11; - if (yych <= 'q') goto yy22; - goto yy12; - } else { - if (yych <= 'z') { - if (yych <= 's') goto yy21; - goto yy22; - } else { - if (yych == '|') goto yy18; - goto yy25; - } - } - } - } -yy2: - yyaccept = 0; - yych = *(q = ++p); - goto yy73; -yy3: - { token = INDENT; break; } -yy4: - yyaccept = 1; - yych = *(q = ++p); - if (yych >= 0x01) goto yy68; -yy5: - { token = ERROR; break; } -yy6: - yych = *++p; - if (yych == '\n') goto yy65; - goto yy5; -yy7: - ++p; -yy8: - { token = NEWLINE; break; } -yy9: - ++p; - if ((yych = *p) == 'u') goto yy60; - goto yy27; -yy10: - { token = IDENT; break; } -yy11: - yych = *++p; - if (yych == 'o') goto yy56; - goto yy27; -yy12: - yych = *++p; - if (yych == 'u') goto yy52; - goto yy27; -yy13: - yych = *++p; - if (yych == 'e') goto yy45; - goto yy27; -yy14: - ++p; - { token = EQUALS; break; } -yy16: - ++p; - { token = COLON; break; } -yy18: - ++p; - if ((yych = *p) == '|') goto yy43; - { token = PIPE; break; } -yy20: - yych = *++p; - if (yych == 'n') goto yy36; - goto yy27; -yy21: - yych = *++p; - if (yych == 'u') goto yy28; - goto yy27; -yy22: - yych = *++p; - goto yy27; -yy23: - ++p; - { token = TEOF; break; } -yy25: - yych = *++p; - goto yy5; -yy26: - ++p; - yych = *p; -yy27: - if (yybm[0+yych] & 32) { - goto yy26; - } - goto yy10; -yy28: - yych = *++p; - if (yych != 'b') goto yy27; - yych = *++p; - if (yych != 'n') goto yy27; - yych = *++p; - if (yych != 'i') goto yy27; - yych = *++p; - if (yych != 'n') goto yy27; - yych = *++p; - if (yych != 'j') goto yy27; - yych = *++p; - if (yych != 'a') goto yy27; - ++p; - if (yybm[0+(yych = *p)] & 32) { - goto yy26; - } - { token = SUBNINJA; break; } -yy36: - yych = *++p; - if (yych != 'c') goto yy27; - yych = *++p; - if (yych != 'l') goto yy27; - yych = *++p; - if (yych != 'u') goto yy27; - yych = *++p; - if (yych != 'd') goto yy27; - yych = *++p; - if (yych != 'e') goto yy27; - ++p; - if (yybm[0+(yych = *p)] & 32) { - goto yy26; - } - { token = INCLUDE; break; } -yy43: - ++p; - { token = PIPE2; break; } -yy45: - yych = *++p; - if (yych != 'f') goto yy27; - yych = *++p; - if (yych != 'a') goto yy27; - yych = *++p; - if (yych != 'u') goto yy27; - yych = *++p; - if (yych != 'l') goto yy27; - yych = *++p; - if (yych != 't') goto yy27; - ++p; - if (yybm[0+(yych = *p)] & 32) { - goto yy26; - } - { token = DEFAULT; break; } -yy52: - yych = *++p; - if (yych != 'l') goto yy27; - yych = *++p; - if (yych != 'e') goto yy27; - ++p; - if (yybm[0+(yych = *p)] & 32) { - goto yy26; - } - { token = RULE; break; } -yy56: - yych = *++p; - if (yych != 'o') goto yy27; - yych = *++p; - if (yych != 'l') goto yy27; - ++p; - if (yybm[0+(yych = *p)] & 32) { - goto yy26; - } - { token = POOL; break; } -yy60: - yych = *++p; - if (yych != 'i') goto yy27; - yych = *++p; - if (yych != 'l') goto yy27; - yych = *++p; - if (yych != 'd') goto yy27; - ++p; - if (yybm[0+(yych = *p)] & 32) { - goto yy26; - } - { token = BUILD; break; } -yy65: - ++p; - { token = NEWLINE; break; } -yy67: - ++p; - yych = *p; -yy68: - if (yybm[0+yych] & 64) { - goto yy67; - } - if (yych >= 0x01) goto yy70; -yy69: - p = q; - if (yyaccept <= 0) { - goto yy3; - } else { - goto yy5; - } -yy70: - ++p; - { continue; } -yy72: - yyaccept = 0; - q = ++p; - yych = *p; -yy73: - if (yybm[0+yych] & 128) { - goto yy72; - } - if (yych <= '\f') { - if (yych != '\n') goto yy3; - } else { - if (yych <= '\r') goto yy75; - if (yych == '#') goto yy67; - goto yy3; - } - yych = *++p; - goto yy8; -yy75: - ++p; - if ((yych = *p) == '\n') goto yy65; - goto yy69; -} - - } - - last_token_ = start; - ofs_ = p; - if (token != NEWLINE && token != TEOF) - EatWhitespace(); - return token; -} - -bool Lexer::PeekToken(Token token) { - Token t = ReadToken(); - if (t == token) - return true; - UnreadToken(); - return false; -} - -void Lexer::EatWhitespace() { - const char* p = ofs_; - const char* q; - for (;;) { - ofs_ = p; - -{ - unsigned char yych; - static const unsigned char yybm[] = { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 128, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - }; - yych = *p; - if (yych <= ' ') { - if (yych <= 0x00) goto yy82; - if (yych <= 0x1F) goto yy84; - } else { - if (yych == '$') goto yy80; - goto yy84; - } - ++p; - yych = *p; - goto yy92; -yy79: - { continue; } -yy80: - yych = *(q = ++p); - if (yych == '\n') goto yy85; - if (yych == '\r') goto yy87; -yy81: - { break; } -yy82: - ++p; - { break; } -yy84: - yych = *++p; - goto yy81; -yy85: - ++p; - { continue; } -yy87: - yych = *++p; - if (yych == '\n') goto yy89; - p = q; - goto yy81; -yy89: - ++p; - { continue; } -yy91: - ++p; - yych = *p; -yy92: - if (yybm[0+yych] & 128) { - goto yy91; - } - goto yy79; -} - - } -} - -bool Lexer::ReadIdent(string* out) { - const char* p = ofs_; - for (;;) { - const char* start = p; - -{ - unsigned char yych; - static const unsigned char yybm[] = { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 128, 128, 0, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 0, 0, 0, 0, 0, 0, - 0, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 0, 0, 0, 0, 128, - 0, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - }; - yych = *p; - if (yych <= '@') { - if (yych <= '.') { - if (yych <= ',') goto yy97; - } else { - if (yych <= '/') goto yy97; - if (yych >= ':') goto yy97; - } - } else { - if (yych <= '_') { - if (yych <= 'Z') goto yy95; - if (yych <= '^') goto yy97; - } else { - if (yych <= '`') goto yy97; - if (yych >= '{') goto yy97; - } - } -yy95: - ++p; - yych = *p; - goto yy100; -yy96: - { - out->assign(start, p - start); - break; - } -yy97: - ++p; - { return false; } -yy99: - ++p; - yych = *p; -yy100: - if (yybm[0+yych] & 128) { - goto yy99; - } - goto yy96; -} - - } - ofs_ = p; - EatWhitespace(); - return true; -} - -bool Lexer::ReadEvalString(EvalString* eval, bool path, string* err) { - const char* p = ofs_; - const char* q; - const char* start; - for (;;) { - start = p; - -{ - unsigned char yych; - static const unsigned char yybm[] = { - 0, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 0, 128, 128, 0, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 16, 128, 128, 128, 0, 128, 128, 128, - 128, 128, 128, 128, 128, 224, 160, 128, - 224, 224, 224, 224, 224, 224, 224, 224, - 224, 224, 0, 128, 128, 128, 128, 128, - 128, 224, 224, 224, 224, 224, 224, 224, - 224, 224, 224, 224, 224, 224, 224, 224, - 224, 224, 224, 224, 224, 224, 224, 224, - 224, 224, 224, 128, 128, 128, 128, 224, - 128, 224, 224, 224, 224, 224, 224, 224, - 224, 224, 224, 224, 224, 224, 224, 224, - 224, 224, 224, 224, 224, 224, 224, 224, - 224, 224, 224, 128, 0, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - }; - yych = *p; - if (yych <= ' ') { - if (yych <= '\n') { - if (yych <= 0x00) goto yy110; - if (yych >= '\n') goto yy107; - } else { - if (yych == '\r') goto yy105; - if (yych >= ' ') goto yy107; - } - } else { - if (yych <= '9') { - if (yych == '$') goto yy109; - } else { - if (yych <= ':') goto yy107; - if (yych == '|') goto yy107; - } - } - ++p; - yych = *p; - goto yy140; -yy104: - { - eval->AddText(StringPiece(start, p - start)); - continue; - } -yy105: - ++p; - if ((yych = *p) == '\n') goto yy137; - { - last_token_ = start; - return Error(DescribeLastError(), err); - } -yy107: - ++p; - { - if (path) { - p = start; - break; - } else { - if (*start == '\n') - break; - eval->AddText(StringPiece(start, 1)); - continue; - } - } -yy109: - yych = *++p; - if (yych <= '-') { - if (yych <= 0x1F) { - if (yych <= '\n') { - if (yych <= '\t') goto yy112; - goto yy124; - } else { - if (yych == '\r') goto yy114; - goto yy112; - } - } else { - if (yych <= '#') { - if (yych <= ' ') goto yy115; - goto yy112; - } else { - if (yych <= '$') goto yy117; - if (yych <= ',') goto yy112; - goto yy119; - } - } - } else { - if (yych <= 'Z') { - if (yych <= '9') { - if (yych <= '/') goto yy112; - goto yy119; - } else { - if (yych <= ':') goto yy121; - if (yych <= '@') goto yy112; - goto yy119; - } - } else { - if (yych <= '`') { - if (yych == '_') goto yy119; - goto yy112; - } else { - if (yych <= 'z') goto yy119; - if (yych <= '{') goto yy123; - goto yy112; - } - } - } -yy110: - ++p; - { - last_token_ = start; - return Error("unexpected EOF", err); - } -yy112: - ++p; -yy113: - { - last_token_ = start; - return Error("bad $-escape (literal $ must be written as $$)", err); - } -yy114: - yych = *++p; - if (yych == '\n') goto yy134; - goto yy113; -yy115: - ++p; - { - eval->AddText(StringPiece(" ", 1)); - continue; - } -yy117: - ++p; - { - eval->AddText(StringPiece("$", 1)); - continue; - } -yy119: - ++p; - yych = *p; - goto yy133; -yy120: - { - eval->AddSpecial(StringPiece(start + 1, p - start - 1)); - continue; - } -yy121: - ++p; - { - eval->AddText(StringPiece(":", 1)); - continue; - } -yy123: - yych = *(q = ++p); - if (yybm[0+yych] & 32) { - goto yy127; - } - goto yy113; -yy124: - ++p; - yych = *p; - if (yybm[0+yych] & 16) { - goto yy124; - } - { - continue; - } -yy127: - ++p; - yych = *p; - if (yybm[0+yych] & 32) { - goto yy127; - } - if (yych == '}') goto yy130; - p = q; - goto yy113; -yy130: - ++p; - { - eval->AddSpecial(StringPiece(start + 2, p - start - 3)); - continue; - } -yy132: - ++p; - yych = *p; -yy133: - if (yybm[0+yych] & 64) { - goto yy132; - } - goto yy120; -yy134: - ++p; - yych = *p; - if (yych == ' ') goto yy134; - { - continue; - } -yy137: - ++p; - { - if (path) - p = start; - break; - } -yy139: - ++p; - yych = *p; -yy140: - if (yybm[0+yych] & 128) { - goto yy139; - } - goto yy104; -} - - } - last_token_ = start; - ofs_ = p; - if (path) - EatWhitespace(); - // Non-path strings end in newlines, so there's no whitespace to eat. - return true; -} +/* Generated by re2c 0.13.5 */
+// Copyright 2011 Google Inc. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "lexer.h"
+
+#include <stdio.h>
+
+#include "eval_env.h"
+#include "util.h"
+
+bool Lexer::Error(const string& message, string* err) {
+ // Compute line/column.
+ int line = 1;
+ const char* context = input_.str_;
+ for (const char* p = input_.str_; p < last_token_; ++p) {
+ if (*p == '\n') {
+ ++line;
+ context = p + 1;
+ }
+ }
+ int col = last_token_ ? (int)(last_token_ - context) : 0;
+
+ char buf[1024];
+ snprintf(buf, sizeof(buf), "%s:%d: ", filename_.AsString().c_str(), line);
+ *err = buf;
+ *err += message + "\n";
+
+ // Add some context to the message.
+ const int kTruncateColumn = 72;
+ if (col > 0 && col < kTruncateColumn) {
+ int len;
+ bool truncated = true;
+ for (len = 0; len < kTruncateColumn; ++len) {
+ if (context[len] == 0 || context[len] == '\n') {
+ truncated = false;
+ break;
+ }
+ }
+ *err += string(context, len);
+ if (truncated)
+ *err += "...";
+ *err += "\n";
+ *err += string(col, ' ');
+ *err += "^ near here";
+ }
+
+ return false;
+}
+
+Lexer::Lexer(const char* input) {
+ Start("input", input);
+}
+
+void Lexer::Start(StringPiece filename, StringPiece input) {
+ filename_ = filename;
+ input_ = input;
+ ofs_ = input_.str_;
+ last_token_ = NULL;
+}
+
+const char* Lexer::TokenName(Token t) {
+ switch (t) {
+ case ERROR: return "lexing error";
+ case BUILD: return "'build'";
+ case COLON: return "':'";
+ case DEFAULT: return "'default'";
+ case EQUALS: return "'='";
+ case IDENT: return "identifier";
+ case INCLUDE: return "'include'";
+ case INDENT: return "indent";
+ case NEWLINE: return "newline";
+ case PIPE2: return "'||'";
+ case PIPE: return "'|'";
+ case POOL: return "'pool'";
+ case RULE: return "'rule'";
+ case SUBNINJA: return "'subninja'";
+ case TEOF: return "eof";
+ }
+ return NULL; // not reached
+}
+
+const char* Lexer::TokenErrorHint(Token expected) {
+ switch (expected) {
+ case COLON:
+ return " ($ also escapes ':')";
+ default:
+ return "";
+ }
+}
+
+string Lexer::DescribeLastError() {
+ if (last_token_) {
+ switch (last_token_[0]) {
+ case '\t':
+ return "tabs are not allowed, use spaces";
+ }
+ }
+ return "lexing error";
+}
+
+void Lexer::UnreadToken() {
+ ofs_ = last_token_;
+}
+
+Lexer::Token Lexer::ReadToken() {
+ const char* p = ofs_;
+ const char* q;
+ const char* start;
+ Lexer::Token token;
+ for (;;) {
+ start = p;
+
+{
+ unsigned char yych;
+ unsigned int yyaccept = 0;
+ static const unsigned char yybm[] = {
+ 0, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 0, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 192, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 96, 96, 64,
+ 96, 96, 96, 96, 96, 96, 96, 96,
+ 96, 96, 64, 64, 64, 64, 64, 64,
+ 64, 96, 96, 96, 96, 96, 96, 96,
+ 96, 96, 96, 96, 96, 96, 96, 96,
+ 96, 96, 96, 96, 96, 96, 96, 96,
+ 96, 96, 96, 64, 64, 64, 64, 96,
+ 64, 96, 96, 96, 96, 96, 96, 96,
+ 96, 96, 96, 96, 96, 96, 96, 96,
+ 96, 96, 96, 96, 96, 96, 96, 96,
+ 96, 96, 96, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ };
+
+ yych = *p;
+ if (yych <= 'Z') {
+ if (yych <= '#') {
+ if (yych <= '\f') {
+ if (yych <= 0x00) goto yy23;
+ if (yych == '\n') goto yy7;
+ goto yy25;
+ } else {
+ if (yych <= 0x1F) {
+ if (yych <= '\r') goto yy6;
+ goto yy25;
+ } else {
+ if (yych <= ' ') goto yy2;
+ if (yych <= '"') goto yy25;
+ goto yy4;
+ }
+ }
+ } else {
+ if (yych <= '9') {
+ if (yych <= ',') goto yy25;
+ if (yych == '/') goto yy25;
+ goto yy22;
+ } else {
+ if (yych <= '<') {
+ if (yych <= ':') goto yy16;
+ goto yy25;
+ } else {
+ if (yych <= '=') goto yy14;
+ if (yych <= '@') goto yy25;
+ goto yy22;
+ }
+ }
+ }
+ } else {
+ if (yych <= 'i') {
+ if (yych <= 'a') {
+ if (yych == '_') goto yy22;
+ if (yych <= '`') goto yy25;
+ goto yy22;
+ } else {
+ if (yych <= 'c') {
+ if (yych <= 'b') goto yy9;
+ goto yy22;
+ } else {
+ if (yych <= 'd') goto yy13;
+ if (yych <= 'h') goto yy22;
+ goto yy20;
+ }
+ }
+ } else {
+ if (yych <= 'r') {
+ if (yych == 'p') goto yy11;
+ if (yych <= 'q') goto yy22;
+ goto yy12;
+ } else {
+ if (yych <= 'z') {
+ if (yych <= 's') goto yy21;
+ goto yy22;
+ } else {
+ if (yych == '|') goto yy18;
+ goto yy25;
+ }
+ }
+ }
+ }
+yy2:
+ yyaccept = 0;
+ yych = *(q = ++p);
+ goto yy73;
+yy3:
+ { token = INDENT; break; }
+yy4:
+ yyaccept = 1;
+ yych = *(q = ++p);
+ if (yych >= 0x01) goto yy68;
+yy5:
+ { token = ERROR; break; }
+yy6:
+ yych = *++p;
+ if (yych == '\n') goto yy65;
+ goto yy5;
+yy7:
+ ++p;
+yy8:
+ { token = NEWLINE; break; }
+yy9:
+ ++p;
+ if ((yych = *p) == 'u') goto yy60;
+ goto yy27;
+yy10:
+ { token = IDENT; break; }
+yy11:
+ yych = *++p;
+ if (yych == 'o') goto yy56;
+ goto yy27;
+yy12:
+ yych = *++p;
+ if (yych == 'u') goto yy52;
+ goto yy27;
+yy13:
+ yych = *++p;
+ if (yych == 'e') goto yy45;
+ goto yy27;
+yy14:
+ ++p;
+ { token = EQUALS; break; }
+yy16:
+ ++p;
+ { token = COLON; break; }
+yy18:
+ ++p;
+ if ((yych = *p) == '|') goto yy43;
+ { token = PIPE; break; }
+yy20:
+ yych = *++p;
+ if (yych == 'n') goto yy36;
+ goto yy27;
+yy21:
+ yych = *++p;
+ if (yych == 'u') goto yy28;
+ goto yy27;
+yy22:
+ yych = *++p;
+ goto yy27;
+yy23:
+ ++p;
+ { token = TEOF; break; }
+yy25:
+ yych = *++p;
+ goto yy5;
+yy26:
+ ++p;
+ yych = *p;
+yy27:
+ if (yybm[0+yych] & 32) {
+ goto yy26;
+ }
+ goto yy10;
+yy28:
+ yych = *++p;
+ if (yych != 'b') goto yy27;
+ yych = *++p;
+ if (yych != 'n') goto yy27;
+ yych = *++p;
+ if (yych != 'i') goto yy27;
+ yych = *++p;
+ if (yych != 'n') goto yy27;
+ yych = *++p;
+ if (yych != 'j') goto yy27;
+ yych = *++p;
+ if (yych != 'a') goto yy27;
+ ++p;
+ if (yybm[0+(yych = *p)] & 32) {
+ goto yy26;
+ }
+ { token = SUBNINJA; break; }
+yy36:
+ yych = *++p;
+ if (yych != 'c') goto yy27;
+ yych = *++p;
+ if (yych != 'l') goto yy27;
+ yych = *++p;
+ if (yych != 'u') goto yy27;
+ yych = *++p;
+ if (yych != 'd') goto yy27;
+ yych = *++p;
+ if (yych != 'e') goto yy27;
+ ++p;
+ if (yybm[0+(yych = *p)] & 32) {
+ goto yy26;
+ }
+ { token = INCLUDE; break; }
+yy43:
+ ++p;
+ { token = PIPE2; break; }
+yy45:
+ yych = *++p;
+ if (yych != 'f') goto yy27;
+ yych = *++p;
+ if (yych != 'a') goto yy27;
+ yych = *++p;
+ if (yych != 'u') goto yy27;
+ yych = *++p;
+ if (yych != 'l') goto yy27;
+ yych = *++p;
+ if (yych != 't') goto yy27;
+ ++p;
+ if (yybm[0+(yych = *p)] & 32) {
+ goto yy26;
+ }
+ { token = DEFAULT; break; }
+yy52:
+ yych = *++p;
+ if (yych != 'l') goto yy27;
+ yych = *++p;
+ if (yych != 'e') goto yy27;
+ ++p;
+ if (yybm[0+(yych = *p)] & 32) {
+ goto yy26;
+ }
+ { token = RULE; break; }
+yy56:
+ yych = *++p;
+ if (yych != 'o') goto yy27;
+ yych = *++p;
+ if (yych != 'l') goto yy27;
+ ++p;
+ if (yybm[0+(yych = *p)] & 32) {
+ goto yy26;
+ }
+ { token = POOL; break; }
+yy60:
+ yych = *++p;
+ if (yych != 'i') goto yy27;
+ yych = *++p;
+ if (yych != 'l') goto yy27;
+ yych = *++p;
+ if (yych != 'd') goto yy27;
+ ++p;
+ if (yybm[0+(yych = *p)] & 32) {
+ goto yy26;
+ }
+ { token = BUILD; break; }
+yy65:
+ ++p;
+ { token = NEWLINE; break; }
+yy67:
+ ++p;
+ yych = *p;
+yy68:
+ if (yybm[0+yych] & 64) {
+ goto yy67;
+ }
+ if (yych >= 0x01) goto yy70;
+yy69:
+ p = q;
+ if (yyaccept <= 0) {
+ goto yy3;
+ } else {
+ goto yy5;
+ }
+yy70:
+ ++p;
+ { continue; }
+yy72:
+ yyaccept = 0;
+ q = ++p;
+ yych = *p;
+yy73:
+ if (yybm[0+yych] & 128) {
+ goto yy72;
+ }
+ if (yych <= '\f') {
+ if (yych != '\n') goto yy3;
+ } else {
+ if (yych <= '\r') goto yy75;
+ if (yych == '#') goto yy67;
+ goto yy3;
+ }
+ yych = *++p;
+ goto yy8;
+yy75:
+ ++p;
+ if ((yych = *p) == '\n') goto yy65;
+ goto yy69;
+}
+
+ }
+
+ last_token_ = start;
+ ofs_ = p;
+ if (token != NEWLINE && token != TEOF)
+ EatWhitespace();
+ return token;
+}
+
+bool Lexer::PeekToken(Token token) {
+ Token t = ReadToken();
+ if (t == token)
+ return true;
+ UnreadToken();
+ return false;
+}
+
+void Lexer::EatWhitespace() {
+ const char* p = ofs_;
+ const char* q;
+ for (;;) {
+ ofs_ = p;
+
+{
+ unsigned char yych;
+ static const unsigned char yybm[] = {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 128, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ };
+ yych = *p;
+ if (yych <= ' ') {
+ if (yych <= 0x00) goto yy82;
+ if (yych <= 0x1F) goto yy84;
+ } else {
+ if (yych == '$') goto yy80;
+ goto yy84;
+ }
+ ++p;
+ yych = *p;
+ goto yy92;
+yy79:
+ { continue; }
+yy80:
+ yych = *(q = ++p);
+ if (yych == '\n') goto yy85;
+ if (yych == '\r') goto yy87;
+yy81:
+ { break; }
+yy82:
+ ++p;
+ { break; }
+yy84:
+ yych = *++p;
+ goto yy81;
+yy85:
+ ++p;
+ { continue; }
+yy87:
+ yych = *++p;
+ if (yych == '\n') goto yy89;
+ p = q;
+ goto yy81;
+yy89:
+ ++p;
+ { continue; }
+yy91:
+ ++p;
+ yych = *p;
+yy92:
+ if (yybm[0+yych] & 128) {
+ goto yy91;
+ }
+ goto yy79;
+}
+
+ }
+}
+
+bool Lexer::ReadIdent(string* out) {
+ const char* p = ofs_;
+ for (;;) {
+ const char* start = p;
+
+{
+ unsigned char yych;
+ static const unsigned char yybm[] = {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 128, 128, 0,
+ 128, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 0, 0, 0, 0, 0, 0,
+ 0, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 128, 0, 0, 0, 0, 128,
+ 0, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 128, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ };
+ yych = *p;
+ if (yych <= '@') {
+ if (yych <= '.') {
+ if (yych <= ',') goto yy97;
+ } else {
+ if (yych <= '/') goto yy97;
+ if (yych >= ':') goto yy97;
+ }
+ } else {
+ if (yych <= '_') {
+ if (yych <= 'Z') goto yy95;
+ if (yych <= '^') goto yy97;
+ } else {
+ if (yych <= '`') goto yy97;
+ if (yych >= '{') goto yy97;
+ }
+ }
+yy95:
+ ++p;
+ yych = *p;
+ goto yy100;
+yy96:
+ {
+ out->assign(start, p - start);
+ break;
+ }
+yy97:
+ ++p;
+ { return false; }
+yy99:
+ ++p;
+ yych = *p;
+yy100:
+ if (yybm[0+yych] & 128) {
+ goto yy99;
+ }
+ goto yy96;
+}
+
+ }
+ ofs_ = p;
+ EatWhitespace();
+ return true;
+}
+
+bool Lexer::ReadEvalString(EvalString* eval, bool path, string* err) {
+ const char* p = ofs_;
+ const char* q;
+ const char* start;
+ for (;;) {
+ start = p;
+
+{
+ unsigned char yych;
+ static const unsigned char yybm[] = {
+ 0, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 0, 128, 128, 0, 128, 128,
+ 128, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 128, 128, 128, 128, 128, 128,
+ 16, 128, 128, 128, 0, 128, 128, 128,
+ 128, 128, 128, 128, 128, 224, 160, 128,
+ 224, 224, 224, 224, 224, 224, 224, 224,
+ 224, 224, 0, 128, 128, 128, 128, 128,
+ 128, 224, 224, 224, 224, 224, 224, 224,
+ 224, 224, 224, 224, 224, 224, 224, 224,
+ 224, 224, 224, 224, 224, 224, 224, 224,
+ 224, 224, 224, 128, 128, 128, 128, 224,
+ 128, 224, 224, 224, 224, 224, 224, 224,
+ 224, 224, 224, 224, 224, 224, 224, 224,
+ 224, 224, 224, 224, 224, 224, 224, 224,
+ 224, 224, 224, 128, 0, 128, 128, 128,
+ 128, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 128, 128, 128, 128, 128, 128,
+ 128, 128, 128, 128, 128, 128, 128, 128,
+ };
+ yych = *p;
+ if (yych <= ' ') {
+ if (yych <= '\n') {
+ if (yych <= 0x00) goto yy110;
+ if (yych >= '\n') goto yy107;
+ } else {
+ if (yych == '\r') goto yy105;
+ if (yych >= ' ') goto yy107;
+ }
+ } else {
+ if (yych <= '9') {
+ if (yych == '$') goto yy109;
+ } else {
+ if (yych <= ':') goto yy107;
+ if (yych == '|') goto yy107;
+ }
+ }
+ ++p;
+ yych = *p;
+ goto yy140;
+yy104:
+ {
+ eval->AddText(StringPiece(start, p - start));
+ continue;
+ }
+yy105:
+ ++p;
+ if ((yych = *p) == '\n') goto yy137;
+ {
+ last_token_ = start;
+ return Error(DescribeLastError(), err);
+ }
+yy107:
+ ++p;
+ {
+ if (path) {
+ p = start;
+ break;
+ } else {
+ if (*start == '\n')
+ break;
+ eval->AddText(StringPiece(start, 1));
+ continue;
+ }
+ }
+yy109:
+ yych = *++p;
+ if (yych <= '-') {
+ if (yych <= 0x1F) {
+ if (yych <= '\n') {
+ if (yych <= '\t') goto yy112;
+ goto yy124;
+ } else {
+ if (yych == '\r') goto yy114;
+ goto yy112;
+ }
+ } else {
+ if (yych <= '#') {
+ if (yych <= ' ') goto yy115;
+ goto yy112;
+ } else {
+ if (yych <= '$') goto yy117;
+ if (yych <= ',') goto yy112;
+ goto yy119;
+ }
+ }
+ } else {
+ if (yych <= 'Z') {
+ if (yych <= '9') {
+ if (yych <= '/') goto yy112;
+ goto yy119;
+ } else {
+ if (yych <= ':') goto yy121;
+ if (yych <= '@') goto yy112;
+ goto yy119;
+ }
+ } else {
+ if (yych <= '`') {
+ if (yych == '_') goto yy119;
+ goto yy112;
+ } else {
+ if (yych <= 'z') goto yy119;
+ if (yych <= '{') goto yy123;
+ goto yy112;
+ }
+ }
+ }
+yy110:
+ ++p;
+ {
+ last_token_ = start;
+ return Error("unexpected EOF", err);
+ }
+yy112:
+ ++p;
+yy113:
+ {
+ last_token_ = start;
+ return Error("bad $-escape (literal $ must be written as $$)", err);
+ }
+yy114:
+ yych = *++p;
+ if (yych == '\n') goto yy134;
+ goto yy113;
+yy115:
+ ++p;
+ {
+ eval->AddText(StringPiece(" ", 1));
+ continue;
+ }
+yy117:
+ ++p;
+ {
+ eval->AddText(StringPiece("$", 1));
+ continue;
+ }
+yy119:
+ ++p;
+ yych = *p;
+ goto yy133;
+yy120:
+ {
+ eval->AddSpecial(StringPiece(start + 1, p - start - 1));
+ continue;
+ }
+yy121:
+ ++p;
+ {
+ eval->AddText(StringPiece(":", 1));
+ continue;
+ }
+yy123:
+ yych = *(q = ++p);
+ if (yybm[0+yych] & 32) {
+ goto yy127;
+ }
+ goto yy113;
+yy124:
+ ++p;
+ yych = *p;
+ if (yybm[0+yych] & 16) {
+ goto yy124;
+ }
+ {
+ continue;
+ }
+yy127:
+ ++p;
+ yych = *p;
+ if (yybm[0+yych] & 32) {
+ goto yy127;
+ }
+ if (yych == '}') goto yy130;
+ p = q;
+ goto yy113;
+yy130:
+ ++p;
+ {
+ eval->AddSpecial(StringPiece(start + 2, p - start - 3));
+ continue;
+ }
+yy132:
+ ++p;
+ yych = *p;
+yy133:
+ if (yybm[0+yych] & 64) {
+ goto yy132;
+ }
+ goto yy120;
+yy134:
+ ++p;
+ yych = *p;
+ if (yych == ' ') goto yy134;
+ {
+ continue;
+ }
+yy137:
+ ++p;
+ {
+ if (path)
+ p = start;
+ break;
+ }
+yy139:
+ ++p;
+ yych = *p;
+yy140:
+ if (yybm[0+yych] & 128) {
+ goto yy139;
+ }
+ goto yy104;
+}
+
+ }
+ last_token_ = start;
+ ofs_ = p;
+ if (path)
+ EatWhitespace();
+ // Non-path strings end in newlines, so there's no whitespace to eat.
+ return true;
+}
diff --git a/src/ninja.cc b/src/ninja.cc index 3756123..a3d963f 100644 --- a/src/ninja.cc +++ b/src/ninja.cc @@ -1156,7 +1156,7 @@ int main(int argc, char** argv) { #if defined(_MSC_VER) // Set a handler to catch crashes not caught by the __try..__except // block (e.g. an exception in a stack-unwind-block). - set_terminate(TerminateHandler); + std::set_terminate(TerminateHandler); __try { // Running inside __try ... __except suppresses any Windows error // dialogs for errors such as bad_alloc. |