]> granicus.if.org Git - jq/commitdiff
Replace yyscan_t with another pointer type that we control.
authorDamian Gryski <damian@gryski.com>
Wed, 24 Oct 2012 07:28:27 +0000 (09:28 +0200)
committerDamian Gryski <damian@gryski.com>
Wed, 24 Oct 2012 07:28:27 +0000 (09:28 +0200)
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
parser.y

diff --git a/lexer.l b/lexer.l
index 5c6b62f4190ed16620203aadf36922d02646d5e5..e0bb2b7b6fee54e560d05e0d1f47292b345548ce 100644 (file)
--- 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                           \
index b0e4e5211655972322b7311dc95f98fbbebf619a..e2e591df4ba69adb370c3eb2e26f3e336276c5a5 100644 (file)
--- a/parser.y
+++ b/parser.y
@@ -3,7 +3,7 @@
 #include <string.h>
 #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 <blk> 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();