我正在嘗試使用instaparse庫爲組織模式文件編寫解析器。該庫使用EBNF表示法並將其轉換爲解析函數。組織模式的文件使用線與星開始做大綱的頭條新聞,其中數星星設置在大綱樹的水平,這樣EBNF中的大綱模式
* Headline
** Sub headline1
** Sub headline2
我的第一次嘗試是把所有的頭條新聞上在同一水平結果樹:
(def outline
(insta/parser
"<S> = Headline-node *
Headline-node = Level <' '> Headline
Level = #'^\\*+'
Headline = #'\\S'+ <'\n'>"))
(outline "* Headline\n** Subheadline\n")
;=>
([:Headline-node [:Level "*"] [:Headline "H" "e" "a" "d" "l" "i" "n" "e"]]
[:Headline-node [:Level "**"] [:Headline "S" "u" "b" "h" "e" "a" "d" "l" "i" "n" "e"]])
也許我可以轉換樹後來把標題內的子標題。但我更願意從頭開始在標題內創建一個帶有小標題的樹。我到目前爲止唯一的想法是手動創建不同的級別,如下所示:
(def outline
(insta/parser
"<S> = Headline-node1 *
Headline-node1 = <#'^\\* '> Headline (Headline-node2)*
Headline-node2 = <#'^\\*\\* '> Headline
Headline = #'\\S'+ <'\n'>"))
(outline "* Headline\n** Subheadline\n")
;=>
([:Headline-node1 [:Headline "H" "e" "a" "d" "l" "i" "n" "e"]
[:Headline-node2 [:Headline "S" "u" "b" "h" "e" "a" "d" "l" "i" "n" "e"]]])
但是我想創建無限級別的標題。有沒有辦法在EBNF中傳達這一點?
你在這個項目中有多遠?我正在考慮爲組織模式文件編寫一個Instaparse解析器,似乎我必須自己編寫EBNF規範,因爲我無法爲組織模式找到一個。如果你已經開始了,我會很樂意爲你的項目做貢獻或者以其他方式爲你的項目做貢獻。 –