什么是%prec

什么是%prec

理解%prec

%prec即是precedence的缩写,也就是用来决定优先级的。比如在符号中本来没有UMINUS这个说法(UMINUS表示一元负号,也就是给一个数加上负号,例如: − 5 × 6 -5\times6 5×6,其实UMINUS就是个名字,想取什么就取什么)但却有所需求,在规则后面加上此话则可以确定其优先级。

定义语法

%prec terminal-symbol
这个定义就是把该终结符(terminal)所具有的优先级赋予该规则,而这个优先级将会覆盖在普通方式下推断出来的该规则的优先级。

案例

在这里插入图片描述
%nonassoc UMINUS即为定义。
expr: '-' expr %prec UMINUS {...}这句话就是用来提升expr: '-' expr的优先级的。

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
在 Bison 中,%left、%right、%nonassoc 和 %precedence 这些声明都非常重要,用于处理语法冲突。这些声明的作用是指定运算符的结合性和优先级,从而解决文法中存在的移位-归约冲突和归约-归约冲突。 1. %left:表示指定运算符为左结合。例如,对于表达式 a - b - c,我们希望先计算 a - b,然后再减去 c,因此可以使用%left 声明: ``` %left MINUS expr: expr MINUS expr { $$ = $1 - $3; } ``` 2. %right:表示指定运算符为右结合。例如,对于表达式 a = b = c,我们希望先计算 b = c,然后再将结果赋值给 a,因此可以使用%right 声明: ``` %right ASSIGN expr: ID ASSIGN expr { $1 = $3; } | expr ASSIGN expr { $$ = $3; } ``` 3. %nonassoc:表示指定运算符为非结合性。例如,对于表达式 a < b < c,我们希望禁止使用连续的小于号,因此可以使用%nonassoc 声明: ``` %nonassoc LESS expr: expr LESS expr { $$ = $1 < $3; } ``` 4. %precedence:指定运算符的优先级。例如,使用%precedence 和%left 声明来实现算术运算符的优先级: ``` %precedence PLUS MINUS %precedence TIMES DIVIDE %left PLUS MINUS %left TIMES DIVIDE expr: expr PLUS expr { $$ = $1 + $3; } | expr MINUS expr { $$ = $1 - $3; } | expr TIMES expr { $$ = $1 * $3; } | expr DIVIDE expr { $$ = $1 / $3; } ``` 5. %prec:用于显式指定某个产生式的优先级,可以用于解决某些冲突。例如,在下面的示例中,我们使用%prec 声明来解决 if-else 语句中的归约-归约冲突: ``` stmt: IF expr THEN stmt %prec LOWER_ELSE { $$ = if ($2) $4; } | IF expr THEN stmt ELSE stmt { $$ = if ($2) $4 else $6; } ``` 在这个例子中,我们使用%prec LOWER_ELSE 声明来指定 ELSE 的优先级低于 THEN,这样可以正确地解决冲突。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值