glcpp: Build a reentrant parser.

This commit is contained in:
Kenneth Graunke
2010-06-16 16:26:28 -07:00
parent b673ff91ab
commit e0e429fca3
3 changed files with 15 additions and 13 deletions

View File

@@ -29,7 +29,7 @@
#include "glcpp-parse.h" #include "glcpp-parse.h"
%} %}
%option reentrant noyywrap %option bison-bridge reentrant noyywrap
%option extra-type="glcpp_parser_t *" %option extra-type="glcpp_parser_t *"
%option prefix="glcpp_" %option prefix="glcpp_"
@@ -66,7 +66,7 @@ NON_STARS_THEN_STARS [^*]*[*]+
/* glcpp doesn't handle #extension, #version, or #pragma directives. /* glcpp doesn't handle #extension, #version, or #pragma directives.
* Simply pass them through to the main compiler's lexer/parser. */ * Simply pass them through to the main compiler's lexer/parser. */
{HASH}(extension|version|pragma).*\n { {HASH}(extension|version|pragma).*\n {
yylval.str = xtalloc_strdup (yyextra, yytext); yylval->str = xtalloc_strdup (yyextra, yytext);
return OTHER; return OTHER;
} }
@@ -130,17 +130,17 @@ NON_STARS_THEN_STARS [^*]*[*]+
} }
{DECIMAL_INTEGER} { {DECIMAL_INTEGER} {
yylval.str = xtalloc_strdup (yyextra, yytext); yylval->str = xtalloc_strdup (yyextra, yytext);
return INTEGER_STRING; return INTEGER_STRING;
} }
{OCTAL_INTEGER} { {OCTAL_INTEGER} {
yylval.str = xtalloc_strdup (yyextra, yytext); yylval->str = xtalloc_strdup (yyextra, yytext);
return INTEGER_STRING; return INTEGER_STRING;
} }
{HEXADECIMAL_INTEGER} { {HEXADECIMAL_INTEGER} {
yylval.str = xtalloc_strdup (yyextra, yytext); yylval->str = xtalloc_strdup (yyextra, yytext);
return INTEGER_STRING; return INTEGER_STRING;
} }
@@ -185,7 +185,7 @@ NON_STARS_THEN_STARS [^*]*[*]+
} }
{IDENTIFIER} { {IDENTIFIER} {
yylval.str = xtalloc_strdup (yyextra, yytext); yylval->str = xtalloc_strdup (yyextra, yytext);
return IDENTIFIER; return IDENTIFIER;
} }
@@ -194,7 +194,7 @@ NON_STARS_THEN_STARS [^*]*[*]+
} }
{OTHER}+ { {OTHER}+ {
yylval.str = xtalloc_strdup (yyextra, yytext); yylval->str = xtalloc_strdup (yyextra, yytext);
return OTHER; return OTHER;
} }

View File

@@ -133,13 +133,15 @@ _glcpp_parser_skip_stack_pop (glcpp_parser_t *parser);
#define yylex glcpp_parser_lex #define yylex glcpp_parser_lex
static int static int
glcpp_parser_lex (glcpp_parser_t *parser); glcpp_parser_lex (YYSTYPE *yylval, glcpp_parser_t *parser);
static void static void
glcpp_parser_lex_from (glcpp_parser_t *parser, token_list_t *list); glcpp_parser_lex_from (glcpp_parser_t *parser, token_list_t *list);
%} %}
%pure-parser
%parse-param {glcpp_parser_t *parser} %parse-param {glcpp_parser_t *parser}
%lex-param {glcpp_parser_t *parser} %lex-param {glcpp_parser_t *parser}
@@ -1449,13 +1451,13 @@ _define_function_macro (glcpp_parser_t *parser,
} }
static int static int
glcpp_parser_lex (glcpp_parser_t *parser) glcpp_parser_lex (YYSTYPE *yylval, glcpp_parser_t *parser)
{ {
token_node_t *node; token_node_t *node;
int ret; int ret;
if (parser->lex_from_list == NULL) { 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 /* XXX: This ugly block of code exists for the sole
* purpose of converting a NEWLINE token into a SPACE * purpose of converting a NEWLINE token into a SPACE
@@ -1501,7 +1503,7 @@ glcpp_parser_lex (glcpp_parser_t *parser)
{ {
macro_t *macro; macro_t *macro;
macro = hash_table_find (parser->defines, macro = hash_table_find (parser->defines,
yylval.str); yylval->str);
if (macro && macro->is_function) { if (macro && macro->is_function) {
parser->newline_as_space = 1; parser->newline_as_space = 1;
parser->paren_count = 0; parser->paren_count = 0;
@@ -1519,7 +1521,7 @@ glcpp_parser_lex (glcpp_parser_t *parser)
return NEWLINE; return NEWLINE;
} }
yylval = node->token->value; *yylval = node->token->value;
ret = node->token->type; ret = node->token->type;
parser->lex_from_node = node->next; parser->lex_from_node = node->next;

View File

@@ -163,7 +163,7 @@ void
glcpp_lex_set_source_string(glcpp_parser_t *parser, const char *shader); glcpp_lex_set_source_string(glcpp_parser_t *parser, const char *shader);
int int
glcpp_lex (yyscan_t scanner); glcpp_lex (YYSTYPE *lvalp, yyscan_t scanner);
int int
glcpp_lex_destroy (yyscan_t scanner); glcpp_lex_destroy (yyscan_t scanner);