Parsing 为Lex和Yacc悬挂else语法

Parsing 为Lex和Yacc悬挂else语法,parsing,if-statement,yacc,lex,dangling-else,Parsing,If Statement,Yacc,Lex,Dangling Else,我正在编写一个小型解析器来识别Java的一个子集,我遇到了一个问题,我认为这就是悬而未决的else问题 我匹配if-else语句的语法是这样开始的: statement: block | emptystatement | ifstatement | whilestatement | statementexpression SEMICOLON | OUTPUT LPAREN addexprlist RPAREN SEMICOLON ; ifstatement: IF LPAREN conditi

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

if(n)这不可能是您的整个语法,因为它无法解析
if(如果您可以将您的S/R冲突归结为您所做的悬而未决的else歧义,因为yacc将正确处理它,即如预期的那样。这不可能是您的整个语法,因为它无法解析
if(如果您可以将您的S/R冲突降低到您所做的悬而未决的其他模糊性,因为yacc将正确地处理它,即如预期的那样。