Martin Mares <m...@ucw.cz> wrote on 2010/04/29 17:57:44:
>
> Hello!
>
> > Right, neither is an ideal fix but at least mine is "correct" and doesn't
> > cause REJECT to be defined inside flex, causing warnings.
> >
> > I don't understand your reasoning, you rather keep the buggy REJECT
> > instead of renaming the bison token REJECT to Reject because it
> > doesn't look as "pretty" anymore?
>
> Why exactly do you consider the REJECT buggy? Does the documentation of flex
> forbid redefinition of REJECT?

>From info flex:
There are a number of special directives which can be included
within an action:

`ECHO'
     copies yytext to the scanner's output.

`BEGIN'
     followed by the name of a start condition places the scanner in the
     corresponding start condition (see below).

`REJECT'
     directs the scanner to proceed on to the "second best" rule which
     matched the input (or a prefix of the input).  The rule is chosen
     as described above in *Note Matching::, and `yytext' and `yyleng'
     set up appropriately.  It may either be one which matched as much
     text as the originally chosen rule but came later in the `flex'
     input file, or one which matched less text.  For example, the
     following will both count the words in the input and call the
     routine `special()' whenever `frob' is seen:

                      int word_count = 0;
              %%

              frob        special(); REJECT;
              [^ \t\n]+   ++word_count;

     Without the `REJECT', any occurrences of `frob' in the input would
     not be counted as words, since the scanner normally executes only
     one action per token.  Multiple uses of `REJECT' are allowed, each
     one finding the next best choice to the currently active rule.  For
     example, when the following scanner scans the token `abcd', it will
     write `abcdabcaba' to the output:
....

`flex' scans your rule actions to determine whether you use the
`REJECT' or `yymore()' features.  The `REJECT' and `yymore' options are
available to override its decision as to whether you use the options,
either by setting them (e.g., `%option reject)' to indicate the feature
is indeed used, or unsetting them to indicate it actually is not used
(e.g., `%option noyymore)'.

Another indication is:
 flex  -s -Cf -B -8 -ocf-lex.c -Pcf_ cf-lex.l
 flex: REJECT cannot be used with -f or -F
 make: *** [cf-lex.c] Error 1

You can't use -Cf because flex think you are using REJECT in your
scanner.

>
> Sure, it is not elegant and it might cause bugs in the future (currently, I do
> not see any real bug), but your rename is not elegant either.

No, but it is the equivalent of renaming a variable from an ideal name
to a less ideal name, not a big deal.

Reply via email to