2011-03-16 68 views
2

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

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

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

我的想法是,野牛不会帮助我很多,因为语法只是一个顺序列出所有令牌的问题。它会基本上是这样的:

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

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

这里的输入文件的一个小片段,所以你可以看到我的意思:

场景活动时间:第一天00:00:00
[数据融合EVENT]新轨道形成
摘要
实际的目标:RF HQ
融合中心地点:CVN Enterprise_0
融合中心名称:DEFA ULT FUSION
感知目标 感知识别:未知
感知分类:未知
工作介质:土地

我有几个问题:

1)如何整合,Flex生成的扫描仪与更大的程序已经存在?
2)野牛会提供什么优点,或者我最好只写自己的程序,将所有的令牌放在数据结构中并放到堆栈上? 2a)如果野牛更好,那么就解决了问题1,但是如何在我的程序中调用野牛,然后让野牛返回一个指向堆栈的指针,以便程序可以使用它?

//编辑:我已经想出了如何从外部C++程序调用flex。到目前为止,我一直无法创建一个可以做我想要的野牛程序,即(返回一个指向一堆事件的指针)。

+0

更新:我使用的是Windows,并且该项目目前在Visual Studio 2008中编程。到目前为止,扫描器已经通过命令行生成,并且是独立程序。 – Andrew 2011-03-16 17:20:25

+0

你也可以看看助推精神。我从来没有使用过野牛,但将野牛语法转化为精神是一项简单的任务。所以,这可能会帮助你。 – mkaes 2011-03-16 17:50:43

回答

-2

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

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

+0

因为没有Yacc/Bison,我找不到任何直接与flex接口的文档。我能找到的所有文档都假设你使用的是Yacc/Bison,所以说明书就是朝着这个方向发展的。 – Andrew 2011-03-16 19:49:55

+0

好的。所以你不能只调用yylex()来调用扫描器? – 2011-03-16 21:25:50

+0

是的,但我似乎无法弄清楚如何让它返回有用的东西。有没有办法让yylex()返回一些有用的东西?我可以在外部调用yylex(),但是我需要它返回一个指向堆栈的指针或其他有用的数据结构,以便智能代理实际上可以使用令牌做些事情。 – Andrew 2011-03-17 14:54:01