Sto provando a scrivere una semplice grammatica con un'espressione regolare perl (nota che questo non è destinato all'uso in produzione, ma solo un'analisi rapida per fornire suggerimenti/completamenti dell'editor). Per esempio,Come accedere ai gruppi catturati da espressioni rege perl ricorsive?
my $GRAMMAR = qr{(?(DEFINE)
(?<expr> \((?&expr) \) | (?&number) | (?&var) | (?&expr) (?&op) (?&expr))
(?<number> \d++)
(?<var> [a-z]++)
(?<op> [-+*/])
)}x;
Vorrei essere in grado di eseguire questo come
$expr =~ /$GRAMMAR(?&expr)/;
e poi accedere a tutti i nomi delle variabili. Tuttavia, secondo perlre,
Nota che i gruppi di cattura abbinati all'interno della ricorsione non sono accessibili dopo il ritorno della ricorsione, quindi l'ulteriore livello di gruppi di cattura è necessario. Pertanto $ + {NAME_PAT} non verrebbe definito anche se $ + {NAME} sarebbe.
Quindi a quanto pare questo non è possibile. Potrei provare a usare un blocco (?{ code })
per salvare i nomi delle variabili in un hash, ma questo non rispetta il backtracking (cioè l'effetto collaterale dell'assegnazione persiste anche se la variabile è backtracked oltre).
C'è un modo per ottenere tutto catturato da un determinato gruppo di acquisizione con nome, comprese le partite ricorsive? O ho bisogno di scavare manualmente attraverso i singoli pezzi (e quindi duplicare tutti i modelli)?
Usa [Parse :: RecDescent] (http://p3rl.org/Parse::RecDescent) o [Marpa :: R2] (http://p3rl.org/Marpa::R2). – choroba
Osservazione: il ')' prima della} x ';' non ha corrispondenza nella regex. –
Ops, ho dimenticato una parentesi aperta sulla prima riga. Ho aggiunto che. – Steve