[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: how to resolve if/elseif/else ambiguity?
From: |
SirZooro |
Subject: |
Re: how to resolve if/elseif/else ambiguity? |
Date: |
Wed, 13 Jun 2007 15:30:53 -0700 (PDT) |
I have performed some additional analysis and found that conflicting rule was
incorrectly created. Therefore closed_else rules should look as following:
[code]
closed_else: ELSE closed_stmt
| ELSEIF '(' expr ')' closed_stmt closed_else
;
[/code]
Daniel
SirZooro wrote:
>
> I am trying to create grammar which has if/elseif/else instruction.
> However I am unable to get rid of shift/reduce conflicts. I found
> http://www.parsifalsoft.com/ifelse.html page which helped me a bit, but
> still I have problems. My grammar is as follow:
> [code]
> %token IF ELSE ELSEIF FOR NUMBER STMT '(' ')';
> %%
> prog : stmt;
>
> expr: NUMBER;
>
> stmt: open_stmt
> | closed_stmt;
>
> open_stmt: IF '(' expr ')' stmt
> | IF '(' expr ')' closed_stmt open_else
> | FOR '(' expr ')' open_stmt;
>
> closed_stmt: STMT
> | IF '(' expr ')' closed_stmt closed_else
> | FOR '(' expr ')' closed_stmt;
>
> open_else: ELSE open_stmt
> | ELSEIF '(' expr ')' open_stmt
> | ELSEIF '(' expr ')' closed_stmt open_else;
>
> closed_else: ELSE closed_stmt
> | ELSEIF '(' expr ')' closed_stmt
> | ELSEIF '(' expr ')' closed_stmt closed_else;
> [/code]
>
> Bison reports following problem:
> [code]
> state 30
>
> 11 open_else: . ELSE open_stmt
> 12 | . ELSEIF '(' expr ')' open_stmt
> 13 | . ELSEIF '(' expr ')' closed_stmt open_else
> 13 | ELSEIF '(' expr ')' closed_stmt . open_else
> 14 closed_else: . ELSE closed_stmt
> 15 | . ELSEIF '(' expr ')' closed_stmt [$end, ELSE, ELSEIF]
> 15 | ELSEIF '(' expr ')' closed_stmt . [$end, ELSE, ELSEIF]
> 16 | . ELSEIF '(' expr ')' closed_stmt closed_else
> 16 | ELSEIF '(' expr ')' closed_stmt . closed_else
>
> ELSE shift, and go to state 20
> ELSEIF shift, and go to state 21
>
> ELSE [reduce using rule 15 (closed_else)]
> ELSEIF [reduce using rule 15 (closed_else)]
> $default reduce using rule 15 (closed_else)
>
> open_else go to state 31
> closed_else go to state 32
> [/code]
>
> 'Rule 15' is the following rule:
> closed_else: ELSEIF '(' expr ')' closed_stmt
>
> All suggestions are welcome.
>
> Daniel
>
--
View this message in context:
http://www.nabble.com/how-to-resolve-if-elseif-else-ambiguity--tf3909599.html#a11110307
Sent from the Gnu - Bison - Help mailing list archive at Nabble.com.