Как сопоставить открывающие и закрывающие теги в Lark?

#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)