2016-07-06 60 views
0

我們使用的當前標記在下面的部分中進行了演示。它主要是由於靈活性而創建的,但我們不介意改變它。ANTLR解析器對標記語言的建議

在最簡單的例子,我可以給,這裏是一些加價的:

interface Serial0/0/0:1 
description <<! variable, data_t1_port_size, Data T1 Port Size in kbps !>> kbps MPLS; <<!variable, data_t1_carrier_name, Data T1 Carrier Name !>>; Ckt <<! variable, data_t1_carrier_circuit_id, Data T1 Carrier Circuit ID !>> 
bandwidth <<! variable, data_t1_port_size, Data T1 Port Size in kbps !>> 

的標記語言的簡要註釋:

interface Serial0/0/0:1 (inline static config) 
description <<! variable, [variableValue], [variableDescription] !>> kbps MPLS; <<!variable, [variableValue], [variableDescription] !>>; Ckt <<! variable, [variableValue], [variableDescription] !>> 
bandwidth <<! variable, [variableValue], [variableDescription] !>> 

這是一個路由器配置。
用戶將通過填寫Web GUI中的值來輸入變量值( (顯示變量的標籤將會顯示,以便他們知道他們正在輸入什麼 )。

的最終目標是解析內聯變量,並 能夠產生這樣的:

interface Serial0/0/0:1 
description 1544 kbps MPLS; Verizon; Ckt 123456789 
bandwidth 1544 

我的問題是: 是否有可能在爲了做到這一點可以使用的通用標記語言(我們可以隨時更改模板)?

的要求將是:

  • 內嵌變量,其可以包括一個可變值和可變 描述
  • 對於-每個語言​​(在此未顯示出內類型的邏輯, 但是這將是很好能夠重複一次配置的次數)。

回答

0

我想你可能會發現ANTLR在這種情況下限制太多。對於編程語言而言,這很方便,而不是「不明確的文本」。

很多工作都需要完成。您必須決定這是否會在Lexer中完成(即,您是否以某種方式對上下文敏感),Parser或後期處理過程中。

例如,如果您決定「接口」將成爲語法中的保留關鍵字,則不得使用在描述部分中使用「接口」一詞。 這可能會讓用戶感到困惑。但另一方面,Lexer和Parser會很容易實現。 (當你強制描述符被雙引號時,這個問題的源頭會消失)。

所以我覺得ANTLR會在第一階段幫助你很多。當你在你的項目中進行多次迭代時,ANTLR非常方便,你必須多次重構解析器。

但另一方面,一些角落案例可能很難理清。

也許最好的方法是如何開始爲分析器準備(收集)一組更大的代表性輸入。

然後,您應該決定Lexer是否只識別特殊標籤(「<>」)或者它是否也支持關鍵字。強制引用字符串會使解析更容易,但我不知道用戶會對此感到滿意。PS:您也可以例如強制變量名以「$」(或「@」)開頭,以便在Lexing期間將其與其他任何內容區分開來。