summaryrefslogtreecommitdiffstats
path: root/src/lexer.cc
diff options
context:
space:
mode:
authorEvan Jones <ej@evanjones.ca>2012-01-05 02:12:27 (GMT)
committerEvan Martin <martine@danga.com>2012-01-05 02:56:00 (GMT)
commit7311f3b583c739f862ae17c3925985ec3ea244f5 (patch)
treeb7fec70bee5e5416131145c46a7871be6eb1b519 /src/lexer.cc
parentff3e266da5430489c00b3b9b9a4eec930e54f402 (diff)
downloadNinja-7311f3b583c739f862ae17c3925985ec3ea244f5.zip
Ninja-7311f3b583c739f862ae17c3925985ec3ea244f5.tar.gz
Ninja-7311f3b583c739f862ae17c3925985ec3ea244f5.tar.bz2
Lexer: include leading whitespace in the comment token.
Indented comments are ignored rather than causing errors.
Diffstat (limited to 'src/lexer.cc')
-rw-r--r--src/lexer.cc116
1 files changed, 63 insertions, 53 deletions
diff --git a/src/lexer.cc b/src/lexer.cc
index 75b91e7..6bcdedc 100644
--- a/src/lexer.cc
+++ b/src/lexer.cc
@@ -104,39 +104,40 @@ Lexer::Token Lexer::ReadToken() {
{
char yych;
+ unsigned int yyaccept = 0;
static const unsigned char yybm[] = {
- 0, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 0, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 192, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 160, 160, 128,
- 160, 160, 160, 160, 160, 160, 160, 160,
- 160, 160, 128, 128, 128, 128, 128, 128,
- 128, 160, 160, 160, 160, 160, 160, 160,
- 160, 160, 160, 160, 160, 160, 160, 160,
- 160, 160, 160, 160, 160, 160, 160, 160,
- 160, 160, 160, 128, 128, 128, 128, 160,
- 128, 160, 160, 160, 160, 160, 160, 160,
- 160, 160, 160, 160, 160, 160, 160, 160,
- 160, 160, 160, 160, 160, 160, 160, 160,
- 160, 160, 160, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
- 128, 128, 128, 128, 128, 128, 128, 128,
+ 0, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 0, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 192, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 96, 96, 64,
+ 96, 96, 96, 96, 96, 96, 96, 96,
+ 96, 96, 64, 64, 64, 64, 64, 64,
+ 64, 96, 96, 96, 96, 96, 96, 96,
+ 96, 96, 96, 96, 96, 96, 96, 96,
+ 96, 96, 96, 96, 96, 96, 96, 96,
+ 96, 96, 96, 64, 64, 64, 64, 96,
+ 64, 96, 96, 96, 96, 96, 96, 96,
+ 96, 96, 96, 96, 96, 96, 96, 96,
+ 96, 96, 96, 96, 96, 96, 96, 96,
+ 96, 96, 96, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
+ 64, 64, 64, 64, 64, 64, 64, 64,
};
yych = *p;
@@ -144,11 +145,12 @@ Lexer::Token Lexer::ReadToken() {
if (yych <= ',') {
if (yych <= 0x1F) {
if (yych <= 0x00) goto yy21;
- if (yych == '\n') goto yy4;
+ if (yych == '\n') goto yy6;
goto yy23;
} else {
- if (yych <= ' ') goto yy6;
- if (yych != '#') goto yy23;
+ if (yych <= ' ') goto yy2;
+ if (yych == '#') goto yy4;
+ goto yy23;
}
} else {
if (yych <= ':') {
@@ -185,19 +187,21 @@ Lexer::Token Lexer::ReadToken() {
}
}
}
+yy2:
+ yyaccept = 0;
yych = *(q = ++p);
- if (yych >= 0x01) goto yy62;
+ goto yy65;
yy3:
- { token = ERROR; break; }
+ { token = INDENT; break; }
yy4:
- ++p;
- { token = NEWLINE; break; }
+ yyaccept = 1;
+ yych = *(q = ++p);
+ if (yych >= 0x01) goto yy60;
+yy5:
+ { token = ERROR; break; }
yy6:
++p;
- yych = *p;
- goto yy60;
-yy7:
- { token = INDENT; break; }
+ { token = NEWLINE; break; }
yy8:
++p;
if ((yych = *p) == 'u') goto yy54;
@@ -238,7 +242,7 @@ yy21:
{ token = TEOF; break; }
yy23:
yych = *++p;
- goto yy3;
+ goto yy5;
yy24:
++p;
yych = *p;
@@ -329,20 +333,26 @@ yy60:
if (yybm[0+yych] & 64) {
goto yy59;
}
- goto yy7;
-yy61:
+ if (yych >= 0x01) goto yy62;
+ p = q;
+ if (yyaccept <= 0) {
+ goto yy3;
+ } else {
+ goto yy5;
+ }
+yy62:
++p;
+ { continue; }
+yy64:
+ yyaccept = 0;
+ q = ++p;
yych = *p;
-yy62:
+yy65:
if (yybm[0+yych] & 128) {
- goto yy61;
+ goto yy64;
}
- if (yych >= 0x01) goto yy64;
- p = q;
+ if (yych == '#') goto yy59;
goto yy3;
-yy64:
- ++p;
- { continue; }
}
}