28 const char* line_start = input_.str_;
29 for (
const char* p = input_.str_; p < last_token_; ++p) {
35 int col = last_token_ ? (int)(last_token_ - line_start) : 0;
38 snprintf(buf,
sizeof(buf),
"%s:%d: ", filename_.AsString().c_str(), line);
40 *err += message +
"\n";
43 const int kTruncateColumn = 72;
44 if (col > 0 && col < kTruncateColumn) {
46 bool truncated =
true;
47 for (len = 0; len < kTruncateColumn; ++len) {
48 if (line_start[len] == 0 || line_start[len] ==
'\n') {
53 *err += string(line_start, len);
57 *err += string(col,
' ');
58 *err +=
"^ near here";
65 Start(
"input", input);
77 case ERROR:
return "lexing error";
78 case BUILD:
return "'build'";
79 case COLON:
return "':'";
80 case DEFAULT:
return "'default'";
81 case EQUALS:
return "'='";
82 case IDENT:
return "identifier";
83 case INCLUDE:
return "'include'";
84 case INDENT:
return "indent";
85 case NEWLINE:
return "newline";
86 case PIPE2:
return "'||'";
87 case PIPE:
return "'|'";
88 case POOL:
return "'pool'";
89 case RULE:
return "'rule'";
90 case SUBNINJA:
return "'subninja'";
91 case TEOF:
return "eof";
99 return " ($ also escapes ':')";
107 switch (last_token_[0]) {
109 return "tabs are not allowed, use spaces";
112 return "lexing error";
120 const char* p = ofs_;
129 unsigned int yyaccept = 0;
130 static const unsigned char yybm[] = {
131 0, 128, 128, 128, 128, 128, 128, 128,
132 128, 128, 0, 128, 128, 128, 128, 128,
133 128, 128, 128, 128, 128, 128, 128, 128,
134 128, 128, 128, 128, 128, 128, 128, 128,
135 160, 128, 128, 128, 128, 128, 128, 128,
136 128, 128, 128, 128, 128, 192, 192, 128,
137 192, 192, 192, 192, 192, 192, 192, 192,
138 192, 192, 128, 128, 128, 128, 128, 128,
139 128, 192, 192, 192, 192, 192, 192, 192,
140 192, 192, 192, 192, 192, 192, 192, 192,
141 192, 192, 192, 192, 192, 192, 192, 192,
142 192, 192, 192, 128, 128, 128, 128, 192,
143 128, 192, 192, 192, 192, 192, 192, 192,
144 192, 192, 192, 192, 192, 192, 192, 192,
145 192, 192, 192, 192, 192, 192, 192, 192,
146 192, 192, 192, 128, 128, 128, 128, 128,
147 128, 128, 128, 128, 128, 128, 128, 128,
148 128, 128, 128, 128, 128, 128, 128, 128,
149 128, 128, 128, 128, 128, 128, 128, 128,
150 128, 128, 128, 128, 128, 128, 128, 128,
151 128, 128, 128, 128, 128, 128, 128, 128,
152 128, 128, 128, 128, 128, 128, 128, 128,
153 128, 128, 128, 128, 128, 128, 128, 128,
154 128, 128, 128, 128, 128, 128, 128, 128,
155 128, 128, 128, 128, 128, 128, 128, 128,
156 128, 128, 128, 128, 128, 128, 128, 128,
157 128, 128, 128, 128, 128, 128, 128, 128,
158 128, 128, 128, 128, 128, 128, 128, 128,
159 128, 128, 128, 128, 128, 128, 128, 128,
160 128, 128, 128, 128, 128, 128, 128, 128,
161 128, 128, 128, 128, 128, 128, 128, 128,
162 128, 128, 128, 128, 128, 128, 128, 128,
165 if (yybm[0+yych] & 32) {
171 if (yych <= 0x00)
goto yy2;
172 if (yych ==
'\n')
goto yy6;
175 if (yych <=
'\r')
goto yy8;
176 if (yych ==
'#')
goto yy12;
181 if (yych ==
'/')
goto yy4;
182 if (yych <=
'9')
goto yy13;
186 if (yych <=
'<')
goto yy4;
189 if (yych <=
'@')
goto yy4;
190 if (yych <=
'Z')
goto yy13;
198 if (yych ==
'`')
goto yy4;
199 if (yych <=
'a')
goto yy13;
202 if (yych ==
'd')
goto yy21;
203 if (yych <=
'h')
goto yy13;
208 if (yych ==
'p')
goto yy23;
209 if (yych <=
'q')
goto yy13;
213 if (yych <=
's')
goto yy25;
216 if (yych ==
'|')
goto yy26;
224 { token = TEOF;
break; }
228 { token = ERROR;
break; }
231 { token = NEWLINE;
break; }
234 if (yych ==
'\n')
goto yy28;
239 if (yybm[0+yych] & 32) {
243 if (yych ==
'\n')
goto yy6;
245 if (yych <=
'\r')
goto yy30;
246 if (yych ==
'#')
goto yy32;
249 { token = INDENT;
break; }
253 if (yych <= 0x00)
goto yy5;
258 if (yybm[0+yych] & 64) {
261 { token = IDENT;
break; }
264 { token = COLON;
break; }
267 { token = EQUALS;
break; }
270 if (yych ==
'u')
goto yy36;
274 if (yych ==
'e')
goto yy37;
278 if (yych ==
'n')
goto yy38;
282 if (yych ==
'o')
goto yy39;
286 if (yych ==
'u')
goto yy40;
290 if (yych ==
'u')
goto yy41;
294 if (yych ==
'|')
goto yy42;
295 { token = PIPE;
break; }
298 { token = NEWLINE;
break; }
301 if (yych ==
'\n')
goto yy28;
312 if (yybm[0+yych] & 128) {
315 if (yych <= 0x00)
goto yy31;
320 if (yych ==
'i')
goto yy44;
324 if (yych ==
'f')
goto yy45;
328 if (yych ==
'c')
goto yy46;
332 if (yych ==
'o')
goto yy47;
336 if (yych ==
'l')
goto yy48;
340 if (yych ==
'b')
goto yy49;
344 { token = PIPE2;
break; }
347 if (yych ==
'l')
goto yy50;
351 if (yych ==
'a')
goto yy51;
355 if (yych ==
'l')
goto yy52;
359 if (yych ==
'l')
goto yy53;
363 if (yych ==
'e')
goto yy55;
367 if (yych ==
'n')
goto yy57;
371 if (yych ==
'd')
goto yy58;
375 if (yych ==
'u')
goto yy60;
379 if (yych ==
'u')
goto yy61;
383 if (yybm[0+yych] & 64) {
386 { token = POOL;
break; }
389 if (yybm[0+yych] & 64) {
392 { token = RULE;
break; }
395 if (yych ==
'i')
goto yy62;
399 if (yybm[0+yych] & 64) {
402 { token = BUILD;
break; }
405 if (yych ==
'l')
goto yy63;
409 if (yych ==
'd')
goto yy64;
413 if (yych ==
'n')
goto yy65;
417 if (yych ==
't')
goto yy66;
421 if (yych ==
'e')
goto yy68;
425 if (yych ==
'j')
goto yy70;
429 if (yybm[0+yych] & 64) {
432 { token = DEFAULT;
break; }
435 if (yybm[0+yych] & 64) {
438 { token = INCLUDE;
break; }
441 if (yych !=
'a')
goto yy14;
443 if (yybm[0+yych] & 64) {
446 { token = SUBNINJA;
break; }
453 if (token != NEWLINE && token != TEOF)
459 Token t = ReadToken();
467 const char* p = ofs_;
474 static const unsigned char yybm[] = {
475 0, 0, 0, 0, 0, 0, 0, 0,
476 0, 0, 0, 0, 0, 0, 0, 0,
477 0, 0, 0, 0, 0, 0, 0, 0,
478 0, 0, 0, 0, 0, 0, 0, 0,
479 128, 0, 0, 0, 0, 0, 0, 0,
480 0, 0, 0, 0, 0, 0, 0, 0,
481 0, 0, 0, 0, 0, 0, 0, 0,
482 0, 0, 0, 0, 0, 0, 0, 0,
483 0, 0, 0, 0, 0, 0, 0, 0,
484 0, 0, 0, 0, 0, 0, 0, 0,
485 0, 0, 0, 0, 0, 0, 0, 0,
486 0, 0, 0, 0, 0, 0, 0, 0,
487 0, 0, 0, 0, 0, 0, 0, 0,
488 0, 0, 0, 0, 0, 0, 0, 0,
489 0, 0, 0, 0, 0, 0, 0, 0,
490 0, 0, 0, 0, 0, 0, 0, 0,
491 0, 0, 0, 0, 0, 0, 0, 0,
492 0, 0, 0, 0, 0, 0, 0, 0,
493 0, 0, 0, 0, 0, 0, 0, 0,
494 0, 0, 0, 0, 0, 0, 0, 0,
495 0, 0, 0, 0, 0, 0, 0, 0,
496 0, 0, 0, 0, 0, 0, 0, 0,
497 0, 0, 0, 0, 0, 0, 0, 0,
498 0, 0, 0, 0, 0, 0, 0, 0,
499 0, 0, 0, 0, 0, 0, 0, 0,
500 0, 0, 0, 0, 0, 0, 0, 0,
501 0, 0, 0, 0, 0, 0, 0, 0,
502 0, 0, 0, 0, 0, 0, 0, 0,
503 0, 0, 0, 0, 0, 0, 0, 0,
504 0, 0, 0, 0, 0, 0, 0, 0,
505 0, 0, 0, 0, 0, 0, 0, 0,
506 0, 0, 0, 0, 0, 0, 0, 0,
509 if (yybm[0+yych] & 128) {
512 if (yych <= 0x00)
goto yy75;
513 if (yych ==
'$')
goto yy82;
524 if (yybm[0+yych] & 128) {
530 if (yych ==
'\n')
goto yy83;
531 if (yych ==
'\r')
goto yy85;
538 if (yych ==
'\n')
goto yy87;
550 const char* p = ofs_;
557 static const unsigned char yybm[] = {
558 0, 0, 0, 0, 0, 0, 0, 0,
559 0, 0, 0, 0, 0, 0, 0, 0,
560 0, 0, 0, 0, 0, 0, 0, 0,
561 0, 0, 0, 0, 0, 0, 0, 0,
562 0, 0, 0, 0, 0, 0, 0, 0,
563 0, 0, 0, 0, 0, 128, 128, 0,
564 128, 128, 128, 128, 128, 128, 128, 128,
565 128, 128, 0, 0, 0, 0, 0, 0,
566 0, 128, 128, 128, 128, 128, 128, 128,
567 128, 128, 128, 128, 128, 128, 128, 128,
568 128, 128, 128, 128, 128, 128, 128, 128,
569 128, 128, 128, 0, 0, 0, 0, 128,
570 0, 128, 128, 128, 128, 128, 128, 128,
571 128, 128, 128, 128, 128, 128, 128, 128,
572 128, 128, 128, 128, 128, 128, 128, 128,
573 128, 128, 128, 0, 0, 0, 0, 0,
574 0, 0, 0, 0, 0, 0, 0, 0,
575 0, 0, 0, 0, 0, 0, 0, 0,
576 0, 0, 0, 0, 0, 0, 0, 0,
577 0, 0, 0, 0, 0, 0, 0, 0,
578 0, 0, 0, 0, 0, 0, 0, 0,
579 0, 0, 0, 0, 0, 0, 0, 0,
580 0, 0, 0, 0, 0, 0, 0, 0,
581 0, 0, 0, 0, 0, 0, 0, 0,
582 0, 0, 0, 0, 0, 0, 0, 0,
583 0, 0, 0, 0, 0, 0, 0, 0,
584 0, 0, 0, 0, 0, 0, 0, 0,
585 0, 0, 0, 0, 0, 0, 0, 0,
586 0, 0, 0, 0, 0, 0, 0, 0,
587 0, 0, 0, 0, 0, 0, 0, 0,
588 0, 0, 0, 0, 0, 0, 0, 0,
589 0, 0, 0, 0, 0, 0, 0, 0,
592 if (yybm[0+yych] & 128) {
602 if (yybm[0+yych] & 128) {
606 out->assign(start, p - start);
619 const char* p = ofs_;
627 static const unsigned char yybm[] = {
628 0, 16, 16, 16, 16, 16, 16, 16,
629 16, 16, 0, 16, 16, 0, 16, 16,
630 16, 16, 16, 16, 16, 16, 16, 16,
631 16, 16, 16, 16, 16, 16, 16, 16,
632 32, 16, 16, 16, 0, 16, 16, 16,
633 16, 16, 16, 16, 16, 208, 144, 16,
634 208, 208, 208, 208, 208, 208, 208, 208,
635 208, 208, 0, 16, 16, 16, 16, 16,
636 16, 208, 208, 208, 208, 208, 208, 208,
637 208, 208, 208, 208, 208, 208, 208, 208,
638 208, 208, 208, 208, 208, 208, 208, 208,
639 208, 208, 208, 16, 16, 16, 16, 208,
640 16, 208, 208, 208, 208, 208, 208, 208,
641 208, 208, 208, 208, 208, 208, 208, 208,
642 208, 208, 208, 208, 208, 208, 208, 208,
643 208, 208, 208, 16, 0, 16, 16, 16,
644 16, 16, 16, 16, 16, 16, 16, 16,
645 16, 16, 16, 16, 16, 16, 16, 16,
646 16, 16, 16, 16, 16, 16, 16, 16,
647 16, 16, 16, 16, 16, 16, 16, 16,
648 16, 16, 16, 16, 16, 16, 16, 16,
649 16, 16, 16, 16, 16, 16, 16, 16,
650 16, 16, 16, 16, 16, 16, 16, 16,
651 16, 16, 16, 16, 16, 16, 16, 16,
652 16, 16, 16, 16, 16, 16, 16, 16,
653 16, 16, 16, 16, 16, 16, 16, 16,
654 16, 16, 16, 16, 16, 16, 16, 16,
655 16, 16, 16, 16, 16, 16, 16, 16,
656 16, 16, 16, 16, 16, 16, 16, 16,
657 16, 16, 16, 16, 16, 16, 16, 16,
658 16, 16, 16, 16, 16, 16, 16, 16,
659 16, 16, 16, 16, 16, 16, 16, 16,
662 if (yybm[0+yych] & 16) {
666 if (yych <= 0x00)
goto yy98;
667 if (yych <=
'\n')
goto yy103;
670 if (yych <=
' ')
goto yy103;
671 if (yych <=
'$')
goto yy107;
678 return Error(
"unexpected EOF", err);
682 if (yybm[0+yych] & 16) {
704 if (yych ==
'\n')
goto yy108;
707 return Error(DescribeLastError(), err);
711 if (yybm[0+yych] & 64) {
716 if (yych ==
'\n')
goto yy112;
719 if (yych <=
'\r')
goto yy115;
720 if (yych <= 0x1F)
goto yy110;
725 if (yych ==
'$')
goto yy118;
728 if (yych <=
':')
goto yy123;
729 if (yych <=
'`')
goto yy110;
730 if (yych <=
'{')
goto yy125;
746 return Error(
"bad $-escape (literal $ must be written as $$)", err);
750 if (yybm[0+yych] & 32) {
758 if (yych ==
'\n')
goto yy126;
774 if (yybm[0+yych] & 64) {
789 if (yybm[0+yych] & 128) {
795 if (yych ==
' ')
goto yy126;
801 if (yybm[0+yych] & 128) {
804 if (yych ==
'}')
goto yy132;
void UnreadToken()
Rewind to the last read Token.
StringPiece represents a slice of a string whose memory is managed externally.
static const char * TokenErrorHint(Token expected)
Return a human-readable token hint, used in error messages.
void EatWhitespace()
Skip past whitespace (called after each read token/ident/etc.).
bool PeekToken(Token token)
If the next token is token, read it and return true.
Token ReadToken()
Read a Token from the Token enum.
void AddSpecial(StringPiece text)
bool Error(const std::string &message, std::string *err)
Construct an error message with context.
std::string DescribeLastError()
If the last token read was an ERROR token, provide more info or the empty string. ...
void AddText(StringPiece text)
static const char * TokenName(Token t)
Return a human-readable form of a token, used in error messages.
bool ReadIdent(std::string *out)
Read a simple identifier (a rule or variable name).
bool ReadEvalString(EvalString *eval, bool path, std::string *err)
Read a $-escaped string.
A tokenized string that contains variable references.
void Error(const char *msg,...)
Log an error message.
void Start(StringPiece filename, StringPiece input)
Start parsing some input.