glcpp: Build a reentrant parser.
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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;
|
||||||
|
@@ -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);
|
||||||
|
Reference in New Issue
Block a user