2016-11-27 85 views
1

我正在嘗試編寫grako風格的ebnf語法。我發現生成的解析器在嘗試解析正則表達式時似乎沒有超過空格或註釋。當涉及正則表達式時,在grako中處理空格

文檔說關於該主題

不像其他的表情下面,這一個不超過空白或意見前進。爲此,將正則表達式作爲自己規則中的唯一術語。

然後我創建了一個只有一個正則表達式規則的簡單語法。正則表達式也是該規則中的唯一術語。

@@eol_comments :: ?/(#[^\r\n]*)|(\/\/[^\r\n]*)/? 
@@comments :: ?/\s*\/\*(.|[\r\n])*?\*\//? 

Start  = NameList $; 
NameList = { Name } ; 
Name  = /[a-zA-Z_][a-zA-Z0-9_]+/ ; 

生成的解析器在輸入「abc \ ndef」和「abc \ ndef」上失敗。第一個在第一個換行符,空格或註釋中的第一個。

它只出現在正則表達式中,其他規則正常工作,例如,如果名字是一樣

Name  = 'abc' | 'def' ; 

定義,那麼一切都OK和上面的投入成功的解析。

如何更改行爲,使語法在空格和註釋上前進?

附加信息:上述輸入

痕跡:

<Start 
<1:1>abc 

<NameList<Start 
<1:1>abc 

<Name<NameList<Start 
<1:1>abc 

>'abc' /[a-zA-Z_][a-zA-Z0-9_]+/ 
<1:4> 

>Name<NameList<Start 
<1:4> 

<Name<NameList<Start 
<1:4> 

!'' /[a-zA-Z_][a-zA-Z0-9_]+/ 
<1:4> 

>NameList<Start 
<1:4> 

!Start 
<1:1>abc 

<Start 
<1:1> abc 

<NameList<Start 
<1:1> abc 

<Name<NameList<Start 
<1:1> abc 

!'' /[a-zA-Z_][a-zA-Z0-9_]+/ 
<1:1> abc 

>NameList<Start 
<1:1> abc 

!Start 
<1:1> abc 

我使用下面的命令產生的解析器:

grako --generate-parser --outfile parser.py test.ebnf 

我也嘗試使用-w選項(/ \ s + /和/ [\ t \ n \ r] + /但不會改變行爲)指定空白空間

然後使用以下命令啓動解析器:以大寫字母開頭

python parser.py eztest.txt Start -t 

回答

0

規則名稱在特殊Grako。正如文檔解釋的那樣,在開始解析之前,它們不會超越空白。

更改語法中的規則名稱,使它們以小寫字母開頭,並且應該沒問題。

爲什麼不把選擇駱駝或Python風格的規則名稱留給用戶?

  • 這是一個簡單和易於實現的設計選擇,允許很大的靈活性,在語言詞彙方面
  • 據預計,Python程序員將熟悉Python風格的名字
  • 計算機化語法和解析器的傳統是使用小寫規則名稱
+0

啊謝謝我忽略了這一點。在我學習正式語法的過程中,我們曾經使用AST的大型語法規則和小寫名稱來表示屬性。所以感覺自然喔寫規則「就像:這個」 –