bug-bash
[Top][All Lists]
Advanced

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

Re: ./parse.y: warning: 1 shift/reduce conflict [-Wconflicts-sr]


From: Chet Ramey
Subject: Re: ./parse.y: warning: 1 shift/reduce conflict [-Wconflicts-sr]
Date: Wed, 27 Jun 2018 15:16:49 -0400
User-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:52.0) Gecko/20100101 Thunderbird/52.8.0

On 6/27/18 10:33 AM, Piotr Grzybowski wrote:
> 
> On 27 Jun 2018, at 14:57, Chet Ramey wrote:
> 
>> On 6/27/18 6:59 AM, Piotr Grzybowski wrote:
>>
>>> +function_newline_list: '(' ')' | function_newline_list '\n'
>>> +       ;
>>> +
>>
>> This would appear to allow constructs like
>>
>> foo()
>> () ()
>> {
>>      function body
>> }
> 
> only by the look of things ;-) (thats what I meant in P.S.) actually those 
> tokens are not allowed:
> 
> bash-5.0$ cat /tmp/m.sh
> foo()
> () ()
> {
>         function body
> }
> 
> bash-5.0$ . /tmp/m.sh
> bash: /tmp/m.sh: line 2: syntax error near unexpected token `)'
> bash: /tmp/m.sh: line 2: `() ()'
> 
>  I am sure function_newline_list can be rewritten in a better way though.

I don't really see the value. It doesn't solve any problems; it just lets
you feel better about the grammar. The shift-reduce behavior (shifting) is
what we want, anyway.

The problem is that the left paren is ambiguous given the syntax bash
supports (mostly for backwards compatibility).  If you've already read
`function name', and you read a left paren, you're stuck: you can shift
to `function name (' or reduce to `function name' and look to read a
subshell command. The only way to differentiate between the two requires
that you look ahead more than bison allows you.

That's why this gives a syntax error, and still does even after your
change:

function name ( echo subshell )

Technically we should support that, since we try to support the same
function body syntax for Posix and non-Posix function definitions, but the
grammar can't quite do it in its current form. The vast majority of the
time you're going to read a function definition `function name () compound-
command' anyway, and bison shifting gives you that.

-- 
``The lyf so short, the craft so long to lerne.'' - Chaucer
                 ``Ars longa, vita brevis'' - Hippocrates
Chet Ramey, UTech, CWRU    chet@case.edu    http://tiswww.cwru.edu/~chet/



reply via email to

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