/* Generated by re2c 1.0.1 */
// 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 "graph.h"
#include "util.h"

size_t AdvanceToNextManifestChunk(StringPiece content, size_t idx) {
  assert(idx <= content.size());

  // Iterate over each LF in the manifest, starting at the given index.
  while (true) {
    const void* next_line = memchr(content.data() + idx, '\n',
                                   content.size() - idx);
    if (next_line == nullptr) {
      break;
    }
    idx = static_cast<const char*>(next_line) - content.data();
    ++idx; // step over the LF

    // The line must not be preceded by a line continuator. This logic can
    // filter out more split candidates than strictly necessary:
    //  - The preceding line could have a comment that ends with a "$": "# $\n"
    //  - The preceding line could end with an escaped-dollar: "X=$$\n"
    if ((idx >= 2 && content.substr(idx - 2, 2) == "$\n") ||
        (idx >= 3 && content.substr(idx - 3, 3) == "$\r\n")) {
      continue;
    }

    // Skip an indented line or a comment line, either of which could be part of
    // an earlier declaration. Ninja allows unindented comments (as well as
    // indented comments) inside a binding block, e.g.:
    //
    //   build foo: cc
    //   # comment-line
    //     pool = link_pool
    //
    // Ninja doesn't allow blank lines in a binding block. This code could
    // probably allow a chunk to start with a blank line, but it seems better if
    // it doesn't.
    if (idx >= content.size() ||
        content[idx] == ' ' || content[idx] == '#' ||
        content[idx] == '\r' || content[idx] == '\n') {
      continue;
    }

    return idx;
  }

  return content.size();
}

bool DecorateErrorWithLocation(const std::string& filename,
                               const char* file_start,
                               size_t file_offset,
                               const std::string& message,
                               std::string* err) {
  // Make a copy in case message and err alias.
  std::string message_tmp = message;

  // Compute line/column.
  int line = 1;
  const char* line_start = file_start;
  const char* file_pos = file_start + file_offset;

  for (const char* p = line_start; p < file_pos; ++p) {
    if (*p == '\n') {
      ++line;
      line_start = p + 1;
    }
  }
  int col = (int)(file_pos - line_start);

  char buf[1024];
  snprintf(buf, sizeof(buf), "%s:%d: ", filename.c_str(), line);
  *err = buf;
  *err += message_tmp + "\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 (line_start[len] == 0 || line_start[len] == '\n') {
        truncated = false;
        break;
      }
    }
    *err += string(line_start, len);
    if (truncated)
      *err += "...";
    *err += "\n";
    *err += string(col, ' ');
    *err += "^ near here";
  }

  return false;
}

bool Lexer::Error(const std::string& message, std::string* err) {
  return DecorateErrorWithLocation(filename_, input_.data(),
                                   GetLastTokenOffset(), message, err);
}

