获取多个成员的类型

时间:2010-02-14 13:26:25

标签: yacc bison lex

我正在用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

非常感谢!

2 个答案:

答案 0 :(得分:1)

我不完全理解您的问题,但在lex / yacc(或flex / bison)中,您必须使用以下约定:

  • 使用$ 1来引用第一个项目的yylval
  • 使用$ 2来引用第二项的yylval
  • 使用$$来引用生成的(目标)项目的yylval

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); }