C'est fou ,tout ce que l'on peut faire en quelques lignes de Perl6 ...
Mon code :
le resultat :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 #!/opt/rakudo-star-2016.10/bin/perl6 use v6; #use Grammar::Tracer; grammar NVL { rule TOPNVL { <main>* <textfin> } rule main { <text> <nvl> } regex text {:s .+?} rule nvl {:i <nvltxt> <paraIn> <expr1> <comma> <expr2> <paraOut> } regex expr1 {:s .+?} regex expr2 {<nvl>|<expr2txt> } regex expr2txt {.+?} regex textfin {:s .+ } regex comma {',' } regex paraIn {'('} regex nvltxt {:i 'nvl'\s* } regex paraOut {')'} token ws { <!ww> } } ### Parsing my $cbl = "select nvl(toto,nvl(titi,tata) ) from dual "; say NVL.parse($cbl, rule => 'TOPNVL'); -bash-4.2$
「select nvl(toto,nvl(titi,tata) ) from dual 」
main => 「select nvl(toto,nvl(titi,tata)」
text => 「select 」
nvl => 「nvl(toto,nvl(titi,tata)」
nvltxt => 「nvl」
paraIn => 「(」
expr1 => 「toto」
comma => 「,」
expr2 => 「nvl(titi,tata」
expr2txt => 「nvl(titi,tata」
paraOut => 「)」
textfin => 「 ) from dual 」
Le pb, c'est que cela ne marche pas.
on a
main => 「select nvl(toto,nvl(titi,tata)」
au lieu de
main => 「select nvl(toto,nvl(titi,tata))」
Il manque une parenthèse fermante (que je retrouve dans textfin) ... du coup nvl(titi,tata ne peut pas correspondre à la régle nvl ...
Mais je bloque sur la façon de garder cette parenthèse fermante dans le main...
J'ai peur qu'il s'agisse d'un problème de conception de ma grammaire.
Voilà, si vous avez une idée...
Merci pour votre aide.
Bien cordialement,
Partager