#!/usr/bin/perl
open(F,'< '.$ARGV[0]);
our $indent=2;
our $indenting=1;
our @context=("none");
sub pin{
print " " x ($indent*$indenting).shift(@_);
}
sub parseit{
$_=shift(@_);
if(/SI (.*) ALORS/){
push(@context,"cond");
print "//PC:$&\n";
pin "if (";
$indenting=0;
parseit($1);
$indenting=1;
pin "){\n";
$indent++;
}elsif(/TANT QUE (.*) FAIRE/){
print "//PC:$&\n";
pin "while (";
push(@context,"cond");
parseit($1);
pin "){\n";
$indent++;
}elsif(/POUR (.*) DE (.*) A (.*) PAR PAS DE (.*) FAIRE/){
print "//PC:$&\n";
pin "for($1=$2;$1<=$3;$1+=$4){\n";
$indent++;
}elsif(/POUR (.*) DE (.*) A (.*) FAIRE/){
print "//PC:$&\n";
pin "for($1=$2;$1<=$3;$1++){\n";
$indent++;
}elsif(/FIN SI/ or /FIN TANT QUE/ or /FIN POUR/){
$indent--;
pop(@context);
pin "}";
print "//PC:$&\n";
}elsif(/(.*) ET (.*)/){
$indenting=0;
parseit($1);
print " && ";
parseit($2);
$indenting=1;
}elsif(/(.*) OU (.*)/){
$indenting=0;
parseit($1);
print " || ";
parseit($2);
$indenting=1;
}elsif(/(.*) ?= ?(.*)/){
$indenting=0;
parseit($1);
print "== ";
$indenting=0;
parseit($2);
$indenting=1;
}elsif(/(.*) ?% ?(.*)/){
print " Maths.mod(";
$indenting=0;
parseit($1);
print ",";
$indenting=0;
parseit($2);
print ") ";
$indenting=1;
}elsif(/(\w*) ?<- ?(.*)/){
pin $1."=";
$indenting=0;
push(@context,"aff");
parseit($2);
pop(@context);
$indenting=1;
print ";\n";
}elsif(/(\w*) ?: ?Entier/){
print "//PC:$&\n";
pin "int ".$1.";\n";
}elsif(/(\w*) ?: ?Booléen/){
print "//PC:$&\n";
pin "boolean ".$1.";\n";
}elsif(/(\w*) ?: ?Chaîne/){
print "//PC:$&\n";
pin "String ".$1.";\n";
}elsif(/AFFICHER (.*)/){
pin "System.out.println(";
$indenting=0;
parseit($1);
$indenting=1;
print ");\n";
}else{
pin $_;
}
}
print "class ${ARGV[1]} {\n";
print " public static void main(String args[]){\n";
while(<F>){
parseit($_);
}
print" }\n";
print "}\n";
close F;