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

ISO C grammar / hanging else / dual transformation

Hi All,

Attached is a grammar based on the ISO C standard. An AST version will follow in a few months when it has stabilized.

There are a couple of bugs in this grammar that I could use a hand with. The first is the classic hanging else problem (line 649):

/* 6.8.4 selection-statment */
selection_statement =
{if} kw_if tok_lpar expression tok_rpar statement |
{ifelse} kw_if tok_lpar expression tok_rpar statement kw_else
[other]:statement |

Is there a simple way to solve this in SableCC? My temporary solution is to require compound_statements for an ifelse production.

The second is a shift/reduce conflict that means I have had to remove the typedef_name (line 470) production. The problem is, the parser cannot distinguish between a typedef_name production (just an identifier) and a direct_declarator.identifier production (also just an identifier).

One last query: In the following grammar I am doing a dual transformation which seems to work fine.... except... I get the error that the last 'expression' must appear on the left hand side of the arrow. It IS on the left hand side of the arrow, but is referred to twice on the right hand side. The 'assignment_expression' is also in the same boat, however there is no error for it.

expression -> [long_list]:expression+ [single_list]:expression =
{no} assignment_expression
-> (assignment_expression.expression)
New expression.list((assignment_expression.expression)) |
{list} expression tok_comma assignment_expression
-> (expression.long_list assignment_expression.expression)
New expression.list
((assignment_expression.expression expression.long_list));

I have spent some time examining the source to discover why this is the case, but it is very difficult to follow due to the lack of comments! (I'll never stop complaining about this :) ... comments are more useful than actual source!)

Thanks all, it's great to see SableCC development so active!

Roger Keays
ninthave.net p: +61 7 3870 8494
Web Hosting m: +61 405 048 371
Web Design w: http://www.ninthave.net
Programming e: r.keays@ninthave.net
http://groups.ninthave.net Complete hosting solution for communities
http://billshare.ninthave.net The easy way to manage your bills!
http://pic.ninthave.net THE C compiler for PIC micros
http://clubs.sport.uq.edu.au/uqtrifit UQ Triathlon Club
http://groups.msn.com/SunshineCoastCycling Sunshine Coast Cycling Club
http://groups.ninthave.net/dance UQ Dance Club
http://www.cashflowclub.org.au UQ Cashflow Club
http://groups.msn.com/uQRomanceLanguagesClub UQ Romance Languages Club

Attachment: ISOC.grammar
Description: Binary data