#python #parsing #ebnf #lark-parser
#python #синтаксический анализ #ebnf #lark-анализатор
Вопрос:
Я пытаюсь создать анализатор, используя Lark для коротких кодов WordPress. Самозакрывающиеся теги в языке не имеют отличительных особенностей от стандартных открывающих тегов, вызывая некоторую двусмысленность даже в совершенно корректном синтаксисе. У меня это в основном работает, но я изо всех сил пытаюсь сопоставить открывающие и закрывающие теги друг с другом.
Следующий пример содержит самозакрывающийся тег [a] и тег [b] [/b] с открытым текстовым содержимым:
[a][b] content [/b]
Соответствующая часть моего определения языка выглядит следующим образом:
shortcode: shortcode_template{shortcode_name, attribute_list} | "[" shortcode_name attribute_list "]"
shortcode_template{name, attrs}: "[" name attrs "]" value "[/" name "]"
shortcode_name: /[^[]<>amp;/s] /
Я ожидал, что использование шаблона для варианта открывающего / закрывающего тега будет делать что-то похожее на групповую логику регулярных выражений, например "[" (name) attrs "]" value "[/" $1 "]"
, но это только кажется, что te распаковывается, в "[" shortcode_name attribute_list "]" value "[/" shortcode_name "]"
результате чего приведенный выше текст будет проанализирован как:
value
shortcode
shortcode_template
shortcode_name a
attribute_list
value
shortcode
shortcode_name b
attribute_list
shortcode_name b
Есть ли возможность сообщить Lark, что значение name в открывающем теге должно совпадать со значением name в закрывающем теге?
Комментарии:
1. Нет, это невозможно. То, что у вас есть, не является CFG (контекстно-свободная грамматика), и его нелегко разобрать с помощью Lark. Возможно, вы сможете творить чудеса с помощью Postlexer / CustomLexer, но, вероятно, проще просто написать свой собственный синтаксический анализатор / попытаться повторно использовать существующий синтаксический анализатор (возможно, анализатор XML?) / Используя другую библиотеку синтаксического анализатора.
2. Я понимаю. Существует ли термин для грамматики, который не является контекстно-свободным? Какую функцию мне нужно будет искать в библиотеке синтаксического анализа, чтобы иметь возможность анализировать что-то подобное?
3. Контекстно-зависимая грамматика (CSG). Я не знаю ни одной хорошей библиотеки, но библиотека PEG могла бы это сделать. (или что-то вроде pyparsing)