【问题标题】:Bison Grammar: yylval is embedded in yyparseBison 语法:yylval 嵌入 yyparse
【发布时间】:2011-05-11 16:54:33
【问题描述】:

难怪我不能从我的 flex 文件链接到它。 我已经检查了这个并取出了声明“YYSTYPE yylval;”从 yyparse 开始,它按预期工作。当然,这不是使用 bison 和 flex 的正确方法吗?有人可以告诉我另一种方式吗? 谢谢。

【问题讨论】:

  • 你最好使用C++接口。
  • 嗨,亚历山大。指定bison自带的c++骨架?
  • 是的。它具有不暴露全局变量的巨大优势,如果您有多个解析器(或者如果您根本不喜欢全局变量),这很方便。

标签: c++ c parsing yacc


【解决方案1】:

在bison输出的y.tab.c文件中声明和定义yylval是正常的。它也在 y.tab.h 文件中声明(作为 extern),因此如果将其包含在词法分析器中,则可以将 yylval 作为全局变量访问。这是 flex/bison 工作的正常方式,不需要编辑文件来取出东西——它应该“正常工作”

如果您想在一个程序中拥有多个解析器,或者想要在不同的线程中(或同时)使用多个解析器,这种使用全局变量会导致问题。 Bison 提供了一种通过%define api.pure 避免这种情况的方法,它摆脱了 yylval 作为全局 - 相反,解析器将使用 YYSTYPE(指针)的地址调用 yylex,并且词法分析器应该将标记值放在那里而不是 in伊尔瓦尔。如果您使用的是 flex,您需要在 flex 文件的顶部使用 #define YY_DECL int yylex(YYSTYPE *val) 来更改它用于 yylex 的声明。

【讨论】:

  • 是的。刚刚想通了。在野牛文件中启用了 %pure 解析器。它是我正在编辑/使用的 php 语法。野牛有大量的选择,令人印象深刻。无论如何,谢谢你的帮助,我相信将来有人会偶然发现这件事,它会帮助他们。
【解决方案2】:

而不是使用

#define YY_DECL int yylex(YYSTYPE *val)

你也可以使用

%option bison-bridge

但是如果你想用C++写一个flex+bison解析器,那么这个方法就行不通了。

对于 C++ 解析器,请检查 this example

【讨论】:

    【解决方案3】:

    我已经检查了这个并取出了 声明“YYSTYPE yylval;”

    不知道你的“拿出来”是不是有问题,不过你可以试试

    bison -d your-yacc-file.y

    然后 bison 将为您生成一个包含所有这些声明的头文件。

    【讨论】:

    • 嗨神经元。我已经解决了这个问题。 Bison 在生成纯/可重入解析器时不会全球化 yylval 和其他。我从我的 .y 文件中取出了这个,一切正常。
    猜你喜欢
    • 2011-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多