cs2java.pl
CyanをJavaに移植するのに定型的作業はプログラムにやらせるほうが楽なので、
とネットでコンバータ探してみたのですがなかなか見つからないので作ってみました。
正規表現で作ってるだけなので適当にしかコンバートできないですが。
使い方
csファイルのあるディレクトリに置いて、実行するだけです。
csファイルを読み込んで同名のjavaファイルを吐き出します。
cs2java.pl
use strict; reflexiveFile('.'); sub reflexiveFile{ my $dir = shift; my @list = (); opendir(DIR, $dir) or die("Can not open directory:$dir ($!)"); @list = readdir(DIR); closedir(DIR); foreach my $file (sort @list){ next if( $file =~ /^\.{1,2}$/ ); if( -d "$dir/$file" ){ reflexiveFile("$dir/$file"); } else { if ($file =~ /\.cs$/) { print "$dir/$file\n"; open(DT, "$dir/$file"); my $data = join("",<DT>); $data = cs2java($data); close(DT); $file =~ s/\.cs$/.java/; open(DT, ">$dir/$file"); print DT $data; close(DT); } } } } sub cs2java { my $data = shift; $data =~ s/class\s+(\w+)\s+:/class $1 extends/g; $data =~ s/\bstring\b/String/g; $data =~ s/\busing\b/import/g; $data =~ s/\btoString\b/toString/g; $data =~ s/\bEquals\b/equals/g; $data =~ s/\s*\n\s*{/ {/g; if($data =~ s/\bDictionary\b/HashMap/g){ $data = "import java.util.HashMap;\n$data"; } if($data =~ /\bStack\b/){ $data = "import java.util.Stack;\n$data"; $data =~ s/\b\.Pop\b/.pop/g; $data =~ s/\b\.Peek\b/.peek/g; $data =~ s/\b\.Push\b/.push/g; } $data =~ s/import System\.IO;/import java.io.*;/g; $data =~ s/\bis\b/instanceof/g; if($data =~ s/\bTextReader\b/BufferedReader/g) { $data = "import java.io.BufferedReader;\n$data"; $data =~ s/\b\.Read\b/.read/g; $data =~ s/\b.Peek\b/.peek/g; } $data =~ s/(\[STAThread\])/\/* $1 *\//g; $data =~ s/static void Main/static void main/g; $data =~ s/bool/boolean/g; if ($data =~ /String.Format/) { $data = "import text.MessageFormat;\n$data"; $data =~ s/String.Format/MessageFormat.format/g; } $data =~ s/\s*:\s*base([^{]+)\s*{\n(\s*)/{\n$2this$1;\n$2/g; #String.Format => if ($data =~ /\bnamespace\b/) { print "namespace\n"; $data =~ s/\bnamespace\s*([^\s{]+)\s*{//g; my $package = $1; $data =~ s/^\t//mg; $data =~ s/}\s*$//; $data = "package $package;\n".$data; } $data = setterGetter($data); $data =~ s/foreach\s*\(([^)]+)in/for ($1:/g; sub ucsub { my $a = shift; $a =~ s/\b./uc$&/ge; $a; } sub lcsub { my $a = shift; $a =~ s/^./lc$&/ge; $a; } $data =~ s/([\w_\.]*?)([\w_]+)([\s\n]*\()/$1.lcsub($2).$3/ge; $data =~ s/(\.)([\w_]+)/$1.lcsub($2)/ge; $data =~ s/(new[\s\n]+[\w_\.]*?)([\w_]+)([\s\n]*\()/$1.ucsub($2).$3/ge; $data =~ s/(public|private|protected)([\s\n]+[\w_\.]*?)([\w_]+)([\s\n]*\()/$1.$2.ucsub($3).$4/ge; $data =~ s/(import)([\s\n]+[\w_\.]*?)([\w_]+)([\s\n]*;)/$1.$2.ucsub($3).$4/ge; $data; } sub setterGetter { my $data = shift; if(1){ while ($data =~ /\bset[\s\n]+{/) { my $prev = $`; my $affter = $'; if ($prev =~ /([^{};]+)\s+(\w+)\s*{[\n\s]*$/) { my $data1 = $1; my $data2 = $2; $data =~ s/\bset\s+{/$data1 set$data2($data2 value) {/; } else { if ($prev =~ /(\bget\s*{)/g) { $prev = $`; if ($prev =~ /([^{};]+)\s+(\w+)\s*{[\n\s]*$/) { my $data1 = $1; my $data2 = $2; # print "data1 = [[ $data1 ]];"; # print "data2 = [[ $data2 ]];"; $data =~ s/\bset\s+{/$data1 set$data2($data2 value) {/; next; } } print $prev; exit(0); } } } if(1){ while ($data =~ /\bget[\s\n]+{/) { my $prev = $`; my $affter = $'; if ($prev =~ /([^{};]+)\s+(\w+)\s*{[\n\s]*$/) { my $dta = $1; my $data2 = $2; my $p2 = $`; # print "data1 [[ $data1 ]]\n"; # print "data2 [[ $data2 ]]\n"; # if($data2 =~ /FileName/) { # exit(0); # } # $prev =~ s/\bget\s+{/$dta get$data2() {/; $data = $p2 . "/* prop */{ $dta get$data2() {$affter"; } else { print $prev; print "error get"; exit(0); } } } while($data =~ /(\/\* prop \*\/{)/) { my $p = $`; my $n = $'; my($a,$b,$out,$data2) = removeParen($n); $out =~ s/^\t//mg; $out =~ s/^(private|public|protected)/\t$1/mg; $data = $p . $out . $data2; } $data =~ s/(private|public|protected)[\s\n]+(private|public|protected)/$1/g; $data; } #print "$a;;; $out;;; $data"; sub removeParen { #print "removeParen"; my $data = shift; my $out = ""; my $lexreg = '^((([ \r\n\t]*)|(\#|\/\/)[^\r\n]*([ \r\n\t]+|$)|\/\*[.\r\n]*?\*\/)*)("(\\\\.|[^"])*"|[\(\)\[\]{}]|[^\(\)\[\]{}"'."'".'\s\r\n]+|$)'; while ($data =~ /$lexreg/) { # print "[[$1$6]]\n"; my $da = $1; my $dt = $6; $data = $'; if($dt eq ")" || $dt eq "}" || $dt eq "]") { return ($da,$dt,$out,$data); } $out .= "$da$dt"; if($dt eq "(" || $dt eq "{" || $dt eq "[") { my $start = $dt; my $end1; if ($start eq "(") { $end1 = ")"; } if ($start eq "[") { $end1 = "]"; } if ($start eq "{") { $end1 = "}"; } my ($da,$end, $out2, $data2) = removeParen($data); if($end1 ne $end) { print "paren error \n"; exit(0); } $data = $data2; $out .= $out2.$da.$end; } if("$da$dt" eq "") { return("",$data); } } }