bool Lexer::UnexpectedNulError(const char* pos, std::string* err) {
  assert(*pos == '\0');
  const char* msg = (pos == EndOfFile()) ? "unexpected EOF"
                                         : "unexpected NUL byte";
  return Error(msg, err);
}

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 TNUL:     return "nul byte";
  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* r;
  const char* start;
  Lexer::Token token;
  for (;;) {
    start = p;
    
{
	unsigned char yych;
	unsigned int yyaccept = 0;
	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, 
		160, 128, 128, 128, 128, 128, 128, 128, 
		128, 128, 128, 128, 128, 192, 192, 128, 
		192, 192, 192, 192, 192, 192, 192, 192, 
		192, 192, 128, 128, 128, 128, 128, 128, 
		128, 192, 192, 192, 192, 192, 192, 192, 
		192, 192, 192, 192, 192, 192, 192, 192, 
		192, 192, 192, 192, 192, 192, 192, 192, 
		192, 192, 192, 128, 128, 128, 128, 192, 
		128, 192, 192, 192, 192, 192, 192, 192, 
		192, 192, 192, 192, 192, 192, 192, 192, 
		192, 192, 192, 192, 192, 192, 192, 192, 
		192, 192, 192, 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, 128, 128, 
	};
	yych = *p;
	if (yybm[0+yych] & 32) {
		goto yy9;
	}
	if (yych <= '^') {
		if (yych <= ',') {
			if (yych <= '\f') {
				if (yych <= 0x00) goto yy2;
				if (yych == '\n') goto yy6;
				goto yy4;
			} else {
				if (yych <= '\r') goto yy8;
				if (yych == '#') goto yy12;
				goto yy4;
			}
		} else {
			if (yych <= ':') {
				if (yych == '/') goto yy4;
				if (yych <= '9') goto yy13;
				goto yy16;
			} else {
				if (yych <= '=') {
					if (yych <= '<') goto yy4;
					goto yy18;
				} else {
					if (yych <= '@') goto yy4;
					if (yych <= 'Z') goto yy13;
					goto yy4;
				}
			}
		}
	} else {
		if (yych <= 'i') {
			if (yych <= 'b') {
				if (yych == '`') goto yy4;
				if (yych <= 'a') goto yy13;
				goto yy20;
			} else {
				if (yych == 'd') goto yy21;
				if (yych <= 'h') goto yy13;
				goto yy22;
			}
		} else {
			if (yych <= 'r') {
				if (yych == 'p') goto yy23;
				if (yych <= 'q') goto yy13;
				goto yy24;
			} else {
				if (yych <= 'z') {
					if (yych <= 's') goto yy25;
					goto yy13;
				} else {
					if (yych == '|') goto yy26;
					goto yy4;
				}
			}
		}
	}
yy2:
	++p;
	{ token = (start == EndOfFile()) ? TEOF : TNUL; break; }
yy4:
	++p;
yy5:
	{ token = ERROR;    break; }
yy6:
	++p;
	{ token = NEWLINE;  break; }
yy8:
	yych = *++p;
	if (yych == '\n') goto yy6;
	goto yy5;
yy9:
	yyaccept = 0;
	yych = *(q = ++p);
	if (yybm[0+yych] & 32) {
		goto yy9;
	}
	if (yych <= '\f') {
		if (yych == '\n') goto yy6;
	} else {
		if (yych <= '\r') goto yy28;
		if (yych == '#') goto yy30;
	}
yy11:
	{ token = INDENT;   break; }
yy12:
	yyaccept = 1;
	yych = *(q = ++p);
	if (yych <= 0x00) goto yy5;
	goto yy31;
yy13:
	yych = *++p;
yy14:
	if (yybm[0+yych] & 64) {
		goto yy13;
	}
	{ token = IDENT;    break; }
yy16:
	++p;
	{ token = COLON;    break; }
yy18:
	++p;
	{ token = EQUALS;   break; }
yy20:
	yych = *++p;
	if (yych == 'u') goto yy35;
	goto yy14;
yy21:
	yych = *++p;
	if (yych == 'e') goto yy36;
	goto yy14;
yy22:
	yych = *++p;
	if (yych == 'n') goto yy37;
	goto yy14;
yy23:
	yych = *++p;
	if (yych == 'o') goto yy38;
	goto yy14;
yy24:
	yych = *++p;
	if (yych == 'u') goto yy39;
	goto yy14;
yy25:
	yych = *++p;
	if (yych == 'u') goto yy40;
	goto yy14;
yy26:
	yych = *++p;
	if (yych == '|') goto yy41;
	{ token = PIPE;     break; }
yy28:
	yych = *++p;
	if (yych == '\n') goto yy6;
yy29:
	p = q;
	if (yyaccept == 0) {
		goto yy11;
	} else {
		goto yy5;
	}
yy30:
	yych = *++p;
yy31:
	if (yybm[0+yych] & 128) {
		goto yy30;
	}
	if (yych <= 0x00) goto yy29;
	if (yych >= '\v') {
		r = p;
		goto yy34;
	}
	r = p;
yy32:
	++p;
	p = r;
	{ continue; }
yy34:
	yych = *++p;
	if (yych == '\n') goto yy32;
	goto yy29;
yy35:
	yych = *++p;
	if (yych == 'i') goto yy43;
	goto yy14;
yy36:
	yych = *++p;
	if (yych == 'f') goto yy44;
	goto yy14;
yy37:
	yych = *++p;
	if (yych == 'c') goto yy45;
	goto yy14;
yy38:
	yych = *++p;
	if (yych == 'o') goto yy46;
	goto yy14;
yy39:
	yych = *++p;
	if (yych == 'l') goto yy47;
	goto yy14;
yy40:
	yych = *++p;
	if (yych == 'b') goto yy48;
	goto yy14;
yy41:
	++p;
	{ token = PIPE2;    break; }
yy43:
	yych = *++p;
	if (yych == 'l') goto yy49;
	goto yy14;
yy44:
	yych = *++p;
	if (yych == 'a') goto yy50;
	goto yy14;
yy45:
	yych = *++p;
	if (yych == 'l') goto yy51;
	goto yy14;
yy46:
	yych = *++p;
	if (yych == 'l') goto yy52;
	goto yy14;
yy47:
	yych = *++p;
	if (yych == 'e') goto yy54;
	goto yy14;
yy48:
	yych = *++p;
	if (yych == 'n') goto yy56;
	goto yy14;
yy49:
	yych = *++p;
	if (yych == 'd') goto yy57;
	goto yy14;
yy50:
	yych = *++p;
	if (yych == 'u') goto yy59;
	goto yy14;
yy51:
	yych = *++p;
	if (yych == 'u') goto yy60;
	goto yy14;
yy52:
	yych = *++p;
	if (yybm[0+yych] & 64) {
		goto yy13;
	}
	{ token = POOL;     break; }
yy54:
	yych = *++p;
	if (yybm[0+yych] & 64) {
		goto yy13;
	}
	{ token = RULE;     break; }
yy56:
	yych = *++p;
	if (yych == 'i') goto yy61;
	goto yy14;
yy57:
	yych = *++p;
	if (yybm[0+yych] & 64) {
		goto yy13;
	}
	{ token = BUILD;    break; }
yy59:
	yych = *++p;
	if (yych == 'l') goto yy62;
	goto yy14;
yy60:
	yych = *++p;
	if (yych == 'd') goto yy63;
	goto yy14;
yy61:
	yych = *++p;
	if (yych == 'n') goto yy64;
	goto yy14;
yy62:
	yych = *++p;
	if (yych == 't') goto yy65;
	goto yy14;
yy63:
	yych = *++p;
	if (yych == 'e') goto yy67;
	goto yy14;
yy64:
	yych = *++p;
	if (yych == 'j') goto yy69;
	goto yy14;
yy65:
	yych = *++p;
	if (yybm[0+yych] & 64) {
		goto yy13;
	}
	{ token = DEFAULT;  break; }
yy67:
	yych = *++p;
	if (yybm[0+yych] & 64) {
		goto yy13;
	}
	{ token = INCLUDE;  break; }
yy69:
	yych = *++p;
	if (yych != 'a') goto yy14;
	yych = *++p;
	if (yybm[0+yych] & 64) {
		goto yy13;
	}
	{ token = SUBNINJA; break; }
}

  }

  last_token_ = start;
  ofs_ = p;
  if (token != NEWLINE && token != TEOF)
    EatWhitespace();
  return token;
}

bool Lexer::PeekIndent() {
  const char* p = ofs_;
  const char* q;
  const char* start;
  for (;;) {
    start = p;
    
{
	unsigned char yych;
	unsigned int yyaccept = 0;
	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, 
		192, 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, 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 (yybm[0+yych] & 64) {
		goto yy79;
	}
	if (yych <= '\f') {
		if (yych == '\n') goto yy76;
	} else {
		if (yych <= '\r') goto yy78;
		if (yych == '#') goto yy82;
	}
	++p;
yy75:
	{ last_token_ = ofs_ = start; return false; }
yy76:
	++p;
	{ last_token_ = ofs_ = start; return false; }
yy78:
	yych = *++p;
	if (yych == '\n') goto yy76;
	goto yy75;
yy79:
	yyaccept = 0;
	yych = *(q = ++p);
	if (yybm[0+yych] & 64) {
		goto yy79;
	}
	if (yych <= '\f') {
		if (yych == '\n') goto yy76;
	} else {
		if (yych <= '\r') goto yy83;
		if (yych == '#') goto yy85;
	}
yy81:
	{ last_token_ = start; ofs_ = p; return true; }
yy82:
	yyaccept = 1;
	yych = *(q = ++p);
	if (yych <= 0x00) goto yy75;
	goto yy86;
yy83:
	yych = *++p;
	if (yych == '\n') goto yy76;
yy84:
	p = q;
	if (yyaccept == 0) {
		goto yy81;
	} else {
		goto yy75;
	}
yy85:
	yych = *++p;
yy86:
	if (yybm[0+yych] & 128) {
		goto yy85;
	}
	if (yych <= 0x00) goto yy84;
	if (yych >= '\v') goto yy89;
yy87:
	++p;
	{ continue; }
yy89:
	yych = *++p;
	if (yych == '\n') goto yy87;
	goto yy84;
}

  }
}

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 (yybm[0+yych] & 128) {
		goto yy96;
	}
	if (yych <= 0x00) goto yy92;
	if (yych == '$') goto yy99;
	goto yy94;
