[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
C++ pure lexer/parser
From: |
Hans Aberg |
Subject: |
C++ pure lexer/parser |
Date: |
Sun, 13 Jan 2002 13:24:16 +0100 |
I made a simple pure C++ Flex lexer/Bison parser combination. The tweaks
are relatively simple, so I think I should report them. I would be great if
there is support for a fullely pure C++ parser.
First, I use a compile style where the Flex lex.my.cc and the Bison
my.tab.cc sources are compiled indpendently, by using the my.tab.h header.
I write a special my.h header, defining types, etc. for use in the
lexer/parser.
A problem with using Bison's %pure_parser and Flex's C++ class is that the
latter is only accepting yylex() empty arguments. So in order to get around
that, I altered FlexLexer.h to
class FlexLexer {
public:
...
virtual int yylex(YYLEX_ARG) = 0;
...
};
and similarly for class yyFlexLexer, so that one can alter the arguments.
Then, in my.h, I put
#include "pg_parser.tab.h"
#define YYLEX_ARG YYSTYPE& yylval, YYLTYPE& yylloc
#define YY_DECL int yyFlexLexer::yylex(YYLEX_ARG)
#define yyFlexLexer pg_parserFlexLexer
#include "FlexLexer.h"
If the idea is to use also say Bison's %locations. I also changed the Bison
skeleton file, os that under C++, one uses references:
#if YYPURE
# if YYLSP_NEEDED
# ifdef YYLEX_PARAM
# define YYLEX yylex (yylval, yylloc, YYLEX_PARAM)
# else
# define YYLEX yylex (yylval, yylloc)
# endif
# else /* !YYLSP_NEEDED */
# ifdef YYLEX_PARAM
# define YYLEX yylex (yylval, YYLEX_PARAM)
# else
# define YYLEX yylex (yylval)
# endif
# endif /* !YYLSP_NEEDED */
#else /* !YYPURE */
# define YYLEX yylex ()
#endif /* !YYPURE */
I also zip out #include <FlexLexer.h> from the Folex skelton file, as it
now is included from my.h.
Then that is pretty much it: my.l and my.y need to #include "pg_parser.h".
Also, my.y currenlty has global:
FlexLexer* mylexer;
inline int yylex(YYSTYPE& x, YYLTYPE& y) { return mylexer->yylex(x, y); }
with mylexer created dynamically, clearly an impurity.
Hans Aberg
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- C++ pure lexer/parser,
Hans Aberg <=