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