bison中printf("%s\n",$1); $$->field=$1;printf("%s\n",$1);前后$1值不一样
时间: 2024-02-13 18:02:22 浏览: 25
这是因为Bison在解析语法规则时,使用了一个特殊的数据结构来存储解析出来的文本,称为“符号值”(semantic value)。每个符号都有一个对应的符号值,它的类型由语法规则中的语句来决定。在你的代码中,$1代表第一个符号的符号值,它的类型应该是字符指针(char *)。
在执行语法规则中的语句时,Bison会将符号值作为参数传递给语句,并将语句执行的结果作为新的符号值返回。在你的代码中,第一行语句printf("%s\n",$1)会输出$1当前的值,也就是解析出来的文本。然后,将$1的值赋给$$->field,这会修改$$的符号值,但不会影响$1的符号值。因此,第二行语句printf("%s\n",$1)会输出$1原来的值,而不是新的值。
如果你想要在第二个printf语句中输出新的值,可以将$1的值赋给一个临时变量,然后将临时变量的值赋给$$->field,如下所示:
```
char *tmp = $1;
$$->field = tmp;
printf("%s\n", tmp);
```
这样,第二个printf语句就会输出新的值了。
相关问题
bison $$ =$1解释
在bison文件的action中,可以使用$1,$2,...,$n来引用此action的产生式右侧的第1~n个符号所绑定的值。而$$表示此action的产生式左侧的非终结符所绑定的值。因此,bison $$ =$1表示将此action的产生式右侧的第一个符号所绑定的值赋值给此action的产生式左侧的非终结符所绑定的值。
expr {printf("\t=%d\n", $1);} |VARIABLE '=' expr {sym[$1] = $3;}
这是一个简单的 Yacc/Bison 语法规则,用于解析赋值语句。其中,expr 表示表达式,VARIABLE 表示变量名。
这个规则的意思是,当遇到一个表达式时,打印它的值;当遇到一个变量名和等号和表达式时,将变量名和表达式的值存入一个名为 sym 的符号表中。
在实际使用中,可以根据需求修改这个规则,比如添加语义动作,或者扩展它的语法规则。
相关推荐
![gz](https://img-home.csdnimg.cn/images/20210720083447.png)
![bz2](https://img-home.csdnimg.cn/images/20210720083646.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)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)