Why do some versions of bison require {} here?

Philipp Klaus Krause <pkk@spth.de>
Tue, 1 Jan 2019 10:55:11 +0100

          From comp.compilers

Related articles
Why do some versions of bison require {} here? pkk@spth.de (Philipp Klaus Krause) (2019-01-01)
Re: Why do some versions of bison require {} here? 157-073-9834@kylheku.com (Kaz Kylheku) (2019-01-02)
Re: Why do some versions of bison require {} here? pkk@spth.de (Philipp Klaus Krause) (2019-01-03)
Re: Why do some versions of bison require {} here? 157-073-9834@kylheku.com (Kaz Kylheku) (2019-01-04)
| List of all articles for this month |

From: Philipp Klaus Krause <pkk@spth.de>
Newsgroups: comp.compilers
Date: Tue, 1 Jan 2019 10:55:11 +0100
Organization: solani.org
Injection-Info: gal.iecc.com; posting-host="news.iecc.com:2001:470:1f07:1126:0:676f:7373:6970"; logging-data="31599"; mail-complaints-to="abuse@iecc.com"
Keywords: yacc, question, comment
Posted-Date: 01 Jan 2019 12:16:08 EST
Content-Language: en-US

In SDCC.y, there are rules:


program
      : external_definition
      | program external_definition
      ;


external_definition
      : function_definition
                {
                    // blockNo = 0;
                }
      | declaration
                {
                    ignoreTypedefType = 0;
                    if ($1 && $1->type && IS_FUNC($1->type))
                        {
                            /* The only legal storage classes for
                              * a function prototype (declaration)
                              * are extern and static. extern is the
                              * default. Thus, if this function isn't
                              * explicitly marked static, mark it
                              * extern.
                              */
                            if ($1->etype && IS_SPEC($1->etype) && !SPEC_STAT($1->etype))
                                {
                                    SPEC_EXTR($1->etype) = 1;
                                }
                        }
                    addSymChain (&$1);
                    allocVariables ($1);
                    cleanUpLevel (SymbolTab, 1);
                }
      | addressmod
      ;


which has always worked for me without problems on all yacc / bison I
tried. But sporadically, users reported that this failed for them, and
they had to change the last two lines to:


      | addressmod
                {
                }
      ;


for their yacc / bison to accept the rule.
What is happening here? Why is the {} required? Why only on the last
rule, while the first one is okay?


Philipp
[Adding the empty action forces bison to reduce the rule rather than just
shifting and saving state for later. I couldn't guess why that would matter
in this case. Are there precedence rules? With your change does the grammar compile
cleanly or does it have conflicts? -John]


Post a followup to this message

Return to the comp.compilers page.
Search the comp.compilers archives again.