glcpp: Build a reentrant parser.
authorKenneth Graunke <kenneth@whitecape.org>
Wed, 16 Jun 2010 23:26:28 +0000 (16:26 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Mon, 21 Jun 2010 18:31:55 +0000 (11:31 -0700)
glcpp/glcpp-lex.l
glcpp/glcpp-parse.y
glcpp/glcpp.h

index 933d9f449a6a6327ee178f68ee636364ae348a1c..06bde3f1957e003ca6c995dc63fdcc8d351db095 100644 (file)
@@ -29,7 +29,7 @@
 #include "glcpp-parse.h"
 %}
 
-%option reentrant noyywrap
+%option bison-bridge reentrant noyywrap
 %option extra-type="glcpp_parser_t *"
 %option prefix="glcpp_"
 
@@ -66,7 +66,7 @@ NON_STARS_THEN_STARS  [^*]*[*]+
        /* glcpp doesn't handle #extension, #version, or #pragma directives.
         * Simply pass them through to the main compiler's lexer/parser. */
 {HASH}(extension|version|pragma).*\n {
-       yylval.str = xtalloc_strdup (yyextra, yytext);
+       yylval->str = xtalloc_strdup (yyextra, yytext);
        return OTHER;
 }
 
@@ -130,17 +130,17 @@ NON_STARS_THEN_STARS      [^*]*[*]+
 }
 
 {DECIMAL_INTEGER} {
-       yylval.str = xtalloc_strdup (yyextra, yytext);
+       yylval->str = xtalloc_strdup (yyextra, yytext);
        return INTEGER_STRING;
 }
 
 {OCTAL_INTEGER} {
-       yylval.str = xtalloc_strdup (yyextra, yytext);
+       yylval->str = xtalloc_strdup (yyextra, yytext);
        return INTEGER_STRING;
 }
 
 {HEXADECIMAL_INTEGER} {
-       yylval.str = xtalloc_strdup (yyextra, yytext);
+       yylval->str = xtalloc_strdup (yyextra, yytext);
        return INTEGER_STRING;
 }
 
@@ -185,7 +185,7 @@ NON_STARS_THEN_STARS        [^*]*[*]+
 }
 
 {IDENTIFIER} {
-       yylval.str = xtalloc_strdup (yyextra, yytext);
+       yylval->str = xtalloc_strdup (yyextra, yytext);
        return IDENTIFIER;
 }
 
@@ -194,7 +194,7 @@ NON_STARS_THEN_STARS        [^*]*[*]+
 }
 
 {OTHER}+ {
-       yylval.str = xtalloc_strdup (yyextra, yytext);
+       yylval->str = xtalloc_strdup (yyextra, yytext);
        return OTHER;
 }
 
index fde9b92edecc3ce3f3603fabbf6ce47aebf02d97..8119de3aa5ca4557867df83084bea671013e939b 100644 (file)
@@ -133,13 +133,15 @@ _glcpp_parser_skip_stack_pop (glcpp_parser_t *parser);
 #define yylex glcpp_parser_lex
 
 static int
-glcpp_parser_lex (glcpp_parser_t *parser);
+glcpp_parser_lex (YYSTYPE *yylval, glcpp_parser_t *parser);
 
 static void
 glcpp_parser_lex_from (glcpp_parser_t *parser, token_list_t *list);
 
 %}
 
+%pure-parser
+
 %parse-param {glcpp_parser_t *parser}
 %lex-param {glcpp_parser_t *parser}
 
@@ -1449,13 +1451,13 @@ _define_function_macro (glcpp_parser_t *parser,
 }
 
 static int
-glcpp_parser_lex (glcpp_parser_t *parser)
+glcpp_parser_lex (YYSTYPE *yylval, glcpp_parser_t *parser)
 {
        token_node_t *node;
        int ret;
 
        if (parser->lex_from_list == NULL) {
-               ret = glcpp_lex (parser->scanner);
+               ret = glcpp_lex (yylval, parser->scanner);
 
                /* XXX: This ugly block of code exists for the sole
                 * purpose of converting a NEWLINE token into a SPACE
@@ -1501,7 +1503,7 @@ glcpp_parser_lex (glcpp_parser_t *parser)
                {
                        macro_t *macro;
                        macro = hash_table_find (parser->defines,
-                                                yylval.str);
+                                                yylval->str);
                        if (macro && macro->is_function) {
                                parser->newline_as_space = 1;
                                parser->paren_count = 0;
@@ -1519,7 +1521,7 @@ glcpp_parser_lex (glcpp_parser_t *parser)
                return NEWLINE;
        }
 
-       yylval = node->token->value;
+       *yylval = node->token->value;
        ret = node->token->type;
 
        parser->lex_from_node = node->next;
index 0d43f0b69e12e96e8f6369e8b76b2a9ee4aaa669..3441ab863275688683d342f487bff7e3d7dffcc1 100644 (file)
@@ -163,7 +163,7 @@ void
 glcpp_lex_set_source_string(glcpp_parser_t *parser, const char *shader);
 
 int
-glcpp_lex (yyscan_t scanner);
+glcpp_lex (YYSTYPE *lvalp, yyscan_t scanner);
 
 int
 glcpp_lex_destroy (yyscan_t scanner);