我使用bison来实现一个简单的解析器。其中一行语法看起来像:
prefix_definition : PREFIX IDENTIFIER IDENTIFIER ABBR IDENTIFIER ';'
我不确定如何分别访问第一,第二和第三IDENTIFIER
。我的flex文件像这样读取IDENTIFIER
:
IDENTIFIER_REGEX (_|[A_Za-z])(_|[0-9A-Za-z])*
{IDENTIFIER_REGEX} { yylval.identifier=strdup(yytext); return IDENTIFIER; }
我不能简单地使用yylval.identifier
。我尝试了$2.identifier
左右,但它根本不起作用(无论如何都不应该起作用)。有办法解决这个问题吗?
如果野牛/flex不支持这种访问,我正在考虑使用FIFO队列。这是一个好的解决方案吗?
您可以在声明令牌时(在bison文件中)指定它的类型,与声明非终结符(使用%type
)的方式相同,如下所示:
%token <identifier> IDENTIFIER
(其中identifier
是%union
中声明的字段之一)。然后$2
, $3
等将指向正确的东西,而不需要经过yylval
(即它们将是char *
s)。