我正在用Yacc / Flex编写程序,我正在使用以下代码(不完全相同,因为我正在混合其他文件中的代码):
DataType datat;
%union {
int integer;
char *string;
DataType type;
}
Integer { yylval.type = INTEGER; return INT; }
%type <type> INT
data : INTNUM { yylval.type = INTEGER; }
然后,如果我写这样的话:
foo : data { bar(yylval.type); }
bar 正确获取数据类型 INTEGER ,但如果我有这个:
foo : data data { ??? }
如何分别获取第一个和第二个成员的 yylval.type ?
非常感谢!
答案 0 :(得分:1)
我不完全理解您的问题,但在lex / yacc(或flex / bison)中,您必须使用以下约定:
E.g。如果你要写一个简单的整数计算器,定义总和的规则将写成如下:
Sum : Term '+' Term
{
$$.Value = $1.Value + $3.Value
}
希望这有帮助。
答案 1 :(得分:0)
yylval.type将返回扫描的最后一个令牌的类型,该类型可能是缩减为数据的整数,但可能是后面的令牌。你永远不应该直接在yacc / bison文件中访问yylval,因为它不可靠。
相反,您应该使用$1
,$2
等来访问Patrick所记录的项目的YYSTYPE信息。要使其适用于非终端,您需要在yacc / bison文件中使用%type
声明,并且这些非终端的规则需要设置$$
,例如:
%type <type> data
%%
data : INTNUM { $$ = INTEGER; }
foo : data { bar($1); }
foo : data data { bar($1, $2); }