bison 多个类型type连续定义
时间: 2023-09-06 14:08:42 浏览: 46
在bison中,可以通过在类型声明中使用逗号分隔的多个类型来定义多个连续类型。例如:
```
%union {
int i;
char c;
float f;
double d;
}
%type <i> INTEGER
%type <c> CHAR
%type <f> FLOAT
%type <d> DOUBLE
```
这里定义了一个联合类型,包含了四个不同的成员变量:整型、字符型、浮点型和双精度浮点型。然后使用 `%type` 指令将不同的终结符号(或非终结符号)与不同的成员变量相对应,从而定义了多个连续的类型。在此示例中,终结符号 `INTEGER` 的类型为整型,`CHAR` 的类型为字符型,`FLOAT` 的类型为浮点型,`DOUBLE` 的类型为双精度浮点型。
相关问题
bison中如何定义终结符和非终结符
在bison中,可以使用%token声明终结符,使用%type声明非终结符。
%token用法示例:
```
%token PLUS MINUS TIMES DIVIDE
```
上面的代码声明了四个终结符,分别是加号、减号、乘号和除号。
%type用法示例:
```
%type <expr> expr
```
上面的代码声明了一个非终结符expr,并将其类型指定为<expr>。这里的<expr>是一个名为expr的类型,可以在语法规则中使用。
需要注意的是,%type声明的类型必须与语法规则中使用的类型一致。例如,如果在语法规则中使用了类型<expr>,那么在%type声明中也必须使用<expr>。
Bison写一个计算器规则代码
以下是使用Bison编写的计算器规则代码:
```
%{
#include <stdio.h>
%}
%token NUMBER
%left '+' '-'
%left '*' '/'
%left UMINUS
%%
/* 语法规则 */
calc: /* 空 */
| calc exp '\n' { printf("= %d\n", $2); }
| calc error '\n' { yyerror("语法错误"); }
;
exp: NUMBER
| exp '+' exp { $$ = $1 + $3; }
| exp '-' exp { $$ = $1 - $3; }
| exp '*' exp { $$ = $1 * $3; }
| exp '/' exp { if ($3 == 0) yyerror("除数不能为0"); else $$ = $1 / $3; }
| '-' exp %prec UMINUS { $$ = -$2; }
| '(' exp ')' { $$ = $2; }
;
%%
int main()
{
yyparse();
return 0;
}
int yyerror(char *s)
{
printf("%s\n", s);
return 0;
}
int yylex()
{
int c = getchar();
if (c == EOF)
return 0;
if (c >= '0' && c <= '9')
{
ungetc(c, stdin);
scanf("%d", &yylval);
return NUMBER;
}
return c;
}
```
这个计算器可以计算加减乘除和取负操作,支持括号。在输入表达式时需要以回车键结尾,程序会输出计算结果。如果输入的表达式有语法错误,程序会打印错误信息并退出。
相关推荐
![](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)