%union{} %token ASSIGN "=" %token LT %token LE %token GT %token GE 是什么意思
时间: 2023-07-11 13:48:23 浏览: 80
这是一个用于生成语法分析器的定义文件(通常是使用Yacc/Bison工具)。其中:
- `%union{}` 定义一个空的联合类型,用于在语法规则中指定语法分析器返回的值类型。
- `%token ASSIGN "="` 定义一个终结符号(token),表示赋值操作符"="。
- `%token LT` 定义一个终结符号(token),表示小于号"<"。
- `%token LE` 定义一个终结符号(token),表示小于等于号"<="。
- `%token GT` 定义一个终结符号(token),表示大于号">"。
- `%token GE` 定义一个终结符号(token),表示大于等于号">="。
这些定义都是用于在Yacc/Bison规则中引用的。比如可以这样定义一个规则:
```yacc
expr: INT
| expr ADD expr
| expr SUB expr
| expr MUL expr
| expr DIV expr
| expr LT expr
| expr LE expr
| expr GT expr
| expr GE expr
| IDENTIFIER ASSIGN expr
;
```
其中,`INT` 和 `IDENTIFIER` 也是终结符号,表示整数和标识符。这个规则表示一个表达式可以是一个整数、两个表达式相加、两个表达式相减、两个表达式相乘、两个表达式相除、两个表达式进行比较(小于、小于等于、大于、大于等于)、或者是一个标识符赋值为一个表达式。
相关问题
C++ #define assign_token(case_label)
这个代码片段定义了一个宏 `assign_token`,它的定义中包含了另一个宏 `_token` 和 `case_label`,具体的作用如下:
当使用 `assign_token` 宏时,会将 `case_label` 作为参数传递给 `_token` 宏,然后将 `_token` 宏的结果作为字符串字面量,用于给变量或变量的成员赋值。这个宏可以用于 switch-case 语句中,用于给不同的变量或变量的成员赋不同的字符串字面量值。
举个例子:
```c++
#include <iostream>
#define _token(x) #x
#define assign_token(x) _token(x)
int main()
{
std::string str1;
std::string str2;
int case_label = 1;
switch (case_label)
{
case 1:
str1 = assign_token(case_label); // 相当于 str1 = "1"
break;
case 2:
str2 = assign_token(case_label); // 相当于 str2 = "2"
break;
default:
break;
}
std::cout << "str1 = " << str1 << std::endl; // 输出:str1 = 1
std::cout << "str2 = " << str2 << std::endl; // 输出:str2 =
return 0;
}
```
在上面的例子中,当 case_label 的值是 1 时,会执行 `str1 = assign_token(case_label);`,这相当于执行 `str1 = "1";`。所以最后输出的结果是 `str1 = 1`。当 case_label 的值是 2 时,会执行 `str2 = assign_token(case_label);`,这相当于执行 `str2 = "2";`,所以最后输出的结果是 `str2 = `(空字符串)。
C++ #define assign _token(case_label)
这个代码片段定义了一个宏 `assign`,它的定义中包含了另一个宏 `_token` 和 `case_label`,具体的作用如下:
当使用 `assign` 宏时,会将 `case_label` 作为参数传递给 `_token` 宏,然后将 `_token` 宏的结果作为代码的一部分,用于给变量或变量的成员赋值。这个宏可以用于 switch-case 语句中,用于给不同的变量或变量的成员赋不同的值。
举个例子:
```c++
#include <iostream>
#define _token(x) #x
#define assign _token(case_label)
int main()
{
int a = 0;
int b = 0;
int case_label = 1;
switch (case_label)
{
case 1:
a = assign; // 相当于 a = "case_label"
break;
case 2:
b = assign; // 相当于 b = "case_label"
break;
default:
break;
}
std::cout << "a = " << a << std::endl; // 输出:a = case_label
std::cout << "b = " << b << std::endl; // 输出:b =
return 0;
}
```
在上面的例子中,当 case_label 的值是 1 时,会执行 `a = assign;`,这相当于执行 `a = "case_label";`。所以最后输出的结果是 `a = case_label`。当 case_label 的值是 2 时,会执行 `b = assign;`,这相当于执行 `b = "case_label";`,所以最后输出的结果是 `b = `(空字符串)。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.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)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)