Related articles |
---|
Reentrant Flex and Bison etetz@my-deja.com (2000-06-03) |
Re: Reentrant Flex and Bison rhyde@shoe-size.com (Randall Hyde) (2000-06-06) |
Reentrant Flex and Bison richard.lanyon@wadham.oxford.ac.uk (1999-11-16) |
Re: Reentrant Flex and Bison perkens@sdm.de (Burkhard Perkens-Golomb) (1999-12-07) |
From: | Burkhard Perkens-Golomb <perkens@sdm.de> |
Newsgroups: | comp.compilers |
Date: | 7 Dec 1999 00:37:12 -0500 |
Organization: | sd&m AG, Muenchen, Germany |
References: | 99-11-087 |
Keywords: | lex, yacc, practice |
Our workaround (don't want to call it a solution):
File Lexer.h:
// Declaration of the lexer class
class LexerClass : public yyFlexLexer {
[...]
private:
// A pointer to the union that holds the associated value to
// the returned token
char** lexerlval;
// The method flex generates
yylex ();
// The method the bison parser expects: 1. variante
yylex (void* lvalp) {
lexerlval = &((static_cast<YYSTYPE*>(lvalp)));
return yylex();
}
// The method the bison parser expects: 2. variante
yylex (YYSTYPE* lvalp) {
lexerlval = &lvalp;
return yylex();
}
}
File lexer.l:
// a rule:
{match_anything} { lexerlval* =3D strdup(YYText()); return ANYTOKEN; }
Of course you can have more than "char*" for the associated
values. And you can let bison generate two kinds of yylex:
yylex(void*) or yylex(YYSTYPE*). In the latter case you don't need the
static_cast.
Burkhard
richard.lanyon@wadham.oxford.ac.uk (Richard Lanyon) writes:
> I'm trying to get a lexer + parser combination going using flex and bison.
> The problem is that I seem to have to declare yylex (as int yylex()) in
> the C declarations section of the bison grammar file.
> This wouldn't necessarily be a problem (except that I'm sure I shouldn't
> /have/ to) except that if I then want to make a re-entrant (aka "pure")
> parser, yylex needs to be declared as
> int yylex(YYSTYPE *lvalp)
> and YYSTYPE isn't defined in the C declarations section of the Bison
> grammar file - it only comes into being in the Bison declaration section.
Return to the
comp.compilers page.
Search the
comp.compilers archives again.