【问题标题】:Use typedef in union在联合中使用 typedef
【发布时间】:2010-11-02 21:09:37
【问题描述】:

我想重新定义浮点数:

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

它告诉我: 弹性文档中的错误: YYSTYPE 没有名为 dec 的成员

野牛中的错误(在联合中) 小数点前的预期说明符限定符列表。

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

【问题讨论】:

  • 这和 Adob​​e Flex 有关系吗?
  • 我猜他指的是快速词法分析工具 flex。它的标签是 gnu-flex。

标签: bison flex-lexer


【解决方案1】:

您似乎遇到了一些问题。

首先,您的弹性规则 {DECIMAL} {yylval.dec=atof(yytext); return (DECIMAL);} 没有意义。 DECIMAL 是宏还是替换某些匹配的正则表达式模式?它没有出现,因为DECIMAL 在 Bison 中被声明为一个 TOKEN。

无论如何,Bison 中 yylval 的联合中的简单问题是类型 decimal 没有在任何地方声明。你应该在你的野牛文件和你的弹性文件中的某个地方声明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 文件中。如果您查看该头文件,您会看到所有 %token 定义也出现在其中,因此您可以随时在 bison 中进行更改,而无需担心在 flex 文件中进行相同的更改。

【讨论】:

  • 带大写字母的 DECIMAL 是 TOKEN 的名称
  • 好的,但是你的 yylval 有一个类型 decimal 这是在哪里声明的?此外,您在 flex 中有 {DECIMAL},这意味着当 flex 遇到 DECIMAL(这是一个令牌)时,它将执行操作。由于 DECIMAL 是一个令牌,它具有一定的价值(258 或更高)。你觉得这没有意义吗?
  • 如果不清楚,我在回答中的第二段是指 {DECIMAL} 中使用的 DECIMAL。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-15
  • 2020-04-29
  • 1970-01-01
  • 2023-03-08
  • 2013-12-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多