Я пытаюсь написать парсер для файлов режима org, используя библиотеку instaparse. Эта библиотека принимает нотацию EBNF и превращает ее в функцию синтаксического анализа. Файлы Org-режим использует строки, начинающиеся со звездами, чтобы сделать заголовки контурные, где число звезд установить уровень в дереве набросков, как этотКонтурный режим в 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?
Как далеко вы попали в этот проект? Я просто ищу в написании парсера Instararse для файлов org-mode, и мне кажется, что мне нужно написать спецификацию EBNF, поскольку я не могу найти ее для org-mode. Я был бы рад внести свой вклад в ваш проект или работу с пулом каким-либо другим способом, если вы уже начали. –