【问题标题】:yylval undefined with flex and bisonyylval undefined with flex 和 bison
【发布时间】:2011-09-11 23:58:54
【问题描述】:

我几乎在网上搜索了所有材料。但我仍然很困惑为什么词法分析器无法识别 yylval。

情况如下: 我在node.h中定义了一堆ADT并在node.c中实现它们,我的目的是在这些结构正确存储后生成一个AST。但我被野牛文件困住了。

首先,我将%union 更改为union YYSTYPE {...};typedef union YYSTYPE YYSTYPE;,我不需要这样做,网上发布的其他一些文件似乎与%uinion 配合得很好。

然后,我被yylval 的东西困住了。我已经完成了bison -d 的事情,并且已经在parser.c 中检查了它(我已经指定了野牛输出),所以我认为extern YYSTYPE yylval; 应该可以工作。但事实并非如此。所以我想知道是否有另一种方法可以解决 yylval 未声明的问题。

我只使用YYSTYPE这两种结构,intchar *,我可以将联合YYSYTPE和结构分开用于AST吗?这意味着,非终结符将没有关联的类型。大家还有什么想法吗?

【问题讨论】:

  • 我仍然想知道您的意思是“将联合 YYSTYPE 和 AST 的结构分开”,我认为没有必要。在bison 中使用%union%type 时遇到问题了吗?
  • @neuront 是的,我同意你的看法。我们不需要在 bison 中明确指定 YYSTYPE。但问题是如果不这样做,我就无法通过它。换句话说,虽然%union%union YYSTYPE 的工作方式相同,但是,就我而言,我必须选择后者。我不知道为什么?对于%union%type,我知道它们之间的关系。我只知道如何使用YYSTYPE undefined 解决错误。上网一搜,发现是个通病。

标签: gcc bison flex-lexer compiler-construction


【解决方案1】:

您的 .y 文件中是否设置了 %pure-parser(或类似的)?这会禁用正常的 lex 声明,因为它们不能重入。

https://www.gnu.org/software/bison/manual/html_node/Pure-Decl.html

【讨论】:

    【解决方案2】:

    如果它对其他人有帮助,我发现(OpenBSD lex v2.5.4 + yacc)包括

    extern YYSTYPE yylval;
    

    在我的 lex 源代码中不足以防止出现“yylval undefined”问题,即使 y.tab.c 文件包含:

    #ifndef YYSTYPE
    typedef int YYSTYPE;
    #endif
    

    我通过在 lex 源代码中明确定义来解决此问题:

    #define YYSTYPE int
    extern YYSTYPE yyltype
    

    但是,我不清楚以这种方式定义是否会传播到 yacc 源文件的语言环境...

    【讨论】:

      【解决方案3】:

      你应该使用 %union。您不需要 typedef 联合。

      您使用 bison -d 获取带有任何声明(例如终端、非终端和标记的类型)的头文件。示例:

      bison -d parser.y 会产生两个文件,parser.tab.c 和 parser.tab.h。您可以将后一个文件包含到您的词法分析器文件中,这样它就会知道您的 %token 定义。该文件还包括 yylval 的定义及其类型。

      您不应该分离联合,因为您很可能会扩展它并需要它在词法分析器和解析器之间进行通信。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-10-24
        • 1970-01-01
        • 1970-01-01
        • 2017-09-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多