Ich versuche, eine einfache Grammatik mit einer Perl-Regex zu verschachteln (beachten Sie, dass dies nicht für den produktiven Einsatz gedacht ist, sondern nur eine schnelle Analyse für die Bereitstellung von Editor-Hinweisen/Vervollständigungen). Zum Beispiel würdeWie kann man auf Gruppen zugreifen, die von rekursiven Perl-Regexes erfasst wurden?
my $GRAMMAR = qr{(?(DEFINE)
(?<expr> \((?&expr) \) | (?&number) | (?&var) | (?&expr) (?&op) (?&expr))
(?<number> \d++)
(?<var> [a-z]++)
(?<op> [-+*/])
)}x;
Ich mag Lage sein, dies zu laufen als
$expr =~ /$GRAMMAR(?&expr)/;
und dann Zugriff auf alle Variablennamen. Doch nach perlre,
anzumerken, dass capture Gruppen innerhalb der Rekursion abgestimmt sind nicht zugänglich, nachdem die Rekursion zurückkehrt, so dass die zusätzliche Schicht aus einfangenden Gruppen notwendig ist. Daher würde $ + {NAME_PAT} nicht definiert, obwohl $ + {NAME} wäre.
Also anscheinend ist das nicht möglich. Ich könnte versuchen, einen (?{ code })
Block zu verwenden, um Variablennamen in einem Hash zu speichern, aber dies berücksichtigt Backtracking nicht (d. H. Der Nebeneffekt der Zuweisung bleibt auch bestehen, wenn die Variable zurückverfolgt wird).
Gibt es eine Möglichkeit, alles zu erfassen, das von einer bestimmten benannten Erfassungsgruppe erfasst wurde, einschließlich rekursiver Übereinstimmungen? Oder muss ich die einzelnen Stücke manuell graben (und damit alle Muster kopieren)?
Verwenden Sie [Parse :: RecDescent] (http://p3rl.org/Parse::RecDescent) oder [Marpa :: R2] (http://p3rl.org/Marpa::R2). – choroba
Beobachtung: das ')' vor dem '} x;' hat keine Übereinstimmung in der Regex. –
Hoppla, ich habe in der ersten Zeile einen offenen Paren vergessen. Ich habe es hinzugefügt. – Steve