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 PIPEAT:
return "'|@'";
89 case POOL:
return "'pool'";
90 case RULE:
return "'rule'";
91 case SUBNINJA:
return "'subninja'";
92 case TEOF:
return "eof";
100 return " ($ also escapes ':')";
108 switch (last_token_[0]) {
110 return "tabs are not allowed, use spaces";
113 return "lexing error";
121 const char* p = ofs_;
130 unsigned int yyaccept = 0;
131 static const unsigned char yybm[] = {
132 0, 128, 128, 128, 128, 128, 128, 128,
133 128, 128, 0, 128, 128, 128, 128, 128,
134 128, 128, 128, 128, 128, 128, 128, 128,
135 128, 128, 128, 128, 128, 128, 128, 128,
136 160, 128, 128, 128, 128, 128, 128, 128,
137 128, 128, 128, 128, 128, 192, 192, 128,
138 192, 192, 192, 192, 192, 192, 192, 192,
139 192, 192, 128, 128, 128, 128, 128, 128,
140 128, 192, 192, 192, 192, 192, 192, 192,
141 192, 192, 192, 192, 192, 192, 192, 192,
142 192, 192, 192, 192, 192, 192, 192, 192,
143 192, 192, 192, 128, 128, 128, 128, 192,
144 128, 192, 192, 192, 192, 192, 192, 192,
145 192, 192, 192, 192, 192, 192, 192, 192,
146 192, 192, 192, 192, 192, 192, 192, 192,
147 192, 192, 192, 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,
163 128, 128, 128, 128, 128, 128, 128, 128,
166 if (yybm[0+yych] & 32) {
172 if (yych <= 0x00)
goto yy2;
173 if (yych ==
'\n')
goto yy6;
176 if (yych <=
'\r')
goto yy8;
177 if (yych ==
'#')
goto yy12;
182 if (yych ==
'/')
goto yy4;
183 if (yych <=
'9')
goto yy13;
187 if (yych <=
'<')
goto yy4;
190 if (yych <=
'@')
goto yy4;
191 if (yych <=
'Z')
goto yy13;
199 if (yych ==
'`')
goto yy4;
200 if (yych <=
'a')
goto yy13;
203 if (yych ==
'd')
goto yy21;
204 if (yych <=
'h')
goto yy13;
209 if (yych ==
'p')
goto yy23;
210 if (yych <=
'q')
goto yy13;
214 if (yych <=
's')
goto yy25;
217 if (yych ==
'|')
goto yy26;
225 { token = TEOF;
break; }
229 { token = ERROR;
break; }
232 { token = NEWLINE;
break; }
235 if (yych ==
'\n')
goto yy28;
240 if (yybm[0+yych] & 32) {
244 if (yych ==
'\n')
goto yy6;
246 if (yych <=
'\r')
goto yy30;
247 if (yych ==
'#')
goto yy32;
250 { token = INDENT;
break; }
254 if (yych <= 0x00)
goto yy5;
259 if (yybm[0+yych] & 64) {
262 { token = IDENT;
break; }
265 { token = COLON;
break; }
268 { token = EQUALS;
break; }
271 if (yych ==
'u')
goto yy36;
275 if (yych ==
'e')
goto yy37;
279 if (yych ==
'n')
goto yy38;
283 if (yych ==
'o')
goto yy39;
287 if (yych ==
'u')
goto yy40;
291 if (yych ==
'u')
goto yy41;
295 if (yych ==
'@')
goto yy42;
296 if (yych ==
'|')
goto yy44;
297 { token = PIPE;
break; }
300 { token = NEWLINE;
break; }
303 if (yych ==
'\n')
goto yy28;
314 if (yybm[0+yych] & 128) {
317 if (yych <= 0x00)
goto yy31;
322 if (yych ==
'i')
goto yy46;
326 if (yych ==
'f')
goto yy47;
330 if (yych ==
'c')
goto yy48;
334 if (yych ==
'o')
goto yy49;
338 if (yych ==
'l')
goto yy50;
342 if (yych ==
'b')
goto yy51;
346 { token = PIPEAT;
break; }
349 { token = PIPE2;
break; }
352 if (yych ==
'l')
goto yy52;
356 if (yych ==
'a')
goto yy53;
360 if (yych ==
'l')
goto yy54;
364 if (yych ==
'l')
goto yy55;
368 if (yych ==
'e')
goto yy57;
372 if (yych ==
'n')
goto yy59;
376 if (yych ==
'd')
goto yy60;
380 if (yych ==
'u')
goto yy62;
384 if (yych ==
'u')
goto yy63;
388 if (yybm[0+yych] & 64) {
391 { token = POOL;
break; }
394 if (yybm[0+yych] & 64) {
397 { token = RULE;
break; }
400 if (yych ==
'i')
goto yy64;
404 if (yybm[0+yych] & 64) {
407 { token = BUILD;
break; }
410 if (yych ==
'l')
goto yy65;
414 if (yych ==
'd')
goto yy66;
418 if (yych ==
'n')
goto yy67;
422 if (yych ==
't')
goto yy68;
426 if (yych ==
'e')
goto yy70;
430 if (yych ==
'j')
goto yy72;
434 if (yybm[0+yych] & 64) {
437 { token = DEFAULT;
break; }
440 if (yybm[0+yych] & 64) {
443 { token = INCLUDE;
break; }
446 if (yych !=
'a')
goto yy14;
448 if (yybm[0+yych] & 64) {
451 { token = SUBNINJA;
break; }
458 if (token != NEWLINE && token != TEOF)
464 Token t = ReadToken();
472 const char* p = ofs_;
479 static const unsigned char yybm[] = {
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 128, 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,
507 0, 0, 0, 0, 0, 0, 0, 0,
508 0, 0, 0, 0, 0, 0, 0, 0,
509 0, 0, 0, 0, 0, 0, 0, 0,
510 0, 0, 0, 0, 0, 0, 0, 0,
511 0, 0, 0, 0, 0, 0, 0, 0,
514 if (yybm[0+yych] & 128) {
517 if (yych <= 0x00)
goto yy77;
518 if (yych ==
'$')
goto yy84;
529 if (yybm[0+yych] & 128) {
535 if (yych ==
'\n')
goto yy85;
536 if (yych ==
'\r')
goto yy87;
543 if (yych ==
'\n')
goto yy89;
555 const char* p = ofs_;
562 static const unsigned char yybm[] = {
563 0, 0, 0, 0, 0, 0, 0, 0,
564 0, 0, 0, 0, 0, 0, 0, 0,
565 0, 0, 0, 0, 0, 0, 0, 0,
566 0, 0, 0, 0, 0, 0, 0, 0,
567 0, 0, 0, 0, 0, 0, 0, 0,
568 0, 0, 0, 0, 0, 128, 128, 0,
569 128, 128, 128, 128, 128, 128, 128, 128,
570 128, 128, 0, 0, 0, 0, 0, 0,
571 0, 128, 128, 128, 128, 128, 128, 128,
572 128, 128, 128, 128, 128, 128, 128, 128,
573 128, 128, 128, 128, 128, 128, 128, 128,
574 128, 128, 128, 0, 0, 0, 0, 128,
575 0, 128, 128, 128, 128, 128, 128, 128,
576 128, 128, 128, 128, 128, 128, 128, 128,
577 128, 128, 128, 128, 128, 128, 128, 128,
578 128, 128, 128, 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,
590 0, 0, 0, 0, 0, 0, 0, 0,
591 0, 0, 0, 0, 0, 0, 0, 0,
592 0, 0, 0, 0, 0, 0, 0, 0,
593 0, 0, 0, 0, 0, 0, 0, 0,
594 0, 0, 0, 0, 0, 0, 0, 0,
597 if (yybm[0+yych] & 128) {
607 if (yybm[0+yych] & 128) {
611 out->assign(start, p - start);
624 const char* p = ofs_;
632 static const unsigned char yybm[] = {
633 0, 16, 16, 16, 16, 16, 16, 16,
634 16, 16, 0, 16, 16, 0, 16, 16,
635 16, 16, 16, 16, 16, 16, 16, 16,
636 16, 16, 16, 16, 16, 16, 16, 16,
637 32, 16, 16, 16, 0, 16, 16, 16,
638 16, 16, 16, 16, 16, 208, 144, 16,
639 208, 208, 208, 208, 208, 208, 208, 208,
640 208, 208, 0, 16, 16, 16, 16, 16,
641 16, 208, 208, 208, 208, 208, 208, 208,
642 208, 208, 208, 208, 208, 208, 208, 208,
643 208, 208, 208, 208, 208, 208, 208, 208,
644 208, 208, 208, 16, 16, 16, 16, 208,
645 16, 208, 208, 208, 208, 208, 208, 208,
646 208, 208, 208, 208, 208, 208, 208, 208,
647 208, 208, 208, 208, 208, 208, 208, 208,
648 208, 208, 208, 16, 0, 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,
660 16, 16, 16, 16, 16, 16, 16, 16,
661 16, 16, 16, 16, 16, 16, 16, 16,
662 16, 16, 16, 16, 16, 16, 16, 16,
663 16, 16, 16, 16, 16, 16, 16, 16,
664 16, 16, 16, 16, 16, 16, 16, 16,
667 if (yybm[0+yych] & 16) {
671 if (yych <= 0x00)
goto yy100;
672 if (yych <=
'\n')
goto yy105;
675 if (yych <=
' ')
goto yy105;
676 if (yych <=
'$')
goto yy109;
683 return Error(
"unexpected EOF", err);
687 if (yybm[0+yych] & 16) {
709 if (yych ==
'\n')
goto yy110;
712 return Error(DescribeLastError(), err);
716 if (yybm[0+yych] & 64) {
721 if (yych ==
'\n')
goto yy114;
724 if (yych <=
'\r')
goto yy117;
725 if (yych <= 0x1F)
goto yy112;
730 if (yych ==
'$')
goto yy120;
733 if (yych <=
':')
goto yy125;
734 if (yych <=
'`')
goto yy112;
735 if (yych <=
'{')
goto yy127;
751 return Error(
"bad $-escape (literal $ must be written as $$)", err);
755 if (yybm[0+yych] & 32) {
763 if (yych ==
'\n')
goto yy128;
779 if (yybm[0+yych] & 64) {
794 if (yybm[0+yych] & 128) {
800 if (yych ==
' ')
goto yy128;
806 if (yybm[0+yych] & 128) {
809 if (yych ==
'}')
goto yy134;
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).
void Error(const char *msg, va_list ap)
bool ReadEvalString(EvalString *eval, bool path, std::string *err)
Read a $-escaped string.
A tokenized string that contains variable references.
void Start(StringPiece filename, StringPiece input)
Start parsing some input.