【问题标题】:Set yyin to an "emulated" FILE*?将 yyin 设置为“模拟”文件*?
【发布时间】:2013-06-05 16:29:06
【问题描述】:

我有一个 C 库,我想在不修改库的情况下与 C++ 代码交互。它有一个 yacc 生成的前端,从 yyin 读取,这是一个 FILE *。我想将yyin 设置为从内存中读取的FILE * 的某种仿真。是否有希望以可移植(Linux、Mac、Windows)的方式执行此操作 - 或者是否有其他技巧可以让这样的解析器从内存中读取而不是 FILE *

【问题讨论】:

  • 你的 yacc 前端是否也有 lex/flex 生成的分词器?
  • 您是打算根据需要从外部文件中读取数据,还是要将整个字符串放在内存中进行扫描?
  • @BryanOlivier,是的,有一个 lex 分词器。
  • @templatetypedef 我希望能够根据需要向它发送一个字符串。
  • 通常将 lex/flex 的输入例程更改为从字符串中读取。您可以使用 Dietrich 提到的 yy_scan_buffer,但我认为它仅限于 flex,或者重新定义 input 宏(old skool)。

标签: c++ c yacc stdio


【解决方案1】:

您可以在 Linux 上使用fmemopen()。不幸的是,不仅没有可移植的方式来做到这一点,而且fopen() 甚至不是真正的可移植的(它在 Windows 上已经被破坏了很长时间)。

但是,如果您的标记器是 Flex,您可以使用 yy_scan_buffer()。见String input to flex lexer

【讨论】:

  • 那太好了,谢谢——我想这一切都错了。恐怕在 Java 低谷吃得太久了。
  • 今天和yy_scan_string() 一起工作了——再次感谢!
【解决方案2】:

yacc 扫描器通常会通过词法分析器获取令牌,调用名为 yylex 的函数。

词法分析器通常从输入文件(或缓冲区,在您的情况下)中读取字符。假设您使用 Flex 生成词法分析器,修改输入读取方式的常用“钩子”是重新定义 YY_INPUT 宏。

然而,正如@dietrich Epp 所提到的,还有 yy_scan_string、yy_scan_buffer 和 yy_scan_bytes。这些是否比定义您自己的 YY_INPUT 更适合您的目的可能会有一些问题。虽然我不记得任何细节,但我记得有时由于(至少感知到)效率低下(或者也许只是在我看来定义 YY_INPUT 更容易——可以)而避免它们不记得了)。

【讨论】:

  • 使用YY_INPUT 的问题似乎是flex 输入文件已经定义了它(因为它必须),我的目标是在不修改任何源的情况下使用该库。我现在正在看东西,试图弄清楚我是否可以使用yy_scan_X() 函数来处理未修改的代码。
猜你喜欢
  • 2013-09-28
  • 1970-01-01
  • 1970-01-01
  • 2015-10-28
  • 1970-01-01
  • 2013-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多