flex与bison工具的值交互方式,举一个详细的例子
时间: 2023-06-25 14:07:08 浏览: 55
Flex和Bison是两个独立的工具,通常一起使用来开发编译器。Flex是一个词法分析器生成器,它将输入文本流转换为标记流。Bison是一个语法分析器生成器,它将标记流转换为语法树。
在Flex中,我们可以使用YYSTYPE定义标记类型。YYSTYPE是一个联合体,它可以存储不同类型的值,例如整数、浮点数、字符串等等。例如,以下代码段定义了一个存储整数值的YYSTYPE:
```
%{
#include "y.tab.h"
%}
%union {
int val;
}
%token <val> INTEGER
```
在这个例子中,我们定义了一个union类型的YYSTYPE,它只有一个成员变量val,这个变量存储整数值。我们还定义了一个标记INTEGER,它使用了<val>属性来存储整数值。
在Bison中,我们可以使用$1、$2等符号来访问先前定义的YYSTYPE。例如,以下代码段展示了如何将两个整数相加:
```
%{
#include <stdio.h>
%}
%union {
int val;
}
%token <val> INTEGER
%left '+' '-'
%%
stmt: expr { printf("%d\n", $1.val); }
expr: INTEGER { $$ = $1; }
| expr '+' expr { $$ = $1.val + $3.val; }
| expr '-' expr { $$ = $1.val - $3.val; }
;
%%
int main()
{
yyparse();
return 0;
}
```
在这个例子中,我们定义了一个语法规则expr,它可以是一个整数或者是两个表达式相加或相减。当两个表达式相加或相减时,我们可以使用$1和$3来访问先前定义的YYSTYPE,并将它们相加或相减。最终的结果存储在$$中,这是Bison特殊定义的符号。
这就是Flex和Bison的值交互方式的一个简单例子。当我们在编写复杂的编译器时,我们可以使用这些工具来定义不同的YYSTYPE和语法规则,以便将文本流转换为可执行代码。