2011-03-16 113 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