Grammar-Kit от JetBrains

hell0w0rd

Продвинутый новичок
Кто-то разбирался с их грамматикой для парсера?
У меня всего пара вопросов:
что такое pin
extends(".*expr")=expr - зачем это делать
Код:
arg_list ::= '(' [ !')' expr  (',' expr) * ] ')' {pin(".*")=1}
Является ли это правило аналогом
Код:
arg_list ::= '(' expr_list ')'
expr_list ::= expr (',' expr_list)*
И если да - зачем существует первый вариант, чем он лучше кроме отсутствия второго правила?
 

AnrDaemon

Продвинутый новичок
Что такое пин я не знаю, а по правилу - да. Первый вариант существет (формально) для коротких незаморочных конструкций.
Но в указаном варианте больше подходит второй. Только поправь его до
Код:
expr_list ::= expr (',' expr)*
 

hell0w0rd

Продвинутый новичок
Зачем править? меня интересует рекурсия, аргументов может быть сколько угодно.. в общем я так понял это другой синтаксис для описания рекурсивных правил
 

AnrDaemon

Продвинутый новичок
Рекурсия в ABNF не допускается. Только итерация.
В оригинальном определении ещё одна проблема, которую я поначалу не углядел.
Код:
'(' [ !')' expr  (',' expr) * ] ')'
дословно означает "скобки, в которых может быть выражение, не начинающееся со скобки, но его может и не быть, тогда скобки будут пустые".
В итоге определение противоречит самому себе. после скобки не может идти скобка, но выражения там может и не быть.
Но это же дурдом. Должно быть отдельное описания синтаксиса "выражения", указывающее, что оное выражение не может начинаться со скобки, в результате это всё упрощается до
Код:
arg_list ::= '(' [ expr  (',' expr) * ] ')' {pin(".*")=1}
Согласись, такое гораздо легче читать?
 
Последнее редактирование:

hell0w0rd

Продвинутый новичок
Хз, это пример от JetBrains, к сожалению мне не хватает знаний для споров о возможности рекурсии, но вот это правило
Код:
arg_list ::= '(' expr_list ')'
expr_list ::= expr (',' expr_list)*
явно рекурсивно, подобным правилом можно описать списки аргументов, elseif-ов, case-ов в switch и тд.
 

AnrDaemon

Продвинутый новичок
Нет. * - любое количество повторений. От нуля и больше.
 

hell0w0rd

Продвинутый новичок
AnrDaemon, да, ты прав. Но на счет рекурсии - не прав. Во всяком случае касательно этого парсера, он рекурсию поддерживает.
pin, на сколько я понял указывает на каком месте внутри грамматики останавливаться и показывать ошибку
 

AnrDaemon

Продвинутый новичок
В общем, любопытный проект. Я как-то искал нечто подобное. Спасибо за ссылку.
 
Сверху