bison-patches
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: push parser


From: Paul Eggert
Subject: Re: push parser
Date: Sat, 16 Sep 2006 16:03:35 -0700
User-agent: Gnus/5.1008 (Gnus v5.10.8) Emacs/21.4 (gnu/linux)

Bob Rossi <address@hidden> writes:

> Hi,
>
> The user interface to the push parser currently looks like this:
>
> int
> yyparse (void)
> {
>   struct yypvars *ctx = yypvarsinit ();
>   int status;
>   do {
>     yychar_set (ctx, yylex ());
>     yylval_set (ctx, yylval);
> #ifdef YYLTYPE_IS_TRIVIAL
>     yylloc_set (ctx, yylloc);
> #endif
>     yypushparse (ctx);
>     status = yyresult_get (ctx);
>   } while (status == 4);
>   free (ctx);
>   return status;
> }
>
> In particular, I don't like this line:
>   } while (status == 4);
>
> The number 4 should be put in either a #define, or a function call.
> Which one is preferable? The #define would probably be more efficient.
> If so, what would be a good name?

I'm not quite sure what 4 means, but how about YYPUSH_MORE?  It could
be defined in the equivalent of y.tab.h.

Why the #ifdef on YYLTYPE_IS_TRIVIAL?  YYLTYPE_IS_TRIVIAL tells
us whether yyltype is trivial (i.e., does not need attention by
C++ storage managers), not whether it exists.

Looking at the interface, it strikes me that perhaps we could
simplify it a bit.  How about something like this?

   int
   yyparse (void)
   {
     struct yypvars *ctx = yypvarsinit ();
     int status;
     do {
       int ch = yylex ();
       status = yypushparse (ctx, ch, yylval, yylloc);
     } while (status == YYPUSH_MORE);
     free (ctx);
     return status;
   }

where you omit the ", yylloc" if you are not using locations.




reply via email to

[Prev in Thread] Current Thread [Next in Thread]