为Lex和Yacc悬挂其他语法

时间:2016-04-14 03:45:56

标签: parsing if-statement yacc lex dangling-else

我正在编写一个小解析器来识别Java的一个子集,我遇到了一个我认为被称为悬挂其他问题的问题。

匹配if-else语句的语法就像这样开始:

statement:
block |
emptystatement |
ifstatement |
whilestatement |
statementexpression SEMICOLON |
OUTPUT LPAREN addexprlist RPAREN SEMICOLON
;

ifstatement:
IF LPAREN conditionalexpr RPAREN statement |
IF LPAREN conditionalexpr RPAREN statement ELSE statement

但是我收到了shift / reduce错误,想要解决这些问题,而不是像大多数人那样沉默它们。

我已经将我的语法修改为这个,它摆脱了shift / reduce错误,但现在,它没有正确解析else语句。

ifstatement:
matched |
unmatched
;

matched:
IF LPAREN conditionalexpr RPAREN matched ELSE matched 
;

unmatched: 
IF LPAREN conditionalexpr RPAREN matched |
IF LPAREN conditionalexpr RPAREN unmatched |
IF LPAREN conditionalexpr RPAREN matched ELSE unmatched |
/* empty */
;

我已经被困在这几天了,无法解决这个问题。

这是一个应该解析的事情的例子:

if( n <= 0 )
       output(x);
 else {  //breaks on this else statement
   while( i < 0 ) {
       x = input();
       sum = sum + x;
       ++i;
   }

0 个答案:

没有答案