yy92:
	++p;
	{ break; }
yy94:
	++p;
yy95:
	{ break; }
yy96:
	yych = *++p;
	if (yybm[0+yych] & 128) {
		goto yy96;
	}
	{ continue; }
yy99:
	yych = *(q = ++p);
	if (yych == '\n') goto yy100;
	if (yych == '\r') goto yy102;
	goto yy95;
yy100:
	++p;
	{ continue; }
yy102:
	yych = *++p;
	if (yych == '\n') goto yy100;
	p = q;
	goto yy95;
}

  }
}

bool Lexer::ReadIdent(StringPiece* out) {
  const char* p = ofs_;
  const char* start;
  for (;;) {
    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 (yybm[0+yych] & 128) {
		goto yy108;
	}
	++p;
	{
      last_token_ = start;
      return false;
    }
yy108:
	yych = *++p;
	if (yybm[0+yych] & 128) {
		goto yy108;
	}
	{
      *out = StringPiece(start, p - start);
      break;
    }
}

  }
  last_token_ = start;
  ofs_ = p;
  EatWhitespace();
  return true;
}

bool Lexer::ReadBindingValue(StringPiece* out, string* err) {
  const char* p = ofs_;
  const char* q;
  const char* start;
  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,   0,  64,  64, 
		 64,  64,  64,  64,  64,  64,  64,  64, 
		 64,  64,  64,  64,  64,  64,  64,  64, 
		 64,  64,  64,  64,   0,  64,  64,  64, 
		 64,  64,  64,  64,  64, 192, 192,  64, 
		192, 192, 192, 192, 192, 192, 192, 192, 
		192, 192,  64,  64,  64,  64,  64,  64, 
		 64, 192, 192, 192, 192, 192, 192, 192, 
		192, 192, 192, 192, 192, 192, 192, 192, 
		192, 192, 192, 192, 192, 192, 192, 192, 
		192, 192, 192,  64,  64,  64,  64, 192, 
		 64, 192, 192, 192, 192, 192, 192, 192, 
		192, 192, 192, 192, 192, 192, 192, 192, 
		192, 192, 192, 192, 192, 192, 192, 192, 
		192, 192, 192,  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 (yybm[0+yych] & 64) {
		goto yy115;
	}
	if (yych <= 0x00) goto yy113;
	if (yych <= '\n') goto yy118;
	if (yych <= '\r') goto yy120;
	goto yy122;
yy113:
	++p;
	{
      last_token_ = start;
      return UnexpectedNulError(start, err);
    }
yy115:
	yyaccept = 0;
	yych = *(q = ++p);
	if (yybm[0+yych] & 64) {
		goto yy115;
	}
	if (yych >= 0x0E) goto yy123;
yy117:
	{
      continue;
    }
yy118:
	++p;
	{
      break;
    }
yy120:
	yych = *++p;
	if (yych == '\n') goto yy118;
	{
      last_token_ = start;
      return Error(DescribeLastError(), err);
    }
yy122:
	yych = *++p;
	if (yych <= '-') {
		if (yych <= 0x1F) {
			if (yych <= '\n') {
				if (yych <= '\t') goto yy125;
				goto yy115;
			} else {
				if (yych == '\r') goto yy127;
				goto yy125;
			}
		} else {
			if (yych <= '#') {
				if (yych <= ' ') goto yy115;
				goto yy125;
			} else {
				if (yych <= '$') goto yy115;
				if (yych <= ',') goto yy125;
				goto yy115;
			}
		}
	} else {
		if (yych <= '^') {
			if (yych <= ':') {
				if (yych <= '/') goto yy125;
				goto yy115;
			} else {
				if (yych <= '@') goto yy125;
				if (yych <= 'Z') goto yy115;
				goto yy125;
			}
		} else {
			if (yych <= '`') {
				if (yych <= '_') goto yy115;
				goto yy125;
			} else {
				if (yych <= 'z') goto yy115;
				if (yych <= '{') goto yy128;
				goto yy125;
			}
		}
	}
yy123:
	yych = *++p;
	if (yych <= '-') {
		if (yych <= 0x1F) {
			if (yych <= '\n') {
				if (yych >= '\n') goto yy115;
			} else {
				if (yych == '\r') goto yy129;
			}
		} else {
			if (yych <= '#') {
				if (yych <= ' ') goto yy115;
			} else {
				if (yych <= '$') goto yy115;
				if (yych >= '-') goto yy115;
			}
		}
	} else {
		if (yych <= '^') {
			if (yych <= ':') {
				if (yych >= '0') goto yy115;
			} else {
				if (yych <= '@') goto yy124;
				if (yych <= 'Z') goto yy115;
			}
		} else {
			if (yych <= '`') {
				if (yych <= '_') goto yy115;
			} else {
				if (yych <= 'z') goto yy115;
				if (yych <= '{') goto yy130;
			}
		}
	}
yy124:
	p = q;
	if (yyaccept == 0) {
		goto yy117;
	} else {
		goto yy126;
	}
yy125:
	++p;
yy126:
	{
      last_token_ = start;
      return Error("bad $-escape (literal $ must be written as $$)", err);
    }
yy127:
	yych = *++p;
	if (yych == '\n') goto yy115;
	goto yy126;
yy128:
	yyaccept = 1;
	yych = *(q = ++p);
	if (yybm[0+yych] & 128) {
		goto yy131;
	}
	goto yy126;
yy129:
	yych = *++p;
	if (yych == '\n') goto yy115;
	goto yy124;
yy130:
	yych = *++p;
	if (yybm[0+yych] & 128) {
		goto yy131;
	}
	goto yy124;
yy131:
	yych = *++p;
	if (yybm[0+yych] & 128) {
		goto yy131;
	}
	if (yych == '}') goto yy115;
	goto yy124;
}

  }
  *out = StringPiece(ofs_, p - ofs_);
  last_token_ = start;
  ofs_ = p;
  // Non-path strings end in newlines, so there's no whitespace to eat.
  return true;
}

