私はperl正規表現で簡単な文法を練習しようとしています(これはプロダクション用ではなく、エディタのヒント/補完を提供するための簡単な分析です)。例えば、再帰的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 })
ブロックを使用して変数名をハッシュに保存してみることもできますが、これはバックトラックを考慮していません(変数が過去に戻っても割り当ての副作用が持続します)。
再帰的なマッチを含む、指定された名前のキャプチャグループによってキャプチャされたものをすべて取得する方法はありますか。あるいは、個々の部分を手作業で掘り下げて(そしてすべてのパターンを複製する)必要がありますか?
[Parse :: RecDescent](http://p3rl.org/Parse::RecDescent)または[Marpa :: R2](http://p3rl.org/Marpa::R2)を使用してください。 – choroba
観測: '} x;'の前の ')'は正規表現にマッチしません。 –
おっと、私は最初の行に開いたparenを忘れてしまった。私はそれを追加しました。 – Steve