Re: Parsing a language with optional spaces

Akim Demaille <[email protected]>
Newsgroups gmane.comp.parsers.bison.general
Message-ID <[email protected]>

> Le 6 juil. 2020 à 22:01, Maury Markowitz <[email protected]> a écrit :
> 
>> On Jul 6, 2020, at 3:23 PM, Akim Demaille <[email protected]> wrote:
>> 
>> FOR/{sp}{id}{sp}={sp}{num}{sp}TO{sp}{num}  { printf("for: %s\n", yytext); }
> 
> This is a very different style than what I have seen in the past. In the past, most examples of flex tend to match against the tokens as individual items and return immediately so that bison can do the grammar check and generation. So in my existing (semi-working) .l, I followed this style and produced:
> 
>    FOR	{ return FOR; }
>    ...
>    TO	{ return TO; }
> 
> Then over in my .y I have:
> 
>    FOR variable '=' expression TO expression
> 
> Using your method, what would the associated bison look like? Just a single item matching the entire line?

I believe you need to read again the documentation of /

'r/s'
    an 'r' but only if it is followed by an 's'.  The text matched by
    's' is included when determining whether this rule is the longest
    match, but is then returned to the input before the action is
    executed.  So the action only sees the text matched by 'r'.  This
    type of pattern is called "trailing context".  (There are some
    combinations of 'r/s' that flex cannot match correctly.  *Note
    Limitations::, regarding dangerous trailing context.)

and to read carefully the examples I sent.

$ echo "FOREX=10TO20" | ./a.out
for: FOR
id: EX
=: =
num: 10
id: TO
num: 20

$ echo "FOREX=10" | ./a.out
id: FOREX
=: =
num: 10
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.