StringPiece Lexer::PeekCanonicalPath() {
  auto finish = [this](const char* start, const char* end) {
    ofs_ = end;
    EatWhitespace();
    return StringPiece(start, end - start);
  };

  const char* p = ofs_;
  const char* q;
  const char* r;
  last_token_ = ofs_;

  do {
    
{
	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, 
		  0, 128, 128, 128,   0, 128, 128, 128, 
		128, 128, 128, 128, 128, 128, 128,   0, 
		128, 128, 128, 128, 128, 128, 128, 128, 
		128, 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,   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 <= '\f') {
			if (yych <= 0x00) goto yy135;
			if (yych != '\n') goto yy137;
		} else {
			if (yych <= '\r') goto yy135;
			if (yych != ' ') goto yy137;
		}
	} else {
		if (yych <= '/') {
			if (yych <= '$') goto yy135;
			if (yych <= '-') goto yy137;
			if (yych <= '.') goto yy138;
			goto yy139;
		} else {
			if (yych <= ':') {
				if (yych <= '9') goto yy137;
			} else {
				if (yych != '|') goto yy137;
			}
		}
	}
yy135:
	++p;
yy136:
	{ break;                      }
yy137:
	yych = *(q = ++p);
	if (yych <= 0x00) goto yy136;
	if (yych == '$') goto yy136;
	goto yy141;
yy138:
	yych = *(q = ++p);
	if (yych <= '#') {
		if (yych <= '\f') {
			if (yych <= 0x00) goto yy136;
			if (yych == '\n') goto yy136;
			goto yy140;
		} else {
			if (yych <= '\r') goto yy136;
			if (yych == ' ') goto yy136;
			goto yy140;
		}
	} else {
		if (yych <= '/') {
			if (yych <= '$') goto yy136;
			if (yych <= '-') goto yy140;
			if (yych <= '.') goto yy147;
			goto yy148;
		} else {
			if (yych <= ':') {
				if (yych <= '9') goto yy140;
				goto yy136;
			} else {
				if (yych == '|') goto yy136;
				goto yy140;
			}
		}
	}
yy139:
	yych = *(q = ++p);
	if (yych <= '#') {
		if (yych <= '\f') {
			if (yych <= 0x00) goto yy136;
			if (yych == '\n') goto yy136;
		} else {
			if (yych <= '\r') goto yy136;
			if (yych == ' ') goto yy136;
		}
	} else {
		if (yych <= '/') {
			if (yych <= '$') goto yy136;
			if (yych <= '-') goto yy140;
			if (yych <= '.') goto yy149;
			goto yy136;
		} else {
			if (yych <= ':') {
				if (yych >= ':') goto yy136;
			} else {
				if (yych == '|') goto yy136;
			}
		}
	}
yy140:
	yych = *++p;
yy141:
	if (yybm[0+yych] & 128) {
		goto yy140;
	}
	if (yych <= '\r') {
		if (yych <= 0x00) goto yy142;
		if (yych <= '\n') {
			r = p;
			goto yy143;
		}
		r = p;
		goto yy145;
	} else {
		if (yych <= ' ') {
			r = p;
			goto yy143;
		}
		if (yych <= '$') goto yy142;
		if (yych <= '/') goto yy146;
		r = p;
		goto yy143;
	}
yy142:
	p = q;
	goto yy136;
yy143:
	++p;
	p = r;
	{ return finish(ofs_, p);     }
yy145:
	yych = *++p;
	if (yych == '\n') goto yy143;
	goto yy142;
yy146:
	yych = *++p;
	if (yych <= '#') {
		if (yych <= '\f') {
			if (yych <= 0x00) goto yy142;
			if (yych == '\n') goto yy142;
			goto yy140;
		} else {
			if (yych <= '\r') goto yy142;
			if (yych == ' ') goto yy142;
			goto yy140;
		}
	} else {
		if (yych <= '/') {
			if (yych <= '$') goto yy142;
			if (yych <= '-') goto yy140;
			if (yych <= '.') goto yy149;
			goto yy142;
		} else {
			if (yych <= ':') {
				if (yych <= '9') goto yy140;
				goto yy142;
			} else {
				if (yych == '|') goto yy142;
				goto yy140;
			}
		}
	}
yy147:
	yych = *++p;
	if (yybm[0+yych] & 128) {
		goto yy140;
	}
	if (yych <= '$') goto yy142;
	if (yych <= '/') goto yy150;
	goto yy142;
yy148:
	yych = *++p;
	if (yych <= '#') {
		if (yych <= '\f') {
			if (yych <= 0x00) goto yy142;
			if (yych == '\n') goto yy142;
			goto yy151;
		} else {
			if (yych <= '\r') goto yy142;
			if (yych == ' ') goto yy142;
			goto yy151;
		}
	} else {
		if (yych <= '/') {
			if (yych <= '$') goto yy142;
			if (yych <= '-') goto yy151;
			if (yych <= '.') goto yy153;
			goto yy142;
		} else {
			if (yych <= ':') {
				if (yych <= '9') goto yy151;
				goto yy142;
			} else {
				if (yych == '|') goto yy142;
				goto yy151;
			}
		}
	}
yy149:
	yych = *++p;
	if (yych <= '#') {
		if (yych <= '\f') {
			if (yych <= 0x00) goto yy142;
			if (yych == '\n') goto yy142;
			goto yy140;
		} else {
			if (yych <= '\r') goto yy142;
			if (yych == ' ') goto yy142;
			goto yy140;
		}
	} else {
		if (yych <= '/') {
			if (yych <= '$') goto yy142;
			if (yych <= '-') goto yy140;
			if (yych <= '.') goto yy154;
			goto yy142;
		} else {
			if (yych <= ':') {
				if (yych <= '9') goto yy140;
				goto yy142;
			} else {
				if (yych == '|') goto yy142;
				goto yy140;
			}
		}
	}
yy150:
	yych = *++p;
	if (yych <= '#') {
		if (yych <= '\f') {
			if (yych <= 0x00) goto yy142;
			if (yych == '\n') goto yy142;
			goto yy140;
		} else {
			if (yych <= '\r') goto yy142;
			if (yych == ' ') goto yy142;
			goto yy140;
		}
	} else {
		if (yych <= '/') {
			if (yych <= '$') goto yy142;
			if (yych <= '-') goto yy140;
			if (yych <= '.') goto yy155;
			goto yy142;
		} else {
			if (yych <= ':') {
				if (yych <= '9') goto yy140;
				goto yy142;
			} else {
				if (yych == '|') goto yy142;
				goto yy140;
			}
		}
	}
yy151:
	yych = *++p;
	if (yych <= '#') {
		if (yych <= '\f') {
			if (yych <= 0x00) goto yy142;
			if (yych == '\n') {
				r = p;
				goto yy156;
			}
			goto yy151;
		} else {
			if (yych <= '\r') {
				r = p;
				goto yy158;
			}
			if (yych == ' ') {
				r = p;
				goto yy156;
			}
			goto yy151;
		}
	} else {
		if (yych <= '9') {
			if (yych <= '$') goto yy142;
			if (yych == '/') goto yy159;
			goto yy151;
		} else {
			if (yych <= ':') {
				r = p;
				goto yy156;
			}
			if (yych == '|') {
				r = p;
				goto yy156;
			}
			goto yy151;
		}
	}
yy153:
	yych = *++p;
	if (yych <= '#') {
		if (yych <= '\f') {
			if (yych <= 0x00) goto yy142;
			if (yych == '\n') goto yy142;
			goto yy151;
		} else {
			if (yych <= '\r') goto yy142;
			if (yych == ' ') goto yy142;
			goto yy151;
		}
	} else {
		if (yych <= '/') {
			if (yych <= '$') goto yy142;
			if (yych <= '-') goto yy151;
			if (yych <= '.') goto yy160;
			goto yy142;
		} else {
			if (yych <= ':') {
				if (yych <= '9') goto yy151;
				goto yy142;
			} else {
				if (yych == '|') goto yy142;
				goto yy151;
			}
		}
	}
yy154:
	yych = *++p;
	if (yybm[0+yych] & 128) {
		goto yy140;
	}
	goto yy142;
yy155:
	yych = *++p;
	if (yych <= '#') {
		if (yych <= '\f') {
			if (yych <= 0x00) goto yy142;
			if (yych == '\n') goto yy142;
			goto yy140;
		} else {
			if (yych <= '\r') goto yy142;
			if (yych == ' ') goto yy142;
			goto yy140;
		}
	} else {
		if (yych <= '/') {
			if (yych <= '$') goto yy142;
			if (yych <= '-') goto yy140;
			if (yych <= '.') goto yy147;
			goto yy142;
		} else {
			if (yych <= ':') {
				if (yych <= '9') goto yy140;
				goto yy142;
			} else {
				if (yych == '|') goto yy142;
				goto yy140;
			}
		}
	}
yy156:
	++p;
	p = r;
	{ return finish(ofs_ + 2, p); }
yy158:
	yych = *++p;
	if (yych == '\n') goto yy156;
	goto yy142;
yy159:
	yych = *++p;
	if (yych <= '#') {
		if (yych <= '\f') {
			if (yych <= 0x00) goto yy142;
			if (yych == '\n') goto yy142;
			goto yy151;
		} else {
			if (yych <= '\r') goto yy142;
			if (yych == ' ') goto yy142;
			goto yy151;
		}
	} else {
		if (yych <= '/') {
			if (yych <= '$') goto yy142;
			if (yych <= '-') goto yy151;
			if (yych <= '.') goto yy161;
			goto yy142;
		} else {
			if (yych <= ':') {
				if (yych <= '9') goto yy151;
				goto yy142;
			} else {
				if (yych == '|') goto yy142;
				goto yy151;
			}
		}
	}
yy160:
	yych = *++p;
	if (yych <= '#') {
		if (yych <= '\f') {
			if (yych <= 0x00) goto yy142;
			if (yych == '\n') goto yy142;
			goto yy151;
		} else {
			if (yych <= '\r') goto yy142;
			if (yych == ' ') goto yy142;
			goto yy151;
		}
	} else {
		if (yych <= '9') {
			if (yych <= '$') goto yy142;
			if (yych == '/') goto yy148;
			goto yy151;
		} else {
			if (yych <= ':') goto yy142;
			if (yych == '|') goto yy142;
			goto yy151;
		}
	}
yy161:
	yych = *++p;
	if (yych <= '#') {
		if (yych <= '\f') {
			if (yych <= 0x00) goto yy142;
			if (yych == '\n') goto yy142;
			goto yy151;
		} else {
			if (yych <= '\r') goto yy142;
			if (yych == ' ') goto yy142;
			goto yy151;
		}
	} else {
		if (yych <= '/') {
			if (yych <= '$') goto yy142;
			if (yych <= '-') goto yy151;
			if (yych >= '/') goto yy142;
		} else {
			if (yych <= ':') {
				if (yych <= '9') goto yy151;
				goto yy142;
			} else {
				if (yych == '|') goto yy142;
				goto yy151;
			}
		}
	}
	yych = *++p;
	if (yych <= '#') {
		if (yych <= '\f') {
			if (yych <= 0x00) goto yy142;
			if (yych == '\n') goto yy142;
			goto yy151;
		} else {
			if (yych <= '\r') goto yy142;
			if (yych == ' ') goto yy142;
			goto yy151;
		}
	} else {
		if (yych <= '9') {
			if (yych <= '$') goto yy142;
			if (yych == '/') goto yy142;
			goto yy151;
		} else {
			if (yych <= ':') goto yy142;
			if (yych == '|') goto yy142;
			goto yy151;
		}
	}
}

  } while (false);

  return {};
}

