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, 64, 64, 64, 64, 64, 64, 64,
132 64, 64, 0, 64, 64, 0, 64, 64,
133 64, 64, 64, 64, 64, 64, 64, 64,
134 64, 64, 64, 64, 64, 64, 64, 64,
135 192, 64, 64, 64, 64, 64, 64, 64,
136 64, 64, 64, 64, 64, 96, 96, 64,
137 96, 96, 96, 96, 96, 96, 96, 96,
138 96, 96, 64, 64, 64, 64, 64, 64,
139 64, 96, 96, 96, 96, 96, 96, 96,
140 96, 96, 96, 96, 96, 96, 96, 96,
141 96, 96, 96, 96, 96, 96, 96, 96,
142 96, 96, 96, 64, 64, 64, 64, 96,
143 64, 96, 96, 96, 96, 96, 96, 96,
144 96, 96, 96, 96, 96, 96, 96, 96,
145 96, 96, 96, 96, 96, 96, 96, 96,
146 96, 96, 96, 64, 64, 64, 64, 64,
147 64, 64, 64, 64, 64, 64, 64, 64,
148 64, 64, 64, 64, 64, 64, 64, 64,
149 64, 64, 64, 64, 64, 64, 64, 64,
150 64, 64, 64, 64, 64, 64, 64, 64,
151 64, 64, 64, 64, 64, 64, 64, 64,
152 64, 64, 64, 64, 64, 64, 64, 64,
153 64, 64, 64, 64, 64, 64, 64, 64,
154 64, 64, 64, 64, 64, 64, 64, 64,
155 64, 64, 64, 64, 64, 64, 64, 64,
156 64, 64, 64, 64, 64, 64, 64, 64,
157 64, 64, 64, 64, 64, 64, 64, 64,
158 64, 64, 64, 64, 64, 64, 64, 64,
159 64, 64, 64, 64, 64, 64, 64, 64,
160 64, 64, 64, 64, 64, 64, 64, 64,
161 64, 64, 64, 64, 64, 64, 64, 64,
162 64, 64, 64, 64, 64, 64, 64, 64,
168 if (yych <= 0x00)
goto yy22;
169 if (yych ==
'\n')
goto yy6;
172 if (yych <=
' ')
goto yy2;
173 if (yych ==
'#')
goto yy4;
178 if (yych ==
'/')
goto yy24;
179 if (yych <=
'9')
goto yy21;
183 if (yych <=
'<')
goto yy24;
186 if (yych <=
'@')
goto yy24;
187 if (yych <=
'Z')
goto yy21;
195 if (yych ==
'`')
goto yy24;
196 if (yych <=
'a')
goto yy21;
199 if (yych ==
'd')
goto yy12;
200 if (yych <=
'h')
goto yy21;
205 if (yych ==
'p')
goto yy10;
206 if (yych <=
'q')
goto yy21;
210 if (yych <=
's')
goto yy20;
213 if (yych ==
'|')
goto yy17;
224 { token =
INDENT;
break; }
228 if (yych <= 0x00)
goto yy5;
229 if (yych !=
'\r')
goto yy65;
231 { token =
ERROR;
break; }
238 if ((yych = *p) ==
'u')
goto yy59;
241 { token =
IDENT;
break; }
244 if (yych ==
'o')
goto yy55;
248 if (yych ==
'u')
goto yy51;
252 if (yych ==
'e')
goto yy44;
256 { token =
EQUALS;
break; }
259 { token =
COLON;
break; }
262 if ((yych = *p) ==
'|')
goto yy42;
263 { token =
PIPE;
break; }
266 if (yych ==
'n')
goto yy35;
270 if (yych ==
'u')
goto yy27;
277 { token =
TEOF;
break; }
285 if (yybm[0+yych] & 32) {
291 if (yych !=
'b')
goto yy26;
293 if (yych !=
'n')
goto yy26;
295 if (yych !=
'i')
goto yy26;
297 if (yych !=
'n')
goto yy26;
299 if (yych !=
'j')
goto yy26;
301 if (yych !=
'a')
goto yy26;
303 if (yybm[0+(yych = *p)] & 32) {
309 if (yych !=
'c')
goto yy26;
311 if (yych !=
'l')
goto yy26;
313 if (yych !=
'u')
goto yy26;
315 if (yych !=
'd')
goto yy26;
317 if (yych !=
'e')
goto yy26;
319 if (yybm[0+(yych = *p)] & 32) {
325 { token =
PIPE2;
break; }
328 if (yych !=
'f')
goto yy26;
330 if (yych !=
'a')
goto yy26;
332 if (yych !=
'u')
goto yy26;
334 if (yych !=
'l')
goto yy26;
336 if (yych !=
't')
goto yy26;
338 if (yybm[0+(yych = *p)] & 32) {
344 if (yych !=
'l')
goto yy26;
346 if (yych !=
'e')
goto yy26;
348 if (yybm[0+(yych = *p)] & 32) {
351 { token =
RULE;
break; }
354 if (yych !=
'o')
goto yy26;
356 if (yych !=
'l')
goto yy26;
358 if (yybm[0+(yych = *p)] & 32) {
361 { token =
POOL;
break; }
364 if (yych !=
'i')
goto yy26;
366 if (yych !=
'l')
goto yy26;
368 if (yych !=
'd')
goto yy26;
370 if (yybm[0+(yych = *p)] & 32) {
373 { token =
BUILD;
break; }
378 if (yybm[0+yych] & 64) {
381 if (yych <= 0x00)
goto yy66;
382 if (yych <=
'\n')
goto yy67;
398 if (yybm[0+yych] & 128) {
401 if (yych ==
'\n')
goto yy71;
402 if (yych ==
'#')
goto yy64;
428 const char* p =
ofs_;
434 static const unsigned char yybm[] = {
435 0, 0, 0, 0, 0, 0, 0, 0,
436 0, 0, 0, 0, 0, 0, 0, 0,
437 0, 0, 0, 0, 0, 0, 0, 0,
438 0, 0, 0, 0, 0, 0, 0, 0,
439 128, 0, 0, 0, 0, 0, 0, 0,
440 0, 0, 0, 0, 0, 0, 0, 0,
441 0, 0, 0, 0, 0, 0, 0, 0,
442 0, 0, 0, 0, 0, 0, 0, 0,
443 0, 0, 0, 0, 0, 0, 0, 0,
444 0, 0, 0, 0, 0, 0, 0, 0,
445 0, 0, 0, 0, 0, 0, 0, 0,
446 0, 0, 0, 0, 0, 0, 0, 0,
447 0, 0, 0, 0, 0, 0, 0, 0,
448 0, 0, 0, 0, 0, 0, 0, 0,
449 0, 0, 0, 0, 0, 0, 0, 0,
450 0, 0, 0, 0, 0, 0, 0, 0,
451 0, 0, 0, 0, 0, 0, 0, 0,
452 0, 0, 0, 0, 0, 0, 0, 0,
453 0, 0, 0, 0, 0, 0, 0, 0,
454 0, 0, 0, 0, 0, 0, 0, 0,
455 0, 0, 0, 0, 0, 0, 0, 0,
456 0, 0, 0, 0, 0, 0, 0, 0,
457 0, 0, 0, 0, 0, 0, 0, 0,
458 0, 0, 0, 0, 0, 0, 0, 0,
459 0, 0, 0, 0, 0, 0, 0, 0,
460 0, 0, 0, 0, 0, 0, 0, 0,
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 0, 0, 0, 0, 0, 0, 0, 0,
466 0, 0, 0, 0, 0, 0, 0, 0,
470 if (yych <= 0x00)
goto yy78;
471 if (yych <= 0x1F)
goto yy80;
473 if (yych ==
'$')
goto yy76;
483 if ((yych = *p) ==
'\n')
goto yy81;
499 if (yybm[0+yych] & 128) {
509 const char* p =
ofs_;
511 const char* start = p;
515 static const unsigned char yybm[] = {
516 0, 0, 0, 0, 0, 0, 0, 0,
517 0, 0, 0, 0, 0, 0, 0, 0,
518 0, 0, 0, 0, 0, 0, 0, 0,
519 0, 0, 0, 0, 0, 0, 0, 0,
520 0, 0, 0, 0, 0, 0, 0, 0,
521 0, 0, 0, 0, 0, 128, 128, 0,
522 128, 128, 128, 128, 128, 128, 128, 128,
523 128, 128, 0, 0, 0, 0, 0, 0,
524 0, 128, 128, 128, 128, 128, 128, 128,
525 128, 128, 128, 128, 128, 128, 128, 128,
526 128, 128, 128, 128, 128, 128, 128, 128,
527 128, 128, 128, 0, 0, 0, 0, 128,
528 0, 128, 128, 128, 128, 128, 128, 128,
529 128, 128, 128, 128, 128, 128, 128, 128,
530 128, 128, 128, 128, 128, 128, 128, 128,
531 128, 128, 128, 0, 0, 0, 0, 0,
532 0, 0, 0, 0, 0, 0, 0, 0,
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, 0, 0, 0,
539 0, 0, 0, 0, 0, 0, 0, 0,
540 0, 0, 0, 0, 0, 0, 0, 0,
541 0, 0, 0, 0, 0, 0, 0, 0,
542 0, 0, 0, 0, 0, 0, 0, 0,
543 0, 0, 0, 0, 0, 0, 0, 0,
544 0, 0, 0, 0, 0, 0, 0, 0,
545 0, 0, 0, 0, 0, 0, 0, 0,
546 0, 0, 0, 0, 0, 0, 0, 0,
547 0, 0, 0, 0, 0, 0, 0, 0,
552 if (yych <=
',')
goto yy89;
554 if (yych <=
'/')
goto yy89;
555 if (yych >=
':')
goto yy89;
559 if (yych <=
'Z')
goto yy87;
560 if (yych <=
'^')
goto yy89;
562 if (yych <=
'`')
goto yy89;
563 if (yych >=
'{')
goto yy89;
572 out->assign(start, p - start);
582 if (yybm[0+yych] & 128) {
595 const char* p =
ofs_;
603 static const unsigned char yybm[] = {
604 0, 128, 128, 128, 128, 128, 128, 128,
605 128, 128, 0, 128, 128, 0, 128, 128,
606 128, 128, 128, 128, 128, 128, 128, 128,
607 128, 128, 128, 128, 128, 128, 128, 128,
608 16, 128, 128, 128, 0, 128, 128, 128,
609 128, 128, 128, 128, 128, 224, 160, 128,
610 224, 224, 224, 224, 224, 224, 224, 224,
611 224, 224, 0, 128, 128, 128, 128, 128,
612 128, 224, 224, 224, 224, 224, 224, 224,
613 224, 224, 224, 224, 224, 224, 224, 224,
614 224, 224, 224, 224, 224, 224, 224, 224,
615 224, 224, 224, 128, 128, 128, 128, 224,
616 128, 224, 224, 224, 224, 224, 224, 224,
617 224, 224, 224, 224, 224, 224, 224, 224,
618 224, 224, 224, 224, 224, 224, 224, 224,
619 224, 224, 224, 128, 0, 128, 128, 128,
620 128, 128, 128, 128, 128, 128, 128, 128,
621 128, 128, 128, 128, 128, 128, 128, 128,
622 128, 128, 128, 128, 128, 128, 128, 128,
623 128, 128, 128, 128, 128, 128, 128, 128,
624 128, 128, 128, 128, 128, 128, 128, 128,
625 128, 128, 128, 128, 128, 128, 128, 128,
626 128, 128, 128, 128, 128, 128, 128, 128,
627 128, 128, 128, 128, 128, 128, 128, 128,
628 128, 128, 128, 128, 128, 128, 128, 128,
629 128, 128, 128, 128, 128, 128, 128, 128,
630 128, 128, 128, 128, 128, 128, 128, 128,
631 128, 128, 128, 128, 128, 128, 128, 128,
632 128, 128, 128, 128, 128, 128, 128, 128,
633 128, 128, 128, 128, 128, 128, 128, 128,
634 128, 128, 128, 128, 128, 128, 128, 128,
635 128, 128, 128, 128, 128, 128, 128, 128,
640 if (yych <= 0x00)
goto yy101;
641 if (yych >=
'\n')
goto yy97;
643 if (yych ==
'\r')
goto yy103;
644 if (yych >=
' ')
goto yy97;
648 if (yych ==
'$')
goto yy99;
650 if (yych <=
':')
goto yy97;
651 if (yych ==
'|')
goto yy97;
677 if ((yych = *p) <=
'/') {
679 if (yych ==
'\n')
goto yy115;
680 if (yych <= 0x1F)
goto yy104;
684 if (yych <=
'#')
goto yy104;
687 if (yych ==
'-')
goto yy110;
694 if (yych <=
'9')
goto yy110;
697 if (yych <=
'@')
goto yy104;
698 if (yych <=
'Z')
goto yy110;
703 if (yych <=
'_')
goto yy110;
706 if (yych <=
'z')
goto yy110;
707 if (yych <=
'{')
goto yy114;
721 return Error(
"unexpected EOF", err);
731 return Error(
"bad $-escape (literal $ must be written as $$)", err);
762 if (yybm[0+yych] & 32) {
769 if (yybm[0+yych] & 16) {
778 if (yybm[0+yych] & 32) {
781 if (yych ==
'}')
goto yy121;
794 if (yybm[0+yych] & 64) {
802 if (yybm[0+yych] & 128) {
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.