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,
169 if (yych <= 0x00)
goto yy22;
170 if (yych ==
'\n')
goto yy6;
173 if (yych <=
' ')
goto yy2;
174 if (yych ==
'#')
goto yy4;
179 if (yych ==
'/')
goto yy24;
180 if (yych <=
'9')
goto yy21;
184 if (yych <=
'<')
goto yy24;
187 if (yych <=
'@')
goto yy24;
188 if (yych <=
'Z')
goto yy21;
196 if (yych ==
'`')
goto yy24;
197 if (yych <=
'a')
goto yy21;
200 if (yych ==
'd')
goto yy12;
201 if (yych <=
'h')
goto yy21;
206 if (yych ==
'p')
goto yy10;
207 if (yych <=
'q')
goto yy21;
211 if (yych <=
's')
goto yy20;
214 if (yych ==
'|')
goto yy17;
225 { token =
INDENT;
break; }
229 if (yych <= 0x00)
goto yy5;
230 if (yych !=
'\r')
goto yy65;
232 { token =
ERROR;
break; }
239 if ((yych = *p) ==
'u')
goto yy59;
242 { token =
IDENT;
break; }
245 if (yych ==
'o')
goto yy55;
249 if (yych ==
'u')
goto yy51;
253 if (yych ==
'e')
goto yy44;
257 { token =
EQUALS;
break; }
260 { token =
COLON;
break; }
263 if ((yych = *p) ==
'|')
goto yy42;
264 { token =
PIPE;
break; }
267 if (yych ==
'n')
goto yy35;
271 if (yych ==
'u')
goto yy27;
278 { token =
TEOF;
break; }
286 if (yybm[0+yych] & 32) {
292 if (yych !=
'b')
goto yy26;
294 if (yych !=
'n')
goto yy26;
296 if (yych !=
'i')
goto yy26;
298 if (yych !=
'n')
goto yy26;
300 if (yych !=
'j')
goto yy26;
302 if (yych !=
'a')
goto yy26;
304 if (yybm[0+(yych = *p)] & 32) {
310 if (yych !=
'c')
goto yy26;
312 if (yych !=
'l')
goto yy26;
314 if (yych !=
'u')
goto yy26;
316 if (yych !=
'd')
goto yy26;
318 if (yych !=
'e')
goto yy26;
320 if (yybm[0+(yych = *p)] & 32) {
326 { token =
PIPE2;
break; }
329 if (yych !=
'f')
goto yy26;
331 if (yych !=
'a')
goto yy26;
333 if (yych !=
'u')
goto yy26;
335 if (yych !=
'l')
goto yy26;
337 if (yych !=
't')
goto yy26;
339 if (yybm[0+(yych = *p)] & 32) {
345 if (yych !=
'l')
goto yy26;
347 if (yych !=
'e')
goto yy26;
349 if (yybm[0+(yych = *p)] & 32) {
352 { token =
RULE;
break; }
355 if (yych !=
'o')
goto yy26;
357 if (yych !=
'l')
goto yy26;
359 if (yybm[0+(yych = *p)] & 32) {
362 { token =
POOL;
break; }
365 if (yych !=
'i')
goto yy26;
367 if (yych !=
'l')
goto yy26;
369 if (yych !=
'd')
goto yy26;
371 if (yybm[0+(yych = *p)] & 32) {
374 { token =
BUILD;
break; }
379 if (yybm[0+yych] & 64) {
382 if (yych <= 0x00)
goto yy66;
383 if (yych <=
'\f')
goto yy67;
399 if (yybm[0+yych] & 128) {
402 if (yych ==
'\n')
goto yy71;
403 if (yych ==
'#')
goto yy64;
429 const char* p =
ofs_;
435 static const unsigned char yybm[] = {
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 0, 0, 0, 0, 0, 0, 0, 0,
440 128, 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,
467 0, 0, 0, 0, 0, 0, 0, 0,
471 if (yych <= 0x00)
goto yy78;
472 if (yych <= 0x1F)
goto yy80;
474 if (yych ==
'$')
goto yy76;
484 if ((yych = *p) ==
'\n')
goto yy81;
500 if (yybm[0+yych] & 128) {
510 const char* p =
ofs_;
512 const char* start = p;
516 static const unsigned char yybm[] = {
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, 0, 0, 0,
522 0, 0, 0, 0, 0, 128, 128, 0,
523 128, 128, 128, 128, 128, 128, 128, 128,
524 128, 128, 0, 0, 0, 0, 0, 0,
525 0, 128, 128, 128, 128, 128, 128, 128,
526 128, 128, 128, 128, 128, 128, 128, 128,
527 128, 128, 128, 128, 128, 128, 128, 128,
528 128, 128, 128, 0, 0, 0, 0, 128,
529 0, 128, 128, 128, 128, 128, 128, 128,
530 128, 128, 128, 128, 128, 128, 128, 128,
531 128, 128, 128, 128, 128, 128, 128, 128,
532 128, 128, 128, 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,
548 0, 0, 0, 0, 0, 0, 0, 0,
553 if (yych <=
',')
goto yy89;
555 if (yych <=
'/')
goto yy89;
556 if (yych >=
':')
goto yy89;
560 if (yych <=
'Z')
goto yy87;
561 if (yych <=
'^')
goto yy89;
563 if (yych <=
'`')
goto yy89;
564 if (yych >=
'{')
goto yy89;
573 out->assign(start, p - start);
583 if (yybm[0+yych] & 128) {
596 const char* p =
ofs_;
604 static const unsigned char yybm[] = {
605 0, 128, 128, 128, 128, 128, 128, 128,
606 128, 128, 0, 128, 128, 0, 128, 128,
607 128, 128, 128, 128, 128, 128, 128, 128,
608 128, 128, 128, 128, 128, 128, 128, 128,
609 16, 128, 128, 128, 0, 128, 128, 128,
610 128, 128, 128, 128, 128, 224, 160, 128,
611 224, 224, 224, 224, 224, 224, 224, 224,
612 224, 224, 0, 128, 128, 128, 128, 128,
613 128, 224, 224, 224, 224, 224, 224, 224,
614 224, 224, 224, 224, 224, 224, 224, 224,
615 224, 224, 224, 224, 224, 224, 224, 224,
616 224, 224, 224, 128, 128, 128, 128, 224,
617 128, 224, 224, 224, 224, 224, 224, 224,
618 224, 224, 224, 224, 224, 224, 224, 224,
619 224, 224, 224, 224, 224, 224, 224, 224,
620 224, 224, 224, 128, 0, 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,
636 128, 128, 128, 128, 128, 128, 128, 128,
641 if (yych <= 0x00)
goto yy101;
642 if (yych >=
'\n')
goto yy97;
644 if (yych ==
'\r')
goto yy103;
645 if (yych >=
' ')
goto yy97;
649 if (yych ==
'$')
goto yy99;
651 if (yych <=
':')
goto yy97;
652 if (yych ==
'|')
goto yy97;
678 if ((yych = *p) <=
'/') {
680 if (yych ==
'\n')
goto yy115;
681 if (yych <= 0x1F)
goto yy104;
685 if (yych <=
'#')
goto yy104;
688 if (yych ==
'-')
goto yy110;
695 if (yych <=
'9')
goto yy110;
698 if (yych <=
'@')
goto yy104;
699 if (yych <=
'Z')
goto yy110;
704 if (yych <=
'_')
goto yy110;
707 if (yych <=
'z')
goto yy110;
708 if (yych <=
'{')
goto yy114;
722 return Error(
"unexpected EOF", err);
732 return Error(
"bad $-escape (literal $ must be written as $$)", err);
763 if (yybm[0+yych] & 32) {
770 if (yybm[0+yych] & 16) {
779 if (yybm[0+yych] & 32) {
782 if (yych ==
'}')
goto yy121;
795 if (yybm[0+yych] & 64) {
803 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.