bool Lexer::ReadPath(LexedPath* out, std::string* err) {
  const char* p = ofs_;
  const char* q;
  const char* start;
  for (;;) {
    start = p;
    
{
	unsigned char yych;
	unsigned int yyaccept = 0;
	static const unsigned char yybm[] = {
		  0,  32,  32,  32,  32,  32,  32,  32, 
		 32,  32,   0,  32,  32,   0,  32,  32, 
		 32,  32,  32,  32,  32,  32,  32,  32, 
		 32,  32,  32,  32,  32,  32,  32,  32, 
		 64,  32,  32,  32,   0,  32,  32,  32, 
		 32,  32,  32,  32,  32, 160, 160,  32, 
		160, 160, 160, 160, 160, 160, 160, 160, 
		160, 160,   0,  32,  32,  32,  32,  32, 
		 32, 160, 160, 160, 160, 160, 160, 160, 
		160, 160, 160, 160, 160, 160, 160, 160, 
		160, 160, 160, 160, 160, 160, 160, 160, 
		160, 160, 160,  32,  32,  32,  32, 160, 
		 32, 160, 160, 160, 160, 160, 160, 160, 
		160, 160, 160, 160, 160, 160, 160, 160, 
		160, 160, 160, 160, 160, 160, 160, 160, 
		160, 160, 160,  32,   0,  32,  32,  32, 
		 32,  32,  32,  32,  32,  32,  32,  32, 
		 32,  32,  32,  32,  32,  32,  32,  32, 
		 32,  32,  32,  32,  32,  32,  32,  32, 
		 32,  32,  32,  32,  32,  32,  32,  32, 
		 32,  32,  32,  32,  32,  32,  32,  32, 
		 32,  32,  32,  32,  32,  32,  32,  32, 
		 32,  32,  32,  32,  32,  32,  32,  32, 
		 32,  32,  32,  32,  32,  32,  32,  32, 
		 32,  32,  32,  32,  32,  32,  32,  32, 
		 32,  32,  32,  32,  32,  32,  32,  32, 
		 32,  32,  32,  32,  32,  32,  32,  32, 
		 32,  32,  32,  32,  32,  32,  32,  32, 
		 32,  32,  32,  32,  32,  32,  32,  32, 
		 32,  32,  32,  32,  32,  32,  32,  32, 
		 32,  32,  32,  32,  32,  32,  32,  32, 
		 32,  32,  32,  32,  32,  32,  32,  32, 
	};
	yych = *p;
	if (yybm[0+yych] & 32) {
		goto yy167;
	}
	if (yych <= '\r') {
		if (yych <= 0x00) goto yy165;
		if (yych <= '\n') goto yy170;
		goto yy172;
	} else {
		if (yych <= ' ') goto yy170;
		if (yych <= '$') goto yy174;
		goto yy170;
	}
yy165:
	++p;
	{
      last_token_ = start;
      return UnexpectedNulError(start, err);
    }
yy167:
	yyaccept = 0;
	yych = *(q = ++p);
	if (yybm[0+yych] & 32) {
		goto yy167;
	}
	if (yych <= ' ') goto yy169;
	if (yych <= '$') goto yy175;
yy169:
	{
      continue;
    }
yy170:
	++p;
	{
      p = start;
      break;
    }
yy172:
	yych = *++p;
	if (yych == '\n') goto yy170;
	{
      last_token_ = start;
      return Error(DescribeLastError(), err);
    }
yy174:
	yych = *++p;
	if (yych <= '-') {
		if (yych <= 0x1F) {
			if (yych <= '\n') {
				if (yych <= '\t') goto yy177;
				goto yy179;
			} else {
				if (yych == '\r') goto yy181;
				goto yy177;
			}
		} else {
			if (yych <= '#') {
				if (yych <= ' ') goto yy167;
				goto yy177;
			} else {
				if (yych <= '$') goto yy167;
				if (yych <= ',') goto yy177;
				goto yy167;
			}
		}
	} else {
		if (yych <= '^') {
			if (yych <= ':') {
				if (yych <= '/') goto yy177;
				goto yy167;
			} else {
				if (yych <= '@') goto yy177;
				if (yych <= 'Z') goto yy167;
				goto yy177;
			}
		} else {
			if (yych <= '`') {
				if (yych <= '_') goto yy167;
				goto yy177;
			} else {
				if (yych <= 'z') goto yy167;
				if (yych <= '{') goto yy182;
				goto yy177;
			}
		}
	}
yy175:
	yych = *++p;
	if (yych <= '-') {
		if (yych <= 0x1F) {
			if (yych <= '\n') {
				if (yych >= '\n') goto yy179;
			} else {
				if (yych == '\r') goto yy183;
			}
		} else {
			if (yych <= '#') {
				if (yych <= ' ') goto yy167;
			} else {
				if (yych <= '$') goto yy167;
				if (yych >= '-') goto yy167;
			}
		}
	} else {
		if (yych <= '^') {
			if (yych <= ':') {
				if (yych >= '0') goto yy167;
			} else {
				if (yych <= '@') goto yy176;
				if (yych <= 'Z') goto yy167;
			}
		} else {
			if (yych <= '`') {
				if (yych <= '_') goto yy167;
			} else {
				if (yych <= 'z') goto yy167;
				if (yych <= '{') goto yy184;
			}
		}
	}
yy176:
	p = q;
	if (yyaccept == 0) {
		goto yy169;
	} else {
		goto yy178;
	}
yy177:
	++p;
yy178:
	{
      last_token_ = start;
      return Error("bad $-escape (literal $ must be written as $$)", err);
    }
yy179:
	yyaccept = 0;
	yych = *(q = ++p);
	if (yybm[0+yych] & 32) {
		goto yy167;
	}
	if (yych <= '\r') goto yy169;
	if (yych <= ' ') goto yy179;
	if (yych <= '$') goto yy175;
	goto yy169;
yy181:
	yych = *++p;
	if (yych == '\n') goto yy179;
	goto yy178;
yy182:
	yyaccept = 1;
	yych = *(q = ++p);
	if (yybm[0+yych] & 128) {
		goto yy185;
	}
	goto yy178;
yy183:
	yych = *++p;
	if (yych == '\n') goto yy179;
	goto yy176;
yy184:
	yych = *++p;
	if (yybm[0+yych] & 128) {
		goto yy185;
	}
	goto yy176;
yy185:
	yych = *++p;
	if (yybm[0+yych] & 128) {
		goto yy185;
	}
	if (yych == '}') goto yy167;
	goto yy176;
}

  }
  *out = {};
  out->str_ = StringPiece(ofs_, p - ofs_);
  last_token_ = start;
  ofs_ = p;
  EatWhitespace();
  return true;
}

