Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/perl
- use POSIX;
- use strict;
- use Data::Dumper;
- sub gen_combination {
- my ($m,$n,$i) = @_;
- my $q = $i;
- my @res = ();
- for (my $j=0;$j<$n;$j++) {
- my $r = $q % $m;
- $q = int($q / $m);
- push(@res,$r);
- }
- return @res;
- }
- sub codegen {
- my ($m,$n,$comb_gen,$statements_ref) = @_;
- my @comb = @$comb_gen;
- my @res = ();
- for (@$statements_ref) {
- my %statement = %$_;
- if (!defined $statement{'t'}) {
- print "'t' not defined at statement\n" . Dumper(%statement) . "\n";
- return;
- }
- if (!defined $statement{'s'}) {
- print "'s' not defined at statement\n" . Dumper(%statement) . "\n";
- return;
- }
- my $t = $statement{'t'};
- my @s = @{$statement{'s'}};
- if ($t eq 'p') {
- push(@res,$s[0]);
- } elsif ($t eq 'a') {
- for (my $i=0;$i<$n;$i++) {
- my $p = $s[0];
- if (scalar(@s)>$comb[$i]) {
- $p = $s[$comb[$i]];
- }
- $p =~ s/%/$i/g;
- push(@res,$p);
- }
- } elsif ($t eq 'j') {
- if (!defined $statement{'j'}) {
- print "'j' is not defined at statement\n" . Dumper(%statement) . "\n";
- return;
- }
- my $j = $statement{'j'};
- my @ps = ();
- for (my $i=0;$i<$n;$i++) {
- my $p = $s[0];
- if (scalar(@s)>$comb[$i]) {
- $p = $s[$comb[$i]];
- }
- $p =~ s/%/$i/g;
- push(@ps,$p);
- }
- push(@res,join($j,@ps));
- } else {
- print "'t' is not one of 'p','a','j' at statement\n" . Dumper(%statement) . "\n";
- return;
- }
- }
- return join('',@res);
- }
- sub codegen_ {
- my ($m,$n,$comb_gen,$statements_ref) = @_;
- my @comb = @$comb_gen;
- my @res = ();
- for (@$statements_ref) {
- my @statement = @$_;
- my $t = $statement[0];
- my @s = @{$statement[1]} if scalar(@statement)>1;
- my $j = $statement[2] if scalar(@statement)>2;
- if ($t eq 'p') {
- push(@res,$s[0]);
- } elsif ($t eq 'j') {
- #if (!defined $j) {
- # print "'j' not defined at statement\n" . Dumper(@statement) . "\n";
- # return;
- #}
- $j = '' unless defined $j;
- my @ps = ();
- for (my $i=0;$i<$n;$i++) {
- my $p = $s[0];
- if (scalar(@s)>$comb[$i]) {
- $p = $s[$comb[$i]];
- }
- $p =~ s/%/$i/g;
- push(@ps,$p);
- }
- push(@res,join($j,@ps));
- } else {
- if (scalar(@statement)==1) {
- push(@res,$t);
- } else {
- print "'t' is not one of 'p','j' at statement\n" . Dumper(@statement) . "\n";
- return;
- }
- }
- }
- return join('',@res);
- }
- my $m = 2;
- my $n = 3;
- my $o = pow($m,$n);
- my @statement = ({'t'=>'a','s'=>['int a%; ','double a%; ']});
- for (my $i=0;$i<pow($m,$n);$i++) {
- my @comb = gen_combination($m,$n,$i);
- my @res = codegen($m,$n,\@comb,\@statement);
- print join('',@res) . "\n";
- }
- my @comb = gen_combination($m,$n,4);
- @statement = ({'t'=>'j','s'=>['int a%','double a%'],'j'=>', '});
- print "\n" . join('',codegen($m,$n,\@comb,\@statement)) . "\n";
- @statement = (
- {'t'=>'p','s'=>['QVariant mul(']},
- {'t'=>'j','s'=>['int r%, int c%','const QVariant& v%'],'j'=>', '},
- {'t'=>'p','s'=>["){\n"]},
- {'t'=>'a','s'=>["\tQVariant v%=data(index(r%,c%));\n",'']},
- {'t'=>'p','s'=>["\tif ("]},
- {'t'=>'j','s'=>["v%.isNull()"],'j'=>' || '},
- {'t'=>'p','s'=>[")\n\t\treturn QVariant();\n\treturn "]},
- {'t'=>'j','s'=>["v%.toDouble()"],'j'=>'*'},
- {'t'=>'p','s'=>[";\n}\n"]},
- );
- print "\n" . codegen($m,$n,\@comb,\@statement) . "\n";
- @statement = (
- ['p',['QVariant mul(']],
- ['j',['int r%, int c%','const QVariant& v%'],', '],
- ['p',["){\n"]],
- ['j',["\tQVariant v%=data(index(r%,c%));\n",''],''],
- ['p',["\tif ("]],
- ['j',["v%.isNull()"],' || '],
- ['p',[")\n\t\treturn QVariant();\n\treturn "]],
- ['j',["v%.toDouble()"],'*'],
- ['p',[";\n}\n"]]
- );
- print "\n" . codegen_($m,$n,\@comb,\@statement) . "\n";
- @statement = (
- ['QVariant mul('],
- ['j',['int r%, int c%','const QVariant& v%'],', '],
- ["){\n"],
- ['j',["\tQVariant v%=data(index(r%,c%));\n",'']],
- ["\tif ("],
- ['j',["v%.isNull()"],' || '],
- [")\n\t\treturn QVariant();\n\treturn "],
- ['j',["v%.toDouble()"],'*'],
- [";\n}\n"]
- );
- print "\n" . codegen_($m,$n,\@comb,\@statement) . "\n";
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement