%union { int num; char* str; struct ASTnode* node; /*"struct" is indispensable*/ }
时间: 2024-03-26 18:42:10 浏览: 14
这段代码是用来定义 Lex 和 Yacc 之间共享的联合体类型。在这个联合体中,我们定义了三个成员变量:num、str、node,分别代表整数、字符串和 AST 节点。
%union 是 Yacc 的一个关键字,用来定义联合体类型。在这个定义中,我们使用了 C 语言的语法,定义了一个结构体,其中包含三个成员变量。在 Yacc 的语法规则中,我们可以使用这些成员变量来保存识别到的 token 的属性值,或者 AST 节点的指针。
在实际编写 Lex 和 Yacc 的代码中,我们可以通过设置 $$ 变量来将属性值传递给 Yacc。例如,如果我们识别出了一个整数,可以使用以下代码将它的值传递给 Yacc:
```
[0-9]+ {
yylval.num = atoi(yytext);
return INTEGER;
}
```
在 Yacc 的语法规则中,我们可以使用以下代码来获取这个整数的值:
```
expression:
INTEGER { $$ = $1; }
...
```
这样,就可以通过设置 $$ 变量来将属性值传递给 Yacc,并在后续的语法规则中使用它。
相关问题
C++中char*与struct如何互转
在C++中,可以通过以下方法将char*类型和struct类型进行互转:
1. 将struct类型转换为char*类型:
可以使用reinterpret_cast<char*>将struct类型的指针转换为char*类型的指针,如下:
```
struct MyStruct {
int num;
char str[10];
};
MyStruct s;
s.num = 123;
strcpy(s.str, "hello");
char* charPtr = reinterpret_cast<char*>(&s);
```
这样就可以将MyStruct类型的变量s转换为char*类型的指针charPtr了。
2. 将char*类型转换为struct类型:
可以使用reinterpret_cast将char*类型的指针转换为struct类型的指针,如下:
```
char* charPtr = ...; // 假设已经有了一个char*类型的指针
MyStruct* structPtr = reinterpret_cast<MyStruct*>(charPtr);
```
这样就可以将char*类型的指针charPtr转换为MyStruct类型的指针structPtr了。需要注意的是,转换后的指针指向的内存中应该是已经存储了MyStruct类型的数据。如果指向的内存中存储的数据类型与MyStruct类型不一致,可能会导致程序出现问题。
struct node*和struct node**的区别
`struct node*` 和 `struct node**` 都是 C 语言中的指针类型,但它们之间有很大的区别。
`struct node*` 表示指向 `struct node` 结构体的指针。这意味着变量存储了一个地址,该地址指向一个 `struct node` 结构体的实例。通过 `struct node*` 可以访问结构体中的成员变量,例如 `node_ptr->member` 的形式。
`struct node**` 则表示指向 `struct node*` 指针的指针。这种情况通常用于动态分配内存,例如创建一个指向 `struct node` 的指针数组。在这种情况下,每个元素都是指向 `struct node` 的指针,而 `struct node**` 存储了这个指针数组的地址。
总之,`struct node*` 用于指向结构体的单个实例,而 `struct node**` 用于指向指针数组的指针。