将Flex / Bison与外部程序集成

时间:2011-03-16 17:15:37

标签: c++ bison flex-lexer

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

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

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

我的想法是,野牛不会对我有多大帮助,因为语法只是依次列出所有标记的问题。它基本上是这样的:

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

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

这是输入文件的一小部分,所以你可以看到我的意思:

  

场景活动时间:第1天00:00:00
  [数据融合事件]新的轨道形成了   摘要
  实际目标:RF HQ
  融合中心地点:CVN Enterprise_0
  融合中心名称:DEFAULT FUSION
  感知目标   感知识别:未知
  感知分类:未知
  运营媒介:土地

我有几个问题:

1)如何将flex生成的扫描仪与已存在的较大程序集成? 2)bison是否会提供任何优势,或者我最好只编写自己的程序将所有令牌放在数据结构上并将它们放在堆栈中? 2a)如果野牛更好,那么解决问题1,但是如何从我的程序中调用bison然后让bison返回指向堆栈的指针,以便程序可以使用它?

//编辑:我已经弄清楚如何从外部C ++程序调用flex。到目前为止,我还没有能够创建一个能够做我想做的野牛程序(即返回指向一堆事件的指针)。

1 个答案:

答案 0 :(得分:-3)

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

为什么你认为你需要一个解析器?