token type left都是什么作用
时间: 2023-11-29 11:06:21 浏览: 221
django foreignkey外键使用的例子 相当于left join
在编译原理中,`token`、`type`、`left` 等都是与文法规则相关的概念。
- `token` 是指词法单元,也就是编译器在分析源代码时从输入流中识别出来的一些基本单元,比如关键字、标识符、常量等。
- `type` 是指语法单元的类型,也就是语法分析器在分析词法单元之后生成的语法树的节点类型。
- `left` 是指运算符的优先级,用于指定运算符之间的优先顺序。
在 Yacc/Bison 中,`token` 用于定义词法单元的名字和值类型,`type` 则是对语法树节点的类型进行定义。`left` 则是用于定义运算符之间的优先级和结合性,以便语法分析器能够正确地构造表达式的语法树。
例如,在以下的 Yacc/Bison 规则中:
```
expr: expr '+' expr { $$ = $1 + $3; }
| expr '-' expr { $$ = $1 - $3; }
| expr '*' expr { $$ = $1 * $3; }
| expr '/' expr { $$ = $1 / $3; }
| ID { $$ = lookup_symbol($1); }
| INT { $$ = $1; }
| '(' expr ')' { $$ = $2; }
;
```
其中 `+`、`-`、`*`、`/`、`(` 和 `)` 都是运算符。在这里我们可以用 `left` 关键字指定运算符的优先级和结合性,比如:
```
%left '+' '-'
%left '*' '/'
%left UMINUS
```
这里 `%left` 后面的 `+` 和 `-` 表示它们具有相同的优先级和结合性,都是左结合的。而 `%left '*' '/'` 则表示这两个运算符也是左结合的,但是优先级比 `+` 和 `-` 高。最后 `%left UMINUS` 表示单目减号运算符具有最高的优先级。
这样,当语法分析器在分析表达式的时候,就能够根据这些规则正确地构造出语法树,以便生成正确的目标代码。
阅读全文