学习 Bison 提供的%left、%right、%prec、%noassoc 等方式解决 LR 分析法的冲突
时间: 2024-05-06 08:16:12 浏览: 15
在 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,这样可以正确地解决冲突。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)