【发布时间】:2013-12-21 08:04:57
【问题描述】:
我正在尝试使用 instaparse 库为 org 模式文件编写解析器。该库采用 EBNF 表示法并将其转换为解析函数。 org-mode 文件使用以星开始的行来制作大纲标题,其中星数设置大纲树中的级别,像这样
* 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 中传达这一点?
【问题讨论】:
-
你在这个项目中走了多远?我只是想为 org-mode 文件编写一个 Instaparse 解析器,看来我必须自己编写 EBNF 规范,因为我找不到 org-mode 的规范。如果您已经开始,我很乐意以其他方式为您的项目或联合工作做出贡献。