在联合中使用typedef

时间:2010-11-02 21:09:38

标签: bison flex-lexer

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

typedef float decimal

因为我正在使用“uthash”表而且它没有使用方法add_float 它只能通过结构

来完成

我在野牛中使用了这个

%union{
   decimal dec;
}
and then declare the token
%token <dec> DECIMAL

如果我在flex中

{DECIMAL} {yylval.dec=atof(yytext); return (DECIMAL);}
它告诉我: flex文档中的错误: YYSTYPE没有名为dec的成员

野牛的错误(在工会中) 十进制之前的预期说明符限定符列表。

有什么想法吗? 任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:1)

好像你有几个问题。

首先,你的弹性规则{DECIMAL} {yylval.dec=atof(yytext); return (DECIMAL);}毫无意义。 DECIMAL是否为某些匹配的正则表达式模式的宏或替代?它似乎不是这样,因为DECIMAL在Bison中被声明为TOKEN。

无论如何,你在Bison中为yylval结合的简单问题是类型decimal未在任何地方声明。您应该在您的bison文件和flex文件中的某处声明typedef decimal float。这是错误消息

ERRORS in the bison (in the union) expected specifier-qualifier-list before decimal.

指99%以上的时间。

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

bison -d myfile.y

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