/// Append the let binding's evaluated value to the output string. The input
/// StringPiece must include a valid binding terminator.
template <typename EvalVar>
static inline void EvaluateBinding(std::string* out_append, StringPiece value,
                                   EvalVar&& eval_var) {
  auto expand = [&eval_var](const char* start, const char* end) {
    StringPiece var(start, end - start);
    eval_var(var);
  };

  const char* p = value.data();
  const char* q;

  for (;;) {
    const char* start = p;
    
{
	unsigned char yych;
	static const unsigned char yybm[] = {
		  0,  16,  16,  16,  16,  16,  16,  16, 
		 16,  16,   0,  16,  16,   0,  16,  16, 
		 16,  16,  16,  16,  16,  16,  16,  16, 
		 16,  16,  16,  16,  16,  16,  16,  16, 
		 48,  16,  16,  16,   0,  16,  16,  16, 
		 16,  16,  16,  16,  16, 208, 144,  16, 
		208, 208, 208, 208, 208, 208, 208, 208, 
		208, 208,  16,  16,  16,  16,  16,  16, 
		 16, 208, 208, 208, 208, 208, 208, 208, 
		208, 208, 208, 208, 208, 208, 208, 208, 
		208, 208, 208, 208, 208, 208, 208, 208, 
		208, 208, 208,  16,  16,  16,  16, 208, 
		 16, 208, 208, 208, 208, 208, 208, 208, 
		208, 208, 208, 208, 208, 208, 208, 208, 
		208, 208, 208, 208, 208, 208, 208, 208, 
		208, 208, 208,  16,  16,  16,  16,  16, 
		 16,  16,  16,  16,  16,  16,  16,  16, 
		 16,  16,  16,  16,  16,  16,  16,  16, 
		 16,  16,  16,  16,  16,  16,  16,  16, 
		 16,  16,  16,  16,  16,  16,  16,  16, 
		 16,  16,  16,  16,  16,  16,  16,  16, 
		 16,  16,  16,  16,  16,  16,  16,  16, 
		 16,  16,  16,  16,  16,  16,  16,  16, 
		 16,  16,  16,  16,  16,  16,  16,  16, 
		 16,  16,  16,  16,  16,  16,  16,  16, 
		 16,  16,  16,  16,  16,  16,  16,  16, 
		 16,  16,  16,  16,  16,  16,  16,  16, 
		 16,  16,  16,  16,  16,  16,  16,  16, 
		 16,  16,  16,  16,  16,  16,  16,  16, 
		 16,  16,  16,  16,  16,  16,  16,  16, 
		 16,  16,  16,  16,  16,  16,  16,  16, 
		 16,  16,  16,  16,  16,  16,  16,  16, 
	};
	yych = *p;
	if (yybm[0+yych] & 16) {
		goto yy191;
	}
	if (yych <= 0x00) goto yy189;
	if (yych <= '\n') goto yy194;
	if (yych <= '\r') goto yy196;
	goto yy197;
yy189:
	++p;
yy190:
	{ assert(false && "bad input in EvaluateBinding"); abort(); }
yy191:
	yych = *++p;
	if (yybm[0+yych] & 16) {
		goto yy191;
	}
	{ out_append->append(start, p - start);   continue; }
yy194:
	++p;
	{                                         break;    }
yy196:
	yych = *++p;
	if (yych == '\n') goto yy194;
	goto yy190;
yy197:
	yych = *(q = ++p);
	if (yybm[0+yych] & 64) {
		goto yy205;
	}
	if (yych <= ' ') {
		if (yych <= '\f') {
			if (yych != '\n') goto yy190;
		} else {
			if (yych <= '\r') goto yy201;
			if (yych <= 0x1F) goto yy190;
			goto yy203;
		}
	} else {
		if (yych <= '/') {
			if (yych == '$') goto yy203;
			goto yy190;
		} else {
			if (yych <= ':') goto yy203;
			if (yych <= '`') goto yy190;
			if (yych <= '{') goto yy208;
			goto yy190;
		}
	}
yy198:
	yych = *++p;
	if (yybm[0+yych] & 32) {
		goto yy198;
	}
	{                                         continue; }
yy201:
	yych = *++p;
	if (yych == '\n') goto yy198;
yy202:
	p = q;
	goto yy190;
yy203:
	++p;
	{ out_append->push_back(start[1]);        continue; }
yy205:
	yych = *++p;
	if (yybm[0+yych] & 64) {
		goto yy205;
	}
	{ expand(start + 1, p);                   continue; }
yy208:
	yych = *++p;
	if (yych == '}') goto yy202;
	goto yy210;
yy209:
	yych = *++p;
yy210:
	if (yybm[0+yych] & 128) {
		goto yy209;
	}
	if (yych != '}') goto yy202;
	++p;
	{ expand(start + 2, p - 1);               continue; }
}

  }
  assert((p == value.data() + value.size()) &&
         "bad end pos in EvaluateBinding");
}

