Bison 联合使用typedef

Bison 联合使用typedef,bison,flex-lexer,Bison,Flex Lexer,我想使用以下方法重新定义浮动: typedef float decimal 因为我使用的是“uthash”表,它没有一个add\u float方法 它只能通过结构来完成 我在野牛身上用过这个 %union{ decimal dec; } and then declare the token %token <dec> DECIMAL 它告诉我: flex文档中的错误: YYSTYPE没有名为dec的成员 野牛的错误(在联盟) 小数点前应有说明符限定符列表 有什么想法吗? 感谢

我想使用以下方法重新定义浮动:

typedef float decimal
因为我使用的是“uthash”表,它没有一个add\u float方法 它只能通过结构来完成

我在野牛身上用过这个

%union{
   decimal dec;
}
and then declare the token
%token <dec> DECIMAL
它告诉我: flex文档中的错误: YYSTYPE没有名为dec的成员

野牛的错误(在联盟) 小数点前应有说明符限定符列表

有什么想法吗?
感谢您的帮助

看来你有一些问题

首先,您的flex规则
{DECIMAL}{yylval.dec=atof(yytext);return(DECIMAL);}
毫无意义。
DECIMAL
是宏还是替换某些匹配的regexp模式?它看起来不是这样,因为在Bison中,
DECIMAL
被声明为标记

无论如何,在你的联盟中,Bison的yylval的一个简单问题是没有在任何地方声明类型
decimal
。您应该在bison文件和flex文件的某处声明
typedef decimal float
。这就是错误消息所显示的内容

ERRORS in the bison (in the union) expected specifier-qualifier-list before decimal.
指的是99%以上的时间

现在,要解决这个问题,您需要将它放在一个单独的文件中,并将该文件包含在flex和bison文件中。这很混乱,一种更简单的方法是将其放在bison文件的第一部分(C代码的第一部分)。那么,如果你使用

bison -d myfile.y

您将得到一个名为
myfile.tab.h
(以及myfile.tab.c)的新文件。flex文件中应包含标题。如果您查看该头文件,您将看到所有的%标记定义也出现在其中,因此您可以在bison中随时进行更改,而不必担心在flex文件中进行相同的更改。

这与Adobe flex有关吗?我猜他指的是flex,一种快速词汇分析工具。标记为gnu-flex.DECIMAL,大写字母是TOKENOk的名称,但是您的yylval有一个类型
DECIMAL
,在哪里声明?另外,flex中有{DECIMAL},这意味着当flex遇到DECIMAL(这是一个标记)时,它将执行操作。因为DECIMAL是一个标记,所以它有一些值(258或更高)。你知道这有什么意义吗?如果不清楚的话,我在回答中的第二段是指{DECIMAL}中使用的十进制数。
bison -d myfile.y