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 yy1;
173 if (yych ==
'\n')
goto yy4;
176 if (yych <=
'\r')
goto yy5;
177 if (yych ==
'#')
goto yy8;
182 if (yych ==
'/')
goto yy2;
183 if (yych <=
'9')
goto yy9;
187 if (yych <=
'<')
goto yy2;
190 if (yych <=
'@')
goto yy2;
191 if (yych <=
'Z')
goto yy9;
199 if (yych ==
'`')
goto yy2;
200 if (yych <=
'a')
goto yy9;
203 if (yych ==
'd')
goto yy14;
204 if (yych <=
'h')
goto yy9;
209 if (yych ==
'p')
goto yy16;
210 if (yych <=
'q')
goto yy9;
214 if (yych <=
's')
goto yy18;
217 if (yych ==
'|')
goto yy19;
225 { token = TEOF;
break; }
229 { token = ERROR;
break; }
232 { token = NEWLINE;
break; }
235 if (yych ==
'\n')
goto yy20;
240 if (yybm[0+yych] & 32) {
244 if (yych ==
'\n')
goto yy4;
246 if (yych <=
'\r')
goto yy21;
247 if (yych ==
'#')
goto yy23;
250 { token = INDENT;
break; }
254 if (yych <= 0x00)
goto yy3;
259 if (yybm[0+yych] & 64) {
262 { token = IDENT;
break; }
265 { token = COLON;
break; }
268 { token = EQUALS;
break; }
271 if (yych ==
'u')
goto yy25;
275 if (yych ==
'e')
goto yy26;
279 if (yych ==
'n')
goto yy27;
283 if (yych ==
'o')
goto yy28;
287 if (yych ==
'u')
goto yy29;
291 if (yych ==
'u')
goto yy30;
295 if (yych ==
'@')
goto yy31;
296 if (yych ==
'|')
goto yy32;
297 { token = PIPE;
break; }
300 { token = NEWLINE;
break; }
303 if (yych ==
'\n')
goto yy20;
314 if (yybm[0+yych] & 128) {
317 if (yych <= 0x00)
goto yy22;
322 if (yych ==
'i')
goto yy33;
326 if (yych ==
'f')
goto yy34;
330 if (yych ==
'c')
goto yy35;
334 if (yych ==
'o')
goto yy36;
338 if (yych ==
'l')
goto yy37;
342 if (yych ==
'b')
goto yy38;
346 { token = PIPEAT;
break; }
349 { token = PIPE2;
break; }
352 if (yych ==
'l')
goto yy39;
356 if (yych ==
'a')
goto yy40;
360 if (yych ==
'l')
goto yy41;
364 if (yych ==
'l')
goto yy42;
368 if (yych ==
'e')
goto yy43;
372 if (yych ==
'n')
goto yy44;
376 if (yych ==
'd')
goto yy45;
380 if (yych ==
'u')
goto yy46;
384 if (yych ==
'u')
goto yy47;
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 yy48;
404 if (yybm[0+yych] & 64) {
407 { token = BUILD;
break; }
410 if (yych ==
'l')
goto yy49;
414 if (yych ==
'd')
goto yy50;
418 if (yych ==
'n')
goto yy51;
422 if (yych ==
't')
goto yy52;
426 if (yych ==
'e')
goto yy53;
430 if (yych ==
'j')
goto yy54;
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 yy10;
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 yy56;
518 if (yych ==
'$')
goto yy60;
529 if (yybm[0+yych] & 128) {
535 if (yych ==
'\n')
goto yy61;
536 if (yych ==
'\r')
goto yy62;
543 if (yych ==
'\n')
goto yy63;
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 yy67;
672 if (yych <=
'\n')
goto yy69;
675 if (yych <=
' ')
goto yy69;
676 if (yych <=
'$')
goto yy71;
683 return Error(
"unexpected EOF", err);
687 if (yybm[0+yych] & 16) {
709 if (yych ==
'\n')
goto yy72;
712 return Error(DescribeLastError(), err);
716 if (yybm[0+yych] & 64) {
721 if (yych ==
'\n')
goto yy75;
724 if (yych <=
'\r')
goto yy76;
725 if (yych <= 0x1F)
goto yy73;
730 if (yych ==
'$')
goto yy78;
733 if (yych <=
':')
goto yy80;
734 if (yych <=
'`')
goto yy73;
735 if (yych <=
'{')
goto yy81;
751 return Error(
"bad $-escape (literal $ must be written as $$)", err);
755 if (yybm[0+yych] & 32) {
763 if (yych ==
'\n')
goto yy82;
779 if (yybm[0+yych] & 64) {
794 if (yybm[0+yych] & 128) {
800 if (yych ==
' ')
goto yy82;
806 if (yybm[0+yych] & 128) {
809 if (yych ==
'}')
goto yy84;
A tokenized string that contains variable references.
void AddSpecial(StringPiece text)
void AddText(StringPiece text)
static const char * TokenName(Token t)
Return a human-readable form of a token, used in error messages.
bool PeekToken(Token token)
If the next token is token, read it and return true.
std::string DescribeLastError()
If the last token read was an ERROR token, provide more info or the empty string.
void UnreadToken()
Rewind to the last read Token.
bool ReadEvalString(EvalString *eval, bool path, std::string *err)
Read a $-escaped string.
void Start(StringPiece filename, StringPiece input)
Start parsing some input.
Token ReadToken()
Read a Token from the Token enum.
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 ReadIdent(std::string *out)
Read a simple identifier (a rule or variable name).
bool Error(const std::string &message, std::string *err)
Construct an error message with context.
StringPiece represents a slice of a string whose memory is managed externally.
void Error(const char *msg, va_list ap)