- 论坛徽章:
- 0
|
//语法定义
struct_or_union_spec : struct_or_union ID LBRACE struct_declaration_list RBRACE pos
{printf("1) id = %s \n", yylval_sval}
direct_dec : ID pos
{printf("2) id = %s \n", yylval_sval}
//语法关联过程
struct_or_union_spec -> struct_declaration -> dec ->direct_dec
例子:
struct xyz
{
int a;
double b;
}g;
当执行后的结果如下:
struct xyz
{
int a;2) id = a
double b;2) id = b
}1) id = b(正确的应该是 1) id = xyz)
g;
发现,对于 direct_dec的2个变量(结构体里的a和b)是对的,但对于 strcut_or_union_spec 里的ID(结构体里的xyz)是错的,正确的应该是: 1) id = xyz
我感觉是yacc在展开公式(语法定义)时,在最开始时 yylval_sval 的值是 xyz 的。但 yacc 先展开 struct_declaration_list 并将里面的变量 a 和 b 打印出来(先执行 printf("2) id = %s \n", yylval_sval)。在打印完 struct_declaration_list 里面的变量后,yylval_sval 的值为 b(原来的xyz早就被覆盖了),因此再打印 xyz 时就变为 b(最后才执行 printf("1) id = %s \n", yylval_sval)。
现在的问题是,怎样才可以提取出结构体的ID(即 xyz)? |
|