如何让ELSE与yacc中最远的IF相关联?

时间:2011-08-02 11:21:18

标签: yacc operator-precedence

我现在知道如何让ELSE与最近的IF

相关联
%nonassoc IFX
%nonassoc ELSE

| IF stmt %prec IFX
| IF stmt ELSE stmt

但是如何让ELSE与最远的IF相关联?

我尝试切换上面两个%nonassoc的顺序,但之后如果似乎无法识别IF stmt ELSE stmt格式的任何有效语句。

为什么?

如何正确地做到这一点?

1 个答案:

答案 0 :(得分:1)

(未经测试)如果多个if之间存在歧义,您需要强制bison生成一个解析器,以减少if语句。根据{{​​3}},如果IF stmt规则的优先级高于ELSE令牌,则可以实现此目的。所以

%nonassoc ELSE
%nonassoc IFX

| IF stmt %prec IFX
| IF stmt ELSE stmt

应该这样做。