1

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

我匹配 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;
   }
4

0 回答 0