From e40778727b6bb0b9c714d0426abcdcd67896fc52 Mon Sep 17 00:00:00 2001 From: Damian Gryski Date: Wed, 24 Oct 2012 09:28:27 +0200 Subject: [PATCH] Replace yyscan_t with another pointer type that we control. This prevents the circuluar dependency between parser.gen.h and lexer.gen.h. Newer versions of bison add a prototype for yyparse() to parser.gen.h that include the as-yet-undeclared yyscan_t type. --- lexer.l | 3 +++ parser.y | 36 ++++++++++++++++++++---------------- 2 files changed, 23 insertions(+), 16 deletions(-) diff --git a/lexer.l b/lexer.l index 5c6b62f4..e0bb2b7b 100644 --- a/lexer.l +++ b/lexer.l @@ -1,5 +1,8 @@ %{ #include "compile.h" + +struct lexer_param; + #include "parser.gen.h" /* Generated by bison. */ #define YY_USER_ACTION \ diff --git a/parser.y b/parser.y index b0e4e521..e2e591df 100644 --- a/parser.y +++ b/parser.y @@ -3,7 +3,7 @@ #include #include "compile.h" -typedef void* yyscan_t; +struct lexer_param; %} %code requires { @@ -35,11 +35,11 @@ typedef void* yyscan_t; %parse-param {block* answer} %parse-param {int* errors} %parse-param {struct locfile* locations} -%parse-param {yyscan_t lexer} +%parse-param {struct lexer_param* lexer_param_ptr} %lex-param {block* answer} %lex-param {int* errors} %lex-param {struct locfile* locations} -%lex-param {yyscan_t lexer} +%lex-param {struct lexer_param* lexer_param_ptr} %token INVALID_CHARACTER @@ -88,21 +88,25 @@ typedef void* yyscan_t; %type Exp Term MkDict MkDictPair ExpD ElseBody QQString FuncDef FuncDefs String %{ #include "lexer.gen.h" -#define FAIL(loc, msg) \ - do { \ - location l = loc; \ - yyerror(&l, answer, errors, locations, lexer, msg); \ - /*YYERROR*/; \ +struct lexer_param { + yyscan_t lexer; +}; +#define FAIL(loc, msg) \ + do { \ + location l = loc; \ + yyerror(&l, answer, errors, locations, lexer_param_ptr, msg); \ + /*YYERROR*/; \ } while (0) void yyerror(YYLTYPE* loc, block* answer, int* errors, - struct locfile* locations, yyscan_t lexer, const char *s){ + struct locfile* locations, struct lexer_param* lexer_param_ptr, const char *s){ (*errors)++; locfile_locate(locations, *loc, "error: %s", s); } int yylex(YYSTYPE* yylval, YYLTYPE* yylloc, block* answer, int* errors, - struct locfile* locations, yyscan_t lexer) { + struct locfile* locations, struct lexer_param* lexer_param_ptr) { + yyscan_t lexer = lexer_param_ptr->lexer; while (1) { int tok = jq_yylex(yylval, yylloc, lexer); if (tok == INVALID_CHARACTER) { @@ -444,15 +448,15 @@ MkDictPair %% int jq_parse(struct locfile* locations, block* answer) { - yyscan_t scanner; + struct lexer_param scanner; YY_BUFFER_STATE buf; - jq_yylex_init_extra(0, &scanner); - buf = jq_yy_scan_bytes(locations->data, locations->length, scanner); + jq_yylex_init_extra(0, &scanner.lexer); + buf = jq_yy_scan_bytes(locations->data, locations->length, scanner.lexer); int errors = 0; *answer = gen_noop(); - yyparse(answer, &errors, locations, scanner); - jq_yy_delete_buffer(buf, scanner); - jq_yylex_destroy(scanner); + yyparse(answer, &errors, locations, &scanner); + jq_yy_delete_buffer(buf, scanner.lexer); + jq_yylex_destroy(scanner.lexer); if (errors > 0) { block_free(*answer); *answer = gen_noop();