Make the lexer reentrant (to avoid "still reachable" memory).

This allows the final program to be 100% "valgrind clean", (freeing
all memory that it allocates). This will make it much easier to ensure
that any allocation that parser actions perform are also cleaned up.
This commit is contained in:
Carl Worth
2010-05-10 11:52:29 -07:00
parent 3a37b8701c
commit 38aa83560b
3 changed files with 14 additions and 4 deletions

View File

@@ -28,7 +28,7 @@
#include "glcpp-parse.h" #include "glcpp-parse.h"
%} %}
%option noyywrap %option reentrant noyywrap
%% %%

View File

@@ -28,10 +28,13 @@
#define YYSTYPE int #define YYSTYPE int
void void
yyerror (const char *error); yyerror (const char *error, void *scanner);
%} %}
%parse-param {void *scanner}
%lex-param {void *scanner}
%token TOKEN %token TOKEN
%% %%
@@ -51,7 +54,7 @@ token: TOKEN
%% %%
void void
yyerror (const char *error) yyerror (const char *error, void *scanner)
{ {
fprintf (stderr, "Parse error: %s\n", error); fprintf (stderr, "Parse error: %s\n", error);
} }

View File

@@ -24,5 +24,12 @@
int int
main (void) main (void)
{ {
return yyparse (); int ret;
void *scanner;
yylex_init (&scanner);
ret = yyparse (scanner);
yylex_destroy (scanner);
return ret;
} }