help-bison
[Top][All Lists]
Advanced

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

Re: Change to shift instead of reduce


From: Adam Smalin
Subject: Re: Change to shift instead of reduce
Date: Tue, 4 Jun 2013 05:04:25 -0400

Nevermind I figured that out


On Mon, Jun 3, 2013 at 4:01 PM, Adam Smalin <address@hidden> wrote:

> Could you give me a better example? I tried the below and neither helped.
> I got the error
>
> Ambiguity detected.
> Option 1,
>   mainLoop -> <Rule 5, tokens 1 .. 8>
>     mainLoop -> <Rule 5, tokens 1 .. 7>
>       mainLoop -> <Rule 5, tokens 1 .. 6>
>         mainLoop <tokens 1 .. 4>
>         mainElement -> <Rule 6, tokens 5 .. 6>
>           '$' <tokens 5 .. 5>
>           VarName <tokens 6 .. 6>
>       mainElement -> <Rule 7, tokens 7 .. 7>
>         mainElement2 -> <Rule 9, tokens 7 .. 7>
>           Token -> <Rule 10, tokens 7 .. 7>
>             '.' <tokens 7 .. 7>
>     mainElement -> <Rule 7, tokens 8 .. 8>
>       mainElement2 -> <Rule 8, tokens 8 .. 8>
>         VAR <tokens 8 .. 8>
>
> Option 2,
>   mainLoop -> <Rule 5, tokens 1 .. 8>
>     mainLoop <tokens 1 .. 4>
>     mainElement -> <Rule 6, tokens 5 .. 8>
>       '$' <tokens 5 .. 5>
>       VarName -> <Rule 12, tokens 6 .. 8>
>         VarName <tokens 6 .. 6>
>         '.' <tokens 7 .. 7>
>         VAR <tokens 8 .. 8>
>
> From both. Input is $a.b $a.b
>
> %%
> program: mEOS main
> main: | mainLoop mEOS
>
> mainLoop:
>       mainElement            %dprec 5
>     | mainLoop mainElement    %dprec 4
> mainElement:
>       %nonassoc '$' VarName    %dprec 6    { printf("varname\n"); }
>     | mainElement2  %dprec 1
> mainElement2:
>
>       VAR             %dprec 3    { printf("var\n"); }
>     | Token         %dprec 2    { printf("token\n"); }
>
> Token: '.'            %dprec 1
> VarName: VAR         %dprec 7
>     | VarName  '.' VAR %dprec 8
>
> EOS:   '\n' | ';'
> mEOS:       | mEOS EOS
>
> ------
>
> %right '$' '.'
> %%
> program: mEOS main
> main: | mainLoop mEOS
> mainLoop:
>       mainElement            %prec 5
>     | mainLoop mainElement    %prec 4
>
> mainElement:
>       '$' VarName    %dprec 6    { printf("varname\n"); }
>     | mainElement2  %dprec 1
> mainElement2:
>
>       VAR             %dprec 3    { printf("var\n"); }
>     | Token         %dprec 2    { printf("token\n"); }
>
> Token: '.'            %dprec 1
> VarName: VAR         %dprec 7
>     | VarName  '.' VAR %dprec 8
>
>
>
>
> On Mon, Jun 3, 2013 at 3:09 AM, Akim Demaille <address@hidden> wrote:
>
>>
>> Le 1 juin 2013 à 20:49, Adam Smalin <address@hidden> a écrit :
>>
>> > I have another thread but here is a simple version of my problem
>> >
>> > My text input is
>> > a.b c.d
>> > What I would like is
>> > varname varname
>> > My grammar is
>> > %glr-parser
>> > //...
>> > mainLoop:
>> >      mainElement            %dprec 5
>> >    | mainLoop mainElement    %dprec 4
>> > mainElement:
>> >      '$' VarName    %dprec 6    { printf("varname\n"); }
>> >    | VAR             %dprec 3    { printf("var\n"); }
>> >    | Token         %dprec 2    { printf("token\n"); }
>> >
>> > Token: '.'            %dprec 1
>> > VarName: VAR         %dprec 7
>> >    | VarName '.' VAR %dprec 8
>> >
>> > The conflict file shows
>> >    6 mainElement: '$' VarName .  [$end, VAR, '.', '$', '\n', ';']
>> >   11 VarName: VarName . '.' VAR
>> >
>> >    '.'  shift, and go to state 18
>> >
>> >    '.'       [reduce using rule 6 (mainElement)]
>> >    $default  reduce using rule 6 (mainElement)
>> >
>> > Now I see $default  reduce. I'd like it to shift. I threw in a bunch of
>> > precedence hoping something would trigger a shift instead of a reduce
>> but
>> > no. What can I do?
>>
>> You have a competition between r6, which wants to be reduced,
>> and token '.', which wants to be shifted.  r6 is "tagged" by
>> '$', its rightmost token (use %prec to use another associativity
>> / precedence carrier).  So you have a competition between "$" and ".".
>> To make the latter win, several choices:
>>
>> - use precedence (e.g., %nonassoc '$' %nonassoc '.')
>>
>> - use associativity (to promote shift, make it right
>>   associative: %right '$' '.').
>>
>> HTH.
>
>
>


reply via email to

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