2014-10-09 44 views
0

我有一個包含一個ABNF語法與標籤,如在這個簡化的例子文件:讀/解析ABNF語法在C標籤++

$name = Bertha {userID=013} | Bob {userID=429} | (Ben | Benjamin) {userID=265}; 
$greet = Hi | Hello | Greetings; 

$S = $greet $name; 

現在的任務是通過解析獲取用戶ID這個語法的一個給定的句子。例如,分析句子

Greetings Bob 

應該給我們的用戶ID 429.語法必須在運行時讀取,因爲它們可以運行之間改變。

我現在的做法是:

  1. 解析語法到一個或多個樹,把標籤在它們屬於

  2. 葉子或節點解析句子本/那些樹構造一棵樹,創建給定的句子(我正在考慮使用Earley爲此)

  3. 使用此樹來獲取標籤(不同於示例中,會有多個不同的標籤如此ree)

    我的問題是,是否有任何軟件組件可以使用或至少修改來解決此任務?特別是第1步和第2步似乎是非常通用的(1.將ABNF語法讀入C++內部表示(例如樹); 2.使用內部表示從1開始的早期算法(或類似的東西)對於第1步來說,完整的,防故障的ABNF分析器將是一項非常耗時的任務。

我知道VoiceXML語法是這樣工作的,但我無法找到它們的解析器。基本上所有我能找到的都是解析器生成器,它將爲單個語法生成C++代碼,這對我來說不實用,因爲語法在編譯時不知道。

任何想法?

回答

1

早在2001年,我寫了一個C++庫,它將根據運行時指定的規則生成解析器。它在SourceForge as project BuildParse上有LGPL許可證。我已經在其他幾個項目中使用過它,並且我在2009年將其更新爲使用C++。如果解析器速度很快,它可能適用於您,或者爲您節省一些工作量。

基本上,您需要解析器來將語法解析爲buildparse使用的數據結構(您也可以使用buildparse),然後運行buildparse解析器生成器以生成可識別令牌的內容。