我正在编写一个小型解析器来识别 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;
}