冲突的野牛循环

Bison loop for conflict

为了解决悬垂的else问题,我使用了以下解决方案:

stmt            : stmt_matched
                | stmt_unmatched
                ;
stmt_unmatched  : IF '(' exp ')' stmt
                | IF '(' exp ')' stmt_matched ELSE stmt_unmatched
                ;
stmt_matched    : IF '(' exp ')' stmt_matched ELSE stmt_matched
                | stmt_for
                | ...
                ;

对于for循环的语法规则的定义,由于同样的问题,我产生了冲突shift/reduce:

stmt_for        : FOR '(' exp ';' exp ';' exp ')' stmt
            ;

我该如何解决这个问题?

并非所有 for 语句都匹配。考虑一下,例如

 if (c) for (;;) if (d) ; else ;

所以需要将for语句分为for_matchedfor_unmatched。 (与其他复合语句类似,例如 while。)