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.