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