冲突的野牛循环
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_matched
和for_unmatched
。 (与其他复合语句类似,例如 while
。)
为了解决悬垂的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_matched
和for_unmatched
。 (与其他复合语句类似,例如 while
。)