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 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
| 6
#!/opt/rakudo-star-2016.10/bin/perl6
use v6;
grammar DECODE {
rule TOPDECODE { [<main>]* [<textfin>]? }
rule main { <text> <decode> }
rule decode {:i <decodeinstr> <paraIn> <val> <whenthen>+ [<comma> <else>]? <paraOut> }
regex decodeinstr {:i 'decode'\s* }
regex val {:s <decode>
|<expr> }
regex whenthen {:i <comma> <when> <comma> <then> }
regex when {:s <decode>
| <expr> }
regex then {:s <decode>
|<expr> }
regex else {:s <decode>
|<expr> }
regex text {:s .+? }
regex textfin {:s .+ }
regex comma {\s*','\s* }
regex paraIn {\s*'('\s*}
regex paraOut {\s*')'\s*}
token ws { <!ww> }
regex expr {:s <mot1>*
| [<mot1><paraIn><mot>*<paraOut>]*
| [<paraIn><mot>*<paraOut>]*
}
regex mot { <-[()]>+? }
regex mot1 { <-[(),]>+? }
}
class Decode {
method TOPDECODE ($TOPDECODE) {
my $result ~= $_.made for $TOPDECODE<main>;
if ($TOPDECODE<textfin>) {
$result ~= $TOPDECODE<textfin>;
}
$TOPDECODE.make($result);
}
method main ($main) {
$main.make($main<text> ~ $main<decode>.made) ;
}
method decode ($decode) {
my $resuD ~= ' CASE ' ~ $decode<val>.made ;
$resuD ~= $_.made for $decode<whenthen> ;
if $decode<else> {
$resuD ~= $decode<else>.made ~ ' END ' ;
}
else {
$resuD ~= ' END ' ;
}
$decode.make($resuD) ;
}
method val ($val) {
my $resuVal;
if $val<decode> {
$resuVal = $val<decode>.made ;}
else {
$resuVal = $val<expr> ;
}
$val.make($resuVal);
}
method whenthen ($whenthen) {
my $resuWT ~= " when " ~ $whenthen<when>.made ~ " then " ~ $whenthen<then>.made ;
$whenthen.make($resuWT) ;
}
method then ($then) {
my $resuThen;
if $then<decode> {
$resuThen = $then<decode>.made ;}
else {
$resuThen = $then<expr> ;
}
$then.make($resuThen);
}
method when ($when) {
my $resuWhen;
if $when<decode> {
$resuWhen = $when<decode>.made ;}
else {
$resuWhen = $when<expr> ;
}
$when.make($resuWhen);
}
method else ($else) {
my $resuElse;
if $else<decode> {
$resuElse = $else<decode>.made ;}
else {
$resuElse = $else<expr> ;
}
$else.make(' else ' ~ $resuElse);
}
}
my $cbl = "SELECT decode(val,exp1,exp2,exp3,exp4,nvl(exp5,'VIDE')) from toto " ;
say DECODE.parse($cbl, rule => 'TOPDECODE',actions => Decode).made;
$cbl = "SELECT decode(val,exp1,exp2,exp3,exp4,nvl(exp5,'VIDE')) from toto order by decode(val,exp1,exp2,exp3,exp4,nvl(exp5,'VIDE'))" ;
say DECODE.parse($cbl, rule => 'TOPDECODE',actions => Decode).made; |
Partager