Я пытаюсь проложить простую грамматику с регулярным выражением perl (обратите внимание, что это не предназначено для использования в производстве, просто быстрый анализ для предоставления рекомендаций/дополнений редактора). Например,
my $GRAMMAR = qr{(?(DEFINE)
(?<expr> \( (?&expr) \) | (?&number) | (?&var) | (?&expr) (?&op) (?&expr) )
(?<number> \d++ )
(?<var> [a-z]++ )
(?<op> [-+*/] )
)}x;
Я хотел бы иметь возможность запускать это как
$expr =~ /$GRAMMAR(?&expr)/;
а затем получить доступ ко всем именам переменных. Однако, согласно perlre,
Обратите внимание, что группы захвата, согласованные внутри рекурсии, недоступны после возвращения рекурсии, поэтому необходим дополнительный уровень групп захвата. Таким образом, $+ {NAME_PAT} не будет определен, даже если $+ {NAME} будет.
Так что, по-видимому, это невозможно. Я мог бы попытаться использовать блок (?{ code })
, чтобы сохранить имена переменных в хэш, но это не относится к обратному отслеживанию (т.е. Побочный эффект присваивания сохраняется, даже если переменная возвращается назад).
Есть ли способ получить все захваченные данной группой захвата, включая рекурсивные совпадения? Или мне нужно вручную вырыть отдельные части (и, таким образом, дублировать все шаблоны)?