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) |
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]
Return to the
comp.compilers page.
Search the
comp.compilers archives again.