void EvaluateBindingInScope(std::string* out_append, StringPiece value,
                            ScopePosition pos) {
  EvaluateBinding(out_append, value,
      [out_append, &pos](const HashedStrView& var) {
    Scope::EvaluateVariableAtPos(out_append, var, pos);
  });
}

bool EvaluateBindingOnRule(std::string* out_append, StringPiece value,
                           EdgeEval* edge_eval, std::string* err) {
  bool result = true;
  EvaluateBinding(out_append, value,
      [out_append, edge_eval, &result, err](const HashedStrView& var) {
    result = result && edge_eval->EvaluateVariable(out_append, var, err);
  });
  return result;
}

std::string EvaluateBindingForTesting(StringPiece value) {
  std::string result;
  EvaluateBinding(&result, value, [&result](StringPiece var) {
    result += "[$" + var.AsString() + "]";
  });
  return result;
}

/// Append an evaluated path to the output string.
///
/// This function does not canonicalize the output. Ninja canonicalizes paths for
/// build nodes, but not all paths (e.g. It doesn't canonicalize paths to
/// included ninja files.)
template <typename EvalVar>
static inline void EvaluatePath(std::string* out_append, const LexedPath& path,
                                EvalVar&& eval_var) {
  auto expand = [&eval_var](const char* start, const char* end) {
    StringPiece var(start, end - start);
    eval_var(var);
  };

  const char* p = path.str_.data();
  const char* q;

  for (;;) {
    const char* start = p;
    
{
	unsigned char yych;
	static const unsigned char yybm[] = {
		  0,  16,  16,  16,  16,  16,  16,  16, 
		 16,  16,   0,  16,  16,   0,  16,  16, 
		 16,  16,  16,  16,  16,  16,  16,  16, 
		 16,  16,  16,  16,  16,  16,  16,  16, 
		 32,  16,  16,  16,   0,  16,  16,  16, 
		 16,  16,  16,  16,  16, 208, 144,  16, 
		208, 208, 208, 208, 208, 208, 208, 208, 
		208, 208,   0,  16,  16,  16,  16,  16, 
		 16, 208, 208, 208, 208, 208, 208, 208, 
		208, 208, 208, 208, 208, 208, 208, 208, 
		208, 208, 208, 208, 208, 208, 208, 208, 
		208, 208, 208,  16,  16,  16,  16, 208, 
		 16, 208, 208, 208, 208, 208, 208, 208, 
		208, 208, 208, 208, 208, 208, 208, 208, 
		208, 208, 208, 208, 208, 208, 208, 208, 
		208, 208, 208,  16,   0,  16,  16,  16, 
		 16,  16,  16,  16,  16,  16,  16,  16, 
		 16,  16,  16,  16,  16,  16,  16,  16, 
		 16,  16,  16,  16,  16,  16,  16,  16, 
		 16,  16,  16,  16,  16,  16,  16,  16, 
		 16,  16,  16,  16,  16,  16,  16,  16, 
		 16,  16,  16,  16,  16,  16,  16,  16, 
		 16,  16,  16,  16,  16,  16,  16,  16, 
		 16,  16,  16,  16,  16,  16,  16,  16, 
		 16,  16,  16,  16,  16,  16,  16,  16, 
		 16,  16,  16,  16,  16,  16,  16,  16, 
		 16,  16,  16,  16,  16,  16,  16,  16, 
		 16,  16,  16,  16,  16,  16,  16,  16, 
		 16,  16,  16,  16,  16,  16,  16,  16, 
		 16,  16,  16,  16,  16,  16,  16,  16, 
		 16,  16,  16,  16,  16,  16,  16,  16, 
		 16,  16,  16,  16,  16,  16,  16,  16, 
	};
	yych = *p;
	if (yybm[0+yych] & 16) {
		goto yy217;
	}
	if (yych <= '\r') {
		if (yych <= 0x00) goto yy215;
		if (yych <= '\n') goto yy220;
		goto yy222;
	} else {
		if (yych <= ' ') goto yy220;
		if (yych <= '$') goto yy223;
		goto yy220;
	}
yy215:
	++p;
yy216:
	{ assert(false && "bad input in EvaluatePath"); abort(); }
yy217:
	yych = *++p;
	if (yybm[0+yych] & 16) {
		goto yy217;
	}
	{ out_append->append(start, p - start);   continue; }
yy220:
	++p;
	{ p = start;                              break;    }
yy222:
	yych = *++p;
	if (yych == '\n') goto yy220;
	goto yy216;
yy223:
	yych = *(q = ++p);
	if (yybm[0+yych] & 64) {
		goto yy231;
	}
	if (yych <= ' ') {
		if (yych <= '\f') {
			if (yych != '\n') goto yy216;
		} else {
			if (yych <= '\r') goto yy227;
			if (yych <= 0x1F) goto yy216;
			goto yy229;
		}
	} else {
		if (yych <= '/') {
			if (yych == '$') goto yy229;
			goto yy216;
		} else {
			if (yych <= ':') goto yy229;
			if (yych <= '`') goto yy216;
			if (yych <= '{') goto yy234;
			goto yy216;
		}
	}
yy224:
	yych = *++p;
	if (yybm[0+yych] & 32) {
		goto yy224;
	}
	{                                         continue; }
yy227:
	yych = *++p;
	if (yych == '\n') goto yy224;
yy228:
	p = q;
	goto yy216;
yy229:
	++p;
	{ out_append->push_back(start[1]);        continue; }
yy231:
	yych = *++p;
	if (yybm[0+yych] & 64) {
		goto yy231;
	}
	{ expand(start + 1, p);                   continue; }
yy234:
	yych = *++p;
	if (yych == '}') goto yy228;
	goto yy236;
yy235:
	yych = *++p;
yy236:
	if (yybm[0+yych] & 128) {
		goto yy235;
	}
	if (yych != '}') goto yy228;
	++p;
	{ expand(start + 2, p - 1);               continue; }
}

  }
  assert((p == path.str_.data() + path.str_.size()) &&
         "bad end pos in EvaluatePath");
}

void EvaluatePathInScope(std::string* out_append, const LexedPath& path,
                         ScopePosition pos) {
  EvaluatePath(out_append, path, [out_append, &pos](const HashedStrView& var) {
    Scope::EvaluateVariableAtPos(out_append, var, pos);
  });
}

void EvaluatePathOnEdge(std::string* out_append, const LexedPath& path,
                        const Edge& edge) {
  EvaluatePath(out_append, path, [out_append, &edge](const HashedStrView& var) {
    // First look for a binding on the edge itself, then fall back to the
    // edge's enclosing scope.
    if (edge.EvaluateVariableSelfOnly(out_append, var))
      return;
    Scope::EvaluateVariableAtPos(out_append, var, edge.pos_.scope_pos());
  });
}

std::string EvaluatePathForTesting(const LexedPath& path) {
  std::string result;
  EvaluatePath(&result, path, [&result](StringPiece var) {
    result += "[$" + var.AsString() + "]";
  });
  return result;
}
