2010-10-28 114 views
2

我在C++中有一個應用程序,它實際上處理二進制文件。二進制文件是A/B/C事件的集合,當檢測到文件中的事件A時,應用程序在「處理程序A」中處理事件。如何解釋自定義語言

現在我需要用自定義語言編寫另一個腳本,該腳本與二進制文件處理正交執行。該腳本可以有這樣的事,

define proc onA 
{ 
c= QueryVariable(cat) 
print (c) 
} 

所以當應用程序處理來自二進制文件的事件「A」,應用程序必須分析這個腳本文件,檢查ONA和轉換在奧納PROC到例程聲明由應用程序支持。例如,QueryVariable應該將應用程序中定義的變量「cat」的值複製到變量「C」中。該應用程序還應該檢查腳本中語言的語法/語義。我在哪裏可以獲得決定設計的最佳信息?我在分析樹木/語法方面的知識真的被削弱了。

謝謝

+0

設計的哪些部分受您控制?你可以修改應用程序嗎? – Beta 2010-10-28 16:19:14

+1

我不清楚你是否需要編寫解釋器。如果你[學會編寫編譯器](http://stackoverflow.com/q/1669/2509)是指針的標準來源。 – dmckee 2010-10-28 16:29:36

+0

@ beta是我可以修改應用程序。解析和理解腳本的整個邏輯應該駐留在應用程序 – excray 2010-10-28 17:15:50

回答

2

一個簡單的方法來構建一個解釋:

  • 定義解析器從語法的語言
  • 建立一個抽象語法樹AST
  • 應用訪問者的功能是遍歷序的AST和「執行」AST節點建議的操作。

一些AST節點將是「定義」的,例如,將聲明某個命名實體的存在,例如上面的「define proc onA」短語。典型地,動作是將指定的實體與內容相關聯,例如,形成三元組onA,proc,<主體> >,並將其存儲在由第一條目索引的符號表中。這使得找到這樣的定義更容易。以後,當你的事件過程遇到一個A事件時,你的應用程序知道在這個符號表中查找「onA」。當發現時,訪問者函數遍歷AST來執行其內容。您通常需要一個值棧來記錄中間表達式值,AST葉代表操作數(變量,常量)將值推送到堆棧上,操作符(+, - ,< =)將彈出的值關閉並計算新的結果推送。賦值操作將頂層堆棧值放入與標識符名稱關聯的符號表中。控制操作員(如果,確實)從堆棧頂部取值,並使用它們來指導下一步要執行的程序的哪一部分(例如,哪個子樹)。

所有這些都是衆所周知的,可以在大多數關於編譯器和解釋器的書中找到。彼得布朗的這本書是特別好的,儘管它看起來相對較舊:

Writing Interactive Interpreters and Compilers

1

必須有一些腳本語言的解釋器或編譯器。檢查它是否支持在C或C++中嵌入。大多數腳本語言都可以

接下來的選擇,或者也許是第一種,只是使用現有的編譯器/解釋器在外部運行腳本。

我想不出爲什麼前兩個選項中的一個選項不行,但如果不行的話,可以考慮使用ANTLR或小語言Boost Spirit構建一個解釋器。免責聲明:我沒有使用第一個,我只是嘗試了一個小型玩具的Boost Spirit例子。

乾杯&心連心,

PS:如果你可以選擇的腳本語言,可以考慮JavaScript和只使用谷歌的報道優秀嵌入API。

+0

從它的聲音來看,前兩種選擇不會做,因爲他發明了自己的腳本語言。我當然同意你的帖子腳本。 – JoshD 2010-10-28 16:19:49

+0

沒錯。這是我自己的語言 – excray 2010-10-28 17:14:24