38 *err += message +
"\n";
41 const int kTruncateColumn = 72;
42 if (col > 0 && col < kTruncateColumn) {
44 bool truncated =
true;
45 for (len = 0; len < kTruncateColumn; ++len) {
46 if (context[len] == 0 || context[len] ==
'\n') {
51 *err += string(context, len);
55 *err += string(col,
' ');
56 *err +=
"^ near here";
63 Start(
"input", input);
75 case ERROR:
return "lexing error";
76 case BUILD:
return "'build'";
77 case COLON:
return "':'";
78 case DEFAULT:
return "'default'";
80 case IDENT:
return "identifier";
81 case INCLUDE:
return "'include'";
82 case INDENT:
return "indent";
84 case PIPE2:
return "'||'";
85 case PIPE:
return "'|'";
86 case POOL:
return "'pool'";
87 case RULE:
return "'rule'";
89 case TEOF:
return "eof";
97 return " ($ also escapes ':')";
107 return "carriage returns are not allowed, use newlines";
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, 0, 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 <=
'#')
goto yy11;
176 if (yych <=
',')
goto yy4;
177 if (yych <=
'.')
goto yy12;
182 if (yych <=
'9')
goto yy12;
183 if (yych <=
':')
goto yy15;
184 if (yych <=
'<')
goto yy4;
187 if (yych <=
'@')
goto yy4;
188 if (yych <=
'Z')
goto yy12;
189 if (yych <=
'^')
goto yy4;
196 if (yych <=
'`')
goto yy4;
197 if (yych ==
'b')
goto yy19;
200 if (yych <=
'd')
goto yy20;
201 if (yych ==
'i')
goto yy21;
206 if (yych <=
'p')
goto yy22;
207 if (yych <=
'q')
goto yy12;
208 if (yych <=
'r')
goto yy23;
211 if (yych <=
'z')
goto yy12;
212 if (yych ==
'|')
goto yy25;
219 { token =
TEOF;
break; }
223 { token =
ERROR;
break; }
231 if (yybm[0+yych] & 32) {
234 if (yych ==
'\n')
goto yy6;
235 if (yych ==
'#')
goto yy27;
237 { token =
INDENT;
break; }
241 if (yych <= 0x00)
goto yy5;
242 if (yych ==
'\r')
goto yy5;
248 if (yybm[0+yych] & 64) {
251 { token =
IDENT;
break; }
254 { token =
COLON;
break; }
257 { token =
EQUALS;
break; }
260 if (yych ==
'u')
goto yy32;
264 if (yych ==
'e')
goto yy33;
268 if (yych ==
'n')
goto yy34;
272 if (yych ==
'o')
goto yy35;
276 if (yych ==
'u')
goto yy36;
280 if (yych ==
'u')
goto yy37;
284 if ((yych = *p) ==
'|')
goto yy38;
285 { token =
PIPE;
break; }
290 if (yybm[0+yych] & 128) {
293 if (yych <= 0x00)
goto yy29;
294 if (yych <=
'\n')
goto yy30;
307 if (yych ==
'i')
goto yy40;
311 if (yych ==
'f')
goto yy41;
315 if (yych ==
'c')
goto yy42;
319 if (yych ==
'o')
goto yy43;
323 if (yych ==
'l')
goto yy44;
327 if (yych ==
'b')
goto yy45;
331 { token =
PIPE2;
break; }
334 if (yych ==
'l')
goto yy46;
338 if (yych ==
'a')
goto yy47;
342 if (yych ==
'l')
goto yy48;
346 if (yych ==
'l')
goto yy49;
350 if (yych ==
'e')
goto yy51;
354 if (yych ==
'n')
goto yy53;
358 if (yych ==
'd')
goto yy54;
362 if (yych ==
'u')
goto yy56;
366 if (yych ==
'u')
goto yy57;
370 if (yybm[0+(yych = *p)] & 64) {
373 { token =
POOL;
break; }
376 if (yybm[0+(yych = *p)] & 64) {
379 { token =
RULE;
break; }
382 if (yych ==
'i')
goto yy58;
386 if (yybm[0+(yych = *p)] & 64) {
389 { token =
BUILD;
break; }
392 if (yych ==
'l')
goto yy59;
396 if (yych ==
'd')
goto yy60;
400 if (yych ==
'n')
goto yy61;
404 if (yych ==
't')
goto yy62;
408 if (yych ==
'e')
goto yy64;
412 if (yych ==
'j')
goto yy66;
416 if (yybm[0+(yych = *p)] & 64) {
422 if (yybm[0+(yych = *p)] & 64) {
428 if (yych !=
'a')
goto yy13;
430 if (yybm[0+(yych = *p)] & 64) {
454 const char* p =
ofs_;
460 static const unsigned char yybm[] = {
461 0, 0, 0, 0, 0, 0, 0, 0,
462 0, 0, 0, 0, 0, 0, 0, 0,
463 0, 0, 0, 0, 0, 0, 0, 0,
464 0, 0, 0, 0, 0, 0, 0, 0,
465 128, 0, 0, 0, 0, 0, 0, 0,
466 0, 0, 0, 0, 0, 0, 0, 0,
467 0, 0, 0, 0, 0, 0, 0, 0,
468 0, 0, 0, 0, 0, 0, 0, 0,
469 0, 0, 0, 0, 0, 0, 0, 0,
470 0, 0, 0, 0, 0, 0, 0, 0,
471 0, 0, 0, 0, 0, 0, 0, 0,
472 0, 0, 0, 0, 0, 0, 0, 0,
473 0, 0, 0, 0, 0, 0, 0, 0,
474 0, 0, 0, 0, 0, 0, 0, 0,
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 0, 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,
495 if (yybm[0+yych] & 128) {
498 if (yych <= 0x00)
goto yy71;
499 if (yych ==
'$')
goto yy78;
511 if (yybm[0+yych] & 128) {
517 if (yych !=
'\n')
goto yy74;
526 const char* p =
ofs_;
528 const char* start = p;
532 static const unsigned char yybm[] = {
533 0, 0, 0, 0, 0, 0, 0, 0,
534 0, 0, 0, 0, 0, 0, 0, 0,
535 0, 0, 0, 0, 0, 0, 0, 0,
536 0, 0, 0, 0, 0, 0, 0, 0,
537 0, 0, 0, 0, 0, 0, 0, 0,
538 0, 0, 0, 0, 0, 128, 128, 0,
539 128, 128, 128, 128, 128, 128, 128, 128,
540 128, 128, 0, 0, 0, 0, 0, 0,
541 0, 128, 128, 128, 128, 128, 128, 128,
542 128, 128, 128, 128, 128, 128, 128, 128,
543 128, 128, 128, 128, 128, 128, 128, 128,
544 128, 128, 128, 0, 0, 0, 0, 128,
545 0, 128, 128, 128, 128, 128, 128, 128,
546 128, 128, 128, 128, 128, 128, 128, 128,
547 128, 128, 128, 128, 128, 128, 128, 128,
548 128, 128, 128, 0, 0, 0, 0, 0,
549 0, 0, 0, 0, 0, 0, 0, 0,
550 0, 0, 0, 0, 0, 0, 0, 0,
551 0, 0, 0, 0, 0, 0, 0, 0,
552 0, 0, 0, 0, 0, 0, 0, 0,
553 0, 0, 0, 0, 0, 0, 0, 0,
554 0, 0, 0, 0, 0, 0, 0, 0,
555 0, 0, 0, 0, 0, 0, 0, 0,
556 0, 0, 0, 0, 0, 0, 0, 0,
557 0, 0, 0, 0, 0, 0, 0, 0,
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, 0, 0, 0,
564 0, 0, 0, 0, 0, 0, 0, 0,
567 if (yybm[0+yych] & 128) {
575 if (yybm[0+yych] & 128) {
579 out->assign(start, p - start);
591 const char* p =
ofs_;
599 static const unsigned char yybm[] = {
600 0, 16, 16, 16, 16, 16, 16, 16,
601 16, 16, 0, 16, 16, 0, 16, 16,
602 16, 16, 16, 16, 16, 16, 16, 16,
603 16, 16, 16, 16, 16, 16, 16, 16,
604 32, 16, 16, 16, 0, 16, 16, 16,
605 16, 16, 16, 16, 16, 208, 144, 16,
606 208, 208, 208, 208, 208, 208, 208, 208,
607 208, 208, 0, 16, 16, 16, 16, 16,
608 16, 208, 208, 208, 208, 208, 208, 208,
609 208, 208, 208, 208, 208, 208, 208, 208,
610 208, 208, 208, 208, 208, 208, 208, 208,
611 208, 208, 208, 16, 16, 16, 16, 208,
612 16, 208, 208, 208, 208, 208, 208, 208,
613 208, 208, 208, 208, 208, 208, 208, 208,
614 208, 208, 208, 208, 208, 208, 208, 208,
615 208, 208, 208, 16, 0, 16, 16, 16,
616 16, 16, 16, 16, 16, 16, 16, 16,
617 16, 16, 16, 16, 16, 16, 16, 16,
618 16, 16, 16, 16, 16, 16, 16, 16,
619 16, 16, 16, 16, 16, 16, 16, 16,
620 16, 16, 16, 16, 16, 16, 16, 16,
621 16, 16, 16, 16, 16, 16, 16, 16,
622 16, 16, 16, 16, 16, 16, 16, 16,
623 16, 16, 16, 16, 16, 16, 16, 16,
624 16, 16, 16, 16, 16, 16, 16, 16,
625 16, 16, 16, 16, 16, 16, 16, 16,
626 16, 16, 16, 16, 16, 16, 16, 16,
627 16, 16, 16, 16, 16, 16, 16, 16,
628 16, 16, 16, 16, 16, 16, 16, 16,
629 16, 16, 16, 16, 16, 16, 16, 16,
630 16, 16, 16, 16, 16, 16, 16, 16,
631 16, 16, 16, 16, 16, 16, 16, 16,
634 if (yybm[0+yych] & 16) {
638 if (yych <= 0x00)
goto yy90;
639 if (yych <=
'\n')
goto yy95;
642 if (yych <=
' ')
goto yy95;
643 if (yych <=
'$')
goto yy99;
650 return Error(
"unexpected EOF", err);
655 if (yybm[0+yych] & 16) {
683 if (yybm[0+yych] & 64) {
688 if (yych >=
'\n')
goto yy102;
690 if (yych ==
' ')
goto yy105;
694 if (yych <=
'$')
goto yy107;
695 if (yych >=
'0')
goto yy112;
697 if (yych <=
'`')
goto yy100;
698 if (yych <=
'{')
goto yy114;
706 return Error(
"bad $-escape (literal $ must be written as $$)", err);
711 if (yybm[0+yych] & 32) {
732 if (yybm[0+yych] & 64) {
747 if (yybm[0+yych] & 128) {
754 if (yybm[0+yych] & 128) {
757 if (yych ==
'}')
goto yy118;
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.).
string AsString() const
Convert the slice into a full-fledged std::string, copying the data into a new string.
bool PeekToken(Token token)
If the next token is token, read it and return true.
bool Error(const string &message, string *err)
Construct an error message with context.
Token ReadToken()
Read a Token from the Token enum.
void AddSpecial(StringPiece text)
string DescribeLastError()
If the last token read was an ERROR token, provide more info or the empty string. ...
bool ReadIdent(string *out)
Read a simple identifier (a rule or variable name).
bool ReadEvalString(EvalString *eval, bool path, string *err)
Read a $-escaped string.
void AddText(StringPiece text)
static const char * TokenName(Token t)
Return a human-readable form of a token, used in error messages.
A tokenized string that contains variable references.
void Start(StringPiece filename, StringPiece input)
Start parsing some input.