Add a wrapper function around the lexer.
authorCarl Worth <cworth@cworth.org>
Wed, 19 May 2010 17:01:29 +0000 (10:01 -0700)
committerCarl Worth <cworth@cworth.org>
Wed, 19 May 2010 17:01:29 +0000 (10:01 -0700)
We rename the generated lexer from yylex to glcpp_lex. Then we
implement our own yylex function in glcpp-parse.y that calls
glcpp_lex. This doesn't change the behavior at all yet, but gives us a
place where we can do implement alternate lexing in the future.

(We want this because instead of re-lexing from strings for macro
expansion, we want to lex from pre-parsed token lists. We need this so
that when we terminate recursion due to an already active macro
expansion, we can ensure that that symbol never gets expanded again
later.)

Makefile
glcpp-parse.y
glcpp.h

index 3fa863c49b9575cd1cb5abbff92ba535702133db..88116128f8596d43c498af3073b449dbb7144df0 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -13,7 +13,7 @@ glcpp: glcpp.o glcpp-lex.o glcpp-parse.o hash_table.o xtalloc.o
        bison --debug --defines=$*.h --output=$*.c $^
 
 %.c: %.l
-       flex --outfile=$@ $<
+       flex --prefix=glcpp_ --outfile=$@ $<
 
 glcpp-lex.c: glcpp-parse.h
 
index 647532f209dc8eecd099072a02520ff36a055bbe..6ef1cae0eca068fb8f1b28634dc4b9f98106e7bc 100644 (file)
@@ -82,6 +82,9 @@ _argument_list_length (argument_list_t *list);
 string_list_t *
 _argument_list_member_at (argument_list_t *list, int index);
 
+static int
+yylex (yyscan_t scanner);
+
 %}
 
 %union {
@@ -405,7 +408,7 @@ glcpp_parser_create (void)
 
        parser = xtalloc (NULL, glcpp_parser_t);
 
-       yylex_init_extra (parser, &parser->scanner);
+       glcpp_lex_init_extra (parser, &parser->scanner);
        parser->defines = hash_table_ctor (32, hash_table_string_hash,
                                           hash_table_string_compare);
        parser->expansions = NULL;
@@ -426,7 +429,7 @@ glcpp_parser_parse (glcpp_parser_t *parser)
 void
 glcpp_parser_destroy (glcpp_parser_t *parser)
 {
-       yylex_destroy (parser->scanner);
+       glcpp_lex_destroy (parser->scanner);
        hash_table_dtor (parser->defines);
        talloc_free (parser);
 }
@@ -642,3 +645,9 @@ _expand_function_macro (glcpp_parser_t *parser,
 
        glcpp_parser_push_expansion_macro (parser, macro, arguments);
 }
+
+static int
+yylex (yyscan_t scanner)
+{
+       return glcpp_lex (scanner);
+}
diff --git a/glcpp.h b/glcpp.h
index 81f7d14c5baf19f43e0e9971ae8e62fda48e339e..6aabf6f18238ba2e1b7c882fa3b20fc97d22ec94 100644 (file)
--- a/glcpp.h
+++ b/glcpp.h
@@ -128,13 +128,13 @@ glcpp_parser_pop_expansion (glcpp_parser_t *parser);
 /* Generated by glcpp-lex.l to glcpp-lex.c */
 
 int
-yylex_init_extra (glcpp_parser_t *parser, yyscan_t* scanner);
+glcpp_lex_init_extra (glcpp_parser_t *parser, yyscan_t* scanner);
 
 int
-yylex (yyscan_t scanner);
+glcpp_lex (yyscan_t scanner);
 
 int
-yylex_destroy (yyscan_t scanner);
+glcpp_lex_destroy (yyscan_t scanner);
 
 /* Generated by glcpp-parse.y to glcpp-parse.c */