summaryrefslogtreecommitdiffstats
path: root/parser.y
diff options
context:
space:
mode:
authorDamian Gryski <damian@gryski.com>2012-10-24 09:28:27 +0200
committerDamian Gryski <damian@gryski.com>2012-10-24 09:28:27 +0200
commite40778727b6bb0b9c714d0426abcdcd67896fc52 (patch)
tree989d63d0327aafe180f23cf8003f4670b2220f7c /parser.y
parent45b6fc81481677e3b3b716871f4f9fe3d311590e (diff)
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.
Diffstat (limited to 'parser.y')
-rw-r--r--parser.y36
1 files changed, 20 insertions, 16 deletions
diff --git a/parser.y b/parser.y
index b0e4e521..e2e591df 100644
--- 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();