私は単純な文法を perl 正規表現で変更しようとしています (これは本番環境での使用を意図したものではなく、エディターのヒント/補完を提供するための簡単な分析にすぎないことに注意してください)。例えば、
my $GRAMMAR = qr{(?(DEFINE)
(?<expr> \( (?&expr) \) | (?&number) | (?&var) | (?&expr) (?&op) (?&expr) )
(?<number> \d++ )
(?<var> [a-z]++ )
(?<op> [-+*/] )
)}x;
これを次のように実行できるようにしたい
$expr =~ /$GRAMMAR(?&expr)/;
次に、すべての変数名にアクセスします。ただし、perlreによると、
再帰内で一致したキャプチャ グループは、再帰が戻った後はアクセスできないことに注意してください。そのため、キャプチャ グループの追加レイヤーが必要です。したがって、$+{NAME} は定義されますが、$+{NAME_PAT} は定義されません。
したがって、明らかにこれは不可能です。ブロックを使用して(?{ code })
変数名をハッシュに保存することもできますが、これはバックトラッキングを尊重しません (つまり、変数が過去にバックトラックされても、代入の副作用は持続します)。
再帰的な一致を含め、特定の名前付きキャプチャ グループによってすべてをキャプチャする方法はありますか? それとも、個々のピースを手動で掘り下げる (したがって、すべてのパターンを複製する) 必要がありますか?