yylval undefined with flex and bison
Solution 1
In case it's of help to others, I found (OpenBSD lex v2.5.4 + yacc) that including
extern YYSTYPE yylval;
in my lex source was insufficient to prevent a 'yylval undefined' problem, even though the y.tab.c file contains:
#ifndef YYSTYPE
typedef int YYSTYPE;
#endif
I fixed this by putting an explicit definition in the lex source:
#define YYSTYPE int
extern YYSTYPE yyltype
However, I am unclear whether defining in this way will propagate to the locale of the yacc source file...
Solution 2
You should use %union. You do not need to typedef the union.
You use bison -d to get a header file with any declarations (such as types for terminals, nonterminals, and tokens). Example:
bison -d parser.y
Would yield two files, parser.tab.c and parser.tab.h. You can include the latter file into your lexer file, so it'll know about your %token
definitions. This file also includes the definition of yylval and its type.
You should not separate the union because you'll most likely expand it and need it for communicating between the lexer and parser.
chenrui
@meetup Senior Staff Software Engineer, @Homebrew maintainer, @kubernetes terraform @bazelbuild contributor Feel free to email me at rui#meetup.dev Or connect with me over https://www.linkedin.com/in/chenrui333/
Updated on July 20, 2022Comments
-
chenrui almost 2 years
I have searched almost every material online. But I am still confused why lexer cannot identify yylval.
Here is the case: I have defined a bunch of ADT in
node.h
and realize them innode.c
, my purpose is to generate a AST after these structures are properly stored. But I am stucked with bison file.First, I change
%union
tounion YYSTYPE {...};
andtypedef union YYSTYPE YYSTYPE;
, I don't why I need to do this, some other files posted online seems to work well with%uinion
.Then, I am stucked with
yylval
things. I have donebison -d
things, and checked it already inparser.c
(I have specified the bison output), so I thinkextern YYSTYPE yylval;
should work. But it doesn't. So I wonder if there is another way to solve yylval undeclared problem.I only use the two types of
YYSTYPE
struct,int
andchar *
, can I separate the unionYYSYTPE
and struct for the AST? This means, the nonterminals will have no associated types. Do you guys have any other ideas??