[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/