Simplify lexer significantly (remove all stateful lexing).
authorCarl Worth <cworth@cworth.org>
Wed, 12 May 2010 20:19:23 +0000 (13:19 -0700)
committerCarl Worth <cworth@cworth.org>
Wed, 12 May 2010 20:20:31 +0000 (13:20 -0700)
We are able to remove all state by simply passing NEWLINE through
as a token unconditionally (as opposed to only passing newline when
on a driective line as we did previously).

glcpp-lex.l
glcpp-parse.y

index 9ec4deb7185a30a38f4e8aa65d9283593a96ebaa..18d9050d7159151bc06460f400f11ccc29ab2fca 100644 (file)
@@ -32,9 +32,6 @@
 %option reentrant noyywrap
 %option extra-type="glcpp_parser_t *"
 
-%x ST_DEFINE
-%x ST_UNDEF
-
 SPACE          [[:space:]]
 NONSPACE       [^[:space:]]
 NEWLINE                [\n]
@@ -46,48 +43,28 @@ TOKEN               {NONSPACE}+
 %%
 
 {HASH}define{HSPACE}*  {
-       BEGIN ST_DEFINE;
        return DEFINE;
 }
 
-<ST_DEFINE>{IDENTIFIER}        {
-       yylval.str = xtalloc_strdup (yyextra, yytext);
-       return IDENTIFIER;
-}
-
-<ST_DEFINE>{TOKEN} {
-       yylval.str = xtalloc_strdup (yyextra, yytext);
-       return TOKEN;
-}
-
-<ST_DEFINE>\n {
-       BEGIN INITIAL;
-       return NEWLINE;
-}
-
-<ST_DEFINE>{SPACE}+
-
 {HASH}undef{HSPACE}*   {
-       BEGIN ST_UNDEF;
        return UNDEF;
 }
 
-<ST_UNDEF>{IDENTIFIER} {
+
+{IDENTIFIER}   {
        yylval.str = xtalloc_strdup (yyextra, yytext);
        return IDENTIFIER;
 }
 
-<ST_UNDEF>\n {
-       BEGIN INITIAL;
-       return NEWLINE;
-}
-
-<ST_UNDEF>{SPACE}+
-
-       /* Anything we don't specifically recognize is a stream of tokens */
-{NONSPACE}+ {
+{TOKEN} {
        yylval.str = xtalloc_strdup (yyextra, yytext);
        return TOKEN;
 }
 
+\n {
+       return NEWLINE;
+}
+
+{SPACE}+
+
 %%
index 29614fb1a4dbe51314db1673e34a41a80b65ba61..9883a6f9532b34b54c7c1442ef43076b2771d3ee 100644 (file)
@@ -74,11 +74,17 @@ content:
                talloc_free ($1);
        }
 |      directive_with_newline
+|      NEWLINE {
+               printf ("\n");
+       }
 |      content token {
                _print_resolved_token (parser, $2);
                talloc_free ($2);
        }
 |      content directive_with_newline
+|      content NEWLINE {
+               printf ("\n");
+       }
 ;
 
 directive_with_newline: