Je veux apprendre comment créer un arbre syntaxique abstrait pour des tuples imbriqués en utilisant une regexp Perl avec exécution de code embarqué. Je peux facilement programmer cela en utilisant une grammaire Perl 6 et je suis conscient que l'utilisation de modules d'analyse syntaxique simplifierait la tâche en Perl 5, mais je pense que pour des tâches aussi simples, je devrais être capable de le faire sans modules en apprenant comment traduire mécaniquement à partir des définitions de la grammaire. Je n'ai pas trouvé de moyen de déréférencer $^R, alors j'essaie d'annuler l'imbrication involontaire à la fin de la définition de la règle TUPLE, mais le résultat est incorrect, par exemple certaines sous-chaînes apparaissent deux fois.
use v5.10;
use Data::Dumper;
while (<DATA>) {
chomp;
/(?&TUPLE)(?{$a = $^R})
(?(DEFINE)
(?<TUPLE>
T \s (?&ELEM) \s (?&ELEM)
(?{ [$^R->[0][0],[$^R->[0][1],$^R[1]]] })
)
(?<ELEM>
(?: (a) (?{ [$^R,$^N] }) | \( (?&TUPLE) \) )
)
)/x;
say Dumper $a;
}
__DATA__
T a a
T (T a a) a
T a (T a a)
T (T a a) (T a a)
T (T (T a a) a) (T a (T a a))
La structure de données de sortie attendue est une liste imbriquée :
['a','a'];
['a',['a','a']];
[['a','a'],'a'];
[['a','a'],['a','a']];
[[['a','a'],'a'],['a',['a','a']]]
Pour référence, je vais également partager mon code Perl 6 fonctionnel :
grammar Tuple {
token TOP { 'T ' <elem> ' ' <elem> }
token elem { 'a' | '(' <TOP> ')'}
}
class Actions {
method TOP($/) {make ($<elem>[0].made, $<elem>[1].made)}
method elem($/) {make $<TOP> ?? $<TOP>.made !! 'a'}
}