c++ - 将 Flex/Bison 与外部程序集成

标签 c++ bison flex-lexer

我正在研究一个智能代理模型,该模型需要一个事件列表作为输入。这些事件来自另一个模型的输出,并在一个(大)文本文件中。文本文件是所有事件的列表(包括我不关心的不必要的事件),所以我使用 flex 编写了一个扫描器,它可以找到有用的位。智能代理模型的框架已经用 C++ 编写。

每个事件都带有时间戳,并包含有关该事件的大量信息。输入文件的格式是不变的,所以我真的不需要检查语法。我不知道 Bison 是否真的会为我提供任何优势,因为语法实际上非常简单。没有真正的变化。

我只需要一种方法将每个事件(以及来自该事件的所有信息)放入堆栈。智能代理按时间顺序作用于每个事件,所以我需要程序扫描整个输入文件,然后将每个事件以相反的顺序放入堆栈(输入文件中的第一个事件应该是最后一个压入堆栈的事件)。这将允许智能代理从堆栈中弹出事件并一次处理一个事件。

我的想法是 bison 对我帮助不大,因为语法只是按顺序列出所有标记的问题。它基本上看起来像这样:

eventlist: /* nothing */
| eventlist event EOL
;

event: token1 token2 token3 ... tokenN-1 tokenN

这是输入文件的一小段,所以你可以明白我的意思:

Scenario Event Time: DAY 1 00:00:00
[DATA FUSION EVENT] New Track Formed
Summary
Actual Target: RF HQ
Fusion Center Location: CVN Enterprise_0
Fusion Center Name: DEFAULT FUSION
Perceived Target Perceived Identification: Unknown
Perceived Classification: Unknown
Operating Medium: Land

我有几个问题:

1) 如何将 flex 生成的扫描器与现有的较大程序集成?
2) Bison 会提供任何优势还是我最好只是编写自己的程序将所有标记放在数据结构上并将它们放在堆栈上? 2a) 如果 bison 更好,那么问题 1 就解决了,但是我如何从我的程序中调用 bison 然后让 bison 返回一个指向堆栈的指针以便程序可以使用它?

//已编辑:我已经弄清楚如何从外部 C++ 程序调用 flex。到目前为止,我一直无法创建一个 bison 程序来执行我想要的操作(即,返回指向事件堆栈的指针)。

最佳答案

如果您的语法如此简单,那么使用解析器似乎有点过分了。只需处理每一行并将标记扫描到一个集合中。

为什么您认为您需要解析器?

关于c++ - 将 Flex/Bison 与外部程序集成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5329066/

相关文章:

c++ - OpenGL 逐网格 Material (着色器)

c - 运行时公式评估

c - 为什么 yyparse() 会导致我的程序崩溃?

c - 如何使用 flex/bison 解析 C 字符串 (char *)?

parsing - 词法分析器/解析器工具

C++ 初学者 : using namespace error

c++ - 为什么 std::atomic_compare_exchange 更新期望值?

c++ - "invalid conversion from ' 文件* {aka _iobuf} ' to ' int '"错误

c - 使用 Flex/Bison 的解释器的 REPL

c - flex 词法分析器覆盖标准输入缓冲区的前两个字节