Advertisement
overloop

codegen.pl

Aug 5th, 2014
252
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 3.98 KB | None | 0 0
  1. #!/usr/bin/perl
  2.  
  3. use POSIX;
  4. use strict;
  5. use Data::Dumper;
  6.  
  7. sub gen_combination {
  8.     my ($m,$n,$i) = @_;
  9.     my $q = $i;
  10.     my @res = ();
  11.     for (my $j=0;$j<$n;$j++) {
  12.         my $r = $q % $m;
  13.         $q = int($q / $m);
  14.         push(@res,$r);
  15.     }
  16.     return @res;
  17. }
  18.  
  19. sub codegen {
  20.     my ($m,$n,$comb_gen,$statements_ref) = @_;
  21.     my @comb = @$comb_gen;
  22.     my @res = ();
  23.     for (@$statements_ref) {
  24.         my %statement = %$_;
  25.        
  26.         if (!defined $statement{'t'}) {
  27.             print "'t' not defined at statement\n" . Dumper(%statement) . "\n";
  28.             return;
  29.         }
  30.         if (!defined $statement{'s'}) {
  31.             print "'s' not defined at statement\n" . Dumper(%statement) . "\n";
  32.             return;
  33.         }
  34.        
  35.         my $t = $statement{'t'};
  36.         my @s = @{$statement{'s'}};
  37.        
  38.         if ($t eq 'p') {
  39.             push(@res,$s[0]);
  40.         } elsif ($t eq 'a') {
  41.             for (my $i=0;$i<$n;$i++) {
  42.                 my $p = $s[0];
  43.                 if (scalar(@s)>$comb[$i]) {
  44.                     $p = $s[$comb[$i]];
  45.                 }
  46.                 $p =~ s/%/$i/g;
  47.                 push(@res,$p);
  48.             }
  49.         } elsif ($t eq 'j') {
  50.             if (!defined $statement{'j'}) {
  51.                 print "'j' is not defined at statement\n" . Dumper(%statement) . "\n";
  52.                 return;
  53.             }      
  54.             my $j = $statement{'j'};
  55.             my @ps = ();
  56.             for (my $i=0;$i<$n;$i++) {
  57.                 my $p = $s[0];
  58.                 if (scalar(@s)>$comb[$i]) {
  59.                     $p = $s[$comb[$i]];
  60.                 }
  61.                 $p =~ s/%/$i/g;
  62.                 push(@ps,$p);
  63.             }
  64.             push(@res,join($j,@ps));
  65.         } else {
  66.             print "'t' is not one of 'p','a','j' at statement\n" . Dumper(%statement) . "\n";
  67.             return;
  68.         }
  69.        
  70.     }
  71.     return join('',@res);
  72. }
  73.  
  74. sub codegen_ {
  75.     my ($m,$n,$comb_gen,$statements_ref) = @_;
  76.     my @comb = @$comb_gen;
  77.     my @res = ();
  78.     for (@$statements_ref) {
  79.         my @statement = @$_;
  80.        
  81.         my $t = $statement[0];
  82.         my @s = @{$statement[1]} if scalar(@statement)>1;
  83.         my $j = $statement[2] if scalar(@statement)>2;
  84.        
  85.         if ($t eq 'p') {
  86.             push(@res,$s[0]);
  87.         } elsif ($t eq 'j') {
  88.             #if (!defined $j) {
  89.             #   print "'j' not defined at statement\n" . Dumper(@statement) . "\n";
  90.             #   return;
  91.             #}
  92.             $j = '' unless defined $j;
  93.            
  94.             my @ps = ();
  95.             for (my $i=0;$i<$n;$i++) {
  96.                 my $p = $s[0];
  97.                 if (scalar(@s)>$comb[$i]) {
  98.                     $p = $s[$comb[$i]];
  99.                 }
  100.                 $p =~ s/%/$i/g;
  101.                 push(@ps,$p);
  102.             }
  103.             push(@res,join($j,@ps));
  104.         } else {
  105.             if (scalar(@statement)==1) {
  106.                 push(@res,$t);
  107.             } else {
  108.                 print "'t' is not one of 'p','j' at statement\n" . Dumper(@statement) . "\n";
  109.                 return;
  110.             }
  111.         }
  112.     }
  113.     return join('',@res);
  114. }
  115.  
  116. my $m = 2;
  117. my $n = 3;
  118. my $o = pow($m,$n);
  119. my @statement = ({'t'=>'a','s'=>['int a%; ','double a%; ']});
  120. for (my $i=0;$i<pow($m,$n);$i++) {
  121.     my @comb = gen_combination($m,$n,$i);
  122.     my @res = codegen($m,$n,\@comb,\@statement);
  123.     print join('',@res) . "\n";
  124. }
  125.  
  126. my @comb = gen_combination($m,$n,4);
  127. @statement = ({'t'=>'j','s'=>['int a%','double a%'],'j'=>', '});
  128. print "\n" . join('',codegen($m,$n,\@comb,\@statement)) . "\n";
  129.  
  130. @statement = (
  131. {'t'=>'p','s'=>['QVariant mul(']},
  132. {'t'=>'j','s'=>['int r%, int c%','const QVariant& v%'],'j'=>', '},
  133. {'t'=>'p','s'=>["){\n"]},
  134. {'t'=>'a','s'=>["\tQVariant v%=data(index(r%,c%));\n",'']},
  135. {'t'=>'p','s'=>["\tif ("]},
  136. {'t'=>'j','s'=>["v%.isNull()"],'j'=>' || '},
  137. {'t'=>'p','s'=>[")\n\t\treturn QVariant();\n\treturn "]},
  138. {'t'=>'j','s'=>["v%.toDouble()"],'j'=>'*'},
  139. {'t'=>'p','s'=>[";\n}\n"]},
  140. );
  141. print "\n" . codegen($m,$n,\@comb,\@statement) . "\n";
  142.  
  143. @statement = (
  144. ['p',['QVariant mul(']],
  145. ['j',['int r%, int c%','const QVariant& v%'],', '],
  146. ['p',["){\n"]],
  147. ['j',["\tQVariant v%=data(index(r%,c%));\n",''],''],
  148. ['p',["\tif ("]],
  149. ['j',["v%.isNull()"],' || '],
  150. ['p',[")\n\t\treturn QVariant();\n\treturn "]],
  151. ['j',["v%.toDouble()"],'*'],
  152. ['p',[";\n}\n"]]
  153. );
  154. print "\n" . codegen_($m,$n,\@comb,\@statement) . "\n";
  155.  
  156. @statement = (
  157. ['QVariant mul('],
  158. ['j',['int r%, int c%','const QVariant& v%'],', '],
  159. ["){\n"],
  160. ['j',["\tQVariant v%=data(index(r%,c%));\n",'']],
  161. ["\tif ("],
  162. ['j',["v%.isNull()"],' || '],
  163. [")\n\t\treturn QVariant();\n\treturn "],
  164. ['j',["v%.toDouble()"],'*'],
  165. [";\n}\n"]
  166. );
  167. print "\n" . codegen_($m,$n,\@comb,\@statement) . "\n";
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement