| Code Perl |
sub wsWrite {local($appel,$x,$IN) = @_;
if ($toJs eq "true") {return $x}
if($appel eq "imed"){
if (substr($x,0,2) eq "//") {$x = "#".substr($x,2)}; return $x;
}elsif($appel eq "nom"){
$x =~ s/\[/{/gi; $x =~ s/\]/}/gi; return $x;
}elsif($appel eq "ref"){
local $y = '';
if (substr($x,0,4) eq 'var ') {$y = 'local '; $x = substr($x,4)}
if (substr($$IN,0,1) eq "[") {$x = '@'.$x} elsif (substr($$IN,0,1) eq "(") {$x = '%'.$x} else {$x = '$'.$x}
$x = $y.$x; return $x;
}elsif($appel eq "use"){
$x = &wsWrite("nom",$x);
if (substr($$IN,0,1) eq "[") {$x = '@{$'.$x.'}'} elsif (substr($$IN,0,1) eq "(") {$x = '%{$'.$x.'}'} else {$x = '$'.$x}
return $x;
}elsif($appel eq "val"){
if (substr($x,0,1) eq "[") {$x = '('.substr($x,1,length($x)-2).')'}; return $x;
}elsif($appel eq "void"){
$x = "()"; return $x;
}elsif($appel eq "recons"){
local $y = ''; local($y1,$nom);
while($x=~/(\w+)(,|;)/) {
$nom = $1; $y1 = $2; $x = substr($x,length($nom)+1);
if ($$IN=~/\"(.)$nom\"/) {$y .= $1.$nom.$y1}
}; return $y;
}}
sub writeVar {local($nom,$IN,$LISTE) = @_;
local $x = '';
if ($nom!~/^(\w+)\W/) {
$x .= &wsWrite("ref",'var '.$nom,$IN).' = '.&wsWrite("val",$$IN).';'."\n";
return $x
}
if (index($$LISTE,';'.$1.';')==-1) {
$$LISTE .= $1.';';
local $In = "()";
$x .= &wsWrite("ref",'var '.$1,\$In).' = '.&wsWrite("val",&wsWrite("void",'new Array()')).'; ';
}
$x .= &wsWrite("use",$nom,$IN).' = '.&wsWrite("val",$$IN).';'."\n";
return $x
}
sub writeVal {local($x) = @_;
if ($x eq "") {return "\"\""};
$x =~ s/\\\/\\#/\/#/gi;
$x =~ s/\\/\\\\/gi;
if ($toJs eq "false") {
$x =~ s/\$/\\\$/gi; $x =~ s/\@/\\\@/gi; $x =~ s/\%/\\\%/gi; $x =~ s/\&/\\\&/gi;
}
$x =~ s/\n/\\n/gi; $x =~ s/\"/\\\"/gi; $x =~ s/\'/\\\'/gi;
return "\"".$x."\"";
}
sub wsImportVar {local($nom,$val,$LISTE) = @_;
local $In = '';
$In = &writeVal($val);
return &writeVar($nom,\$In,$LISTE);
}
sub wsImportVal {local($To,$TAB,$CHP,$idx,$LISTE) = @_;
local($k,$i,$nom,$In,$Out);
local($y1,$Struct,$Liste);
local $x='';
if (!(defined $idx)) {$idx = ""; $LISTE = (';')};
$y1 = ""; $Struct = ''; $Liste = $$LISTE;
$nom = "/#T"; if (defined $$TAB{$nom}) {$x .= &wsWrite("imed",$$TAB{$nom})."\n"}
for($k=0;$k<scalar(@{$CHP});$k++) {
$nom = $$CHP[$k];
if (defined $$TAB{$nom}) {
$In = $$TAB{$nom}; $Out = '';
if (($i=&wsImportRec(0,$nom.$idx,$TAB,\$In,\$Out,\$Struct,()))!=0) {return ''};
} else {
$Out = '""';
}
$x .= &writeVar($nom.$idx,\$Out,\$Liste);
$y1 .= ','.&writeVal(&wsWrite("ref",$nom,\$Out));
}
$Struct = &wsWrite("recons",$Struct,($y1));
$Out = '['.&writeVal($Struct).$y1.']';
$x .= &writeVar($To.$idx,\$Out,\$Liste);
$$LISTE = $Liste;
return $x;
}
sub wsImportRec {local($n,$nom,$TAB,$IN,$OUT,$STRUCT,@Tparm) = @_;
local $x = $$IN;
local($i,$k,$Type,@Parm,$cas);
local($Out);
$Type = 0; @Parm = ();
if (($i=&wsImportStruct($TAB,$IN,\$Type,\@Parm))!=0) {return $i}; $cas = $Type; $$IN = $x;
if (($cas!=1)&&(scalar(@Tparm)!=0)) {return 21};
if ($cas==0) {
$x = $$IN; $k = index($x,"/#"); if ($k==-1) {$k = length($x)};
$$OUT .= &writeVal(substr($x,0,$k)); $x = substr($x,$k);
} elsif ((($cas==1)&&(scalar(@Tparm)==0))||(($cas==2)&&(scalar(@Parm)==0))) {
$Out = '';
while(true) {
$x = $$IN; if ($x ne "") {$x =~ s/^\s*//};
if (($x eq '')||(substr($x,0,2) eq "/#")) {last};
$Type = 0; @Parm = ();
if (($i=&wsImportStruct($TAB,$IN,\$Type,\@Parm))!=0) {return $i};
if ($Type!=$cas) {return 22};
if ($$IN!~/^\s*\/#L/) {return 22}
if (($i=&wsImportArray1($n,$nom,$TAB,$IN,\$Out))!=0) {return $i};
}
if ($n==0) {
$x = $nom; $x =~ s/^(\w+).*/$1/; if ($cas==2) {$x .= ',1'};
$$STRUCT .= $x.';';
}
$$OUT .= '['.substr($Out,1).']';
} else {
$$OUT .= &wsWrite("void",'new Array()');
while(true) {
$x = $$IN; if ($x ne "") {$x =~ s/^\s*//};
if (($x eq '')||(substr($x,0,2) eq "/#")) {last};
$Type = 0; @Parm = ();
if (($i=&wsImportStruct($TAB,$IN,\$Type,\@Parm))!=0) {return $i};
if ($Type!=$cas) {return 22};
if ($n==0) {
$x = $nom; $x =~ s/^(\w+).*/$1/; for($i=0;$i<scalar(@Parm);$i++) {$x .= ','.$Parm[$i]};
$$STRUCT .= $x.';';
}
if (($i=&wsImportArray($n,$nom,$TAB,$IN,$OUT,(($cas==2)?@Parm:@Tparm)))!=0) {return $i};
}
}
$$IN = $x; return 0;
}
sub wsImportStruct {local($TAB,$IN,$TYPE,$PARM) = @_;
local $x = $$IN;
local($k);
if ($x ne "") {$x =~ s/^\s*//};
if (substr($x,0,3) ne "(#L") {$$TYPE = 0; return 0}
if (substr($x,0,4) eq "(#L)") {$$IN = "/#L)".substr($x,4); $$TYPE = 1; return 0}
if (substr($x,0,4) eq "(#L:") {$$IN = "/#L:".substr($x,4); $$TYPE = 1; return 0}
if (substr($x,0,4) ne "(#L(") {return 11}; $x = substr($x,4); $k = index($x,")");
if ($k==-1) {return 12}; if (substr($x,0,$k) eq "1") {@{$PARM} = ()} else {@{$PARM} = split(/\/#/,substr($x,0,$k))}; $x = substr($x,$k+1);
for($k=0;$k<scalar(@{$PARM});$k++) {if (!(defined $$TAB{$$PARM[$k]})) {return 13}}
if (substr($x,0,1) eq ")") {$$IN = "/#L)".substr($x,1); $$TYPE = 2; return 0}
if (substr($x,0,1) eq ":") {$$IN = "/#L:".substr($x,1); $$TYPE = 2; return 0}
{return 14};
}
sub wsImportArray {local($n,$nom,$TAB,$IN,$OUT,@Tparm) = @_;
local $x = $$IN;
local($i,$In,$Out,$k);
local($y,@T,@T0);
$y = $$TAB{$Tparm[0]}; @T = @Tparm; shift @T; @T0 = ();
if ($y ne "") {$y =~ s/^\s*//};
if (substr($y,0,6) eq "(#L(1)") {$y = "(#L".substr($y,6)}
if (substr($y,0,4) eq "(#L)") {$y = "/#L)".substr($y,4)}
if ($y ne "") {$y =~ s/\/#L\)\s*/\/#L\)/};
if ($y ne "/#L)") {
if ((substr($y,0,4) ne "(#L:")||(substr($y,length($y)-4) ne "/#L)")) {return 31}; @T0 = split(/\/#L:/,substr($y,4,length($y)-8));
}
for($k=0;$k<scalar(@T0);$k++) {
if ($x ne "") {$x =~ s/^\s*//};
if (substr($x,0,4) eq "/#L:"){
$In = substr($x,4); $Out = '';
if (($i=&wsImportRec($n+1,$nom.'['.&writeVal($T0[$k]).']',$TAB,\$In,\$Out,"",@T))!=0) {return $i};
} else {$Out = '""'}
$$OUT .= ';'.&wsWrite("use",$nom.'['.&writeVal($T0[$k]).']',\$Out).' = '.&wsWrite("val",$Out);
$x = $In;
}
if (substr($x,0,4) ne "/#L)") {return 32}; $$IN = substr($x,4); return 0;
}
sub wsImportArray1 {local($n,$nom,$TAB,$IN,$OUT) = @_;
local $x = $$IN;
local($k);
while(true) {
if ($x ne "") {$x =~ s/^\s*//};
if (substr($x,0,4) ne "/#L:") {last}; $x = substr($x,4);
if ($x=~/^\s*\(#L/) {return 41};
$k = index($x,"/#"); if ($k==-1) {$k = length($x)};
$$OUT .= ','.&writeVal(substr($x,0,$k)); $x = substr($x,$k);
}
if (substr($x,0,4) ne "/#L)") {return 42}; $$IN = substr($x,4); return 0;
}
|
| Code JavaScript |
function wsWrite(appel,x,IN) {
if (toJs=="true") {return x}
switch(appel) {
case "imed":
if (x.substr(0,2)=="//") {x = "#"+x.substr(2)}; return x;
case "nom":
x = x.replace(/\[/gi,"{"); x = x.replace(/\]/gi,"}"); return x;
case "ref":
var y = '';
if (x.substr(0,4)=='var ') {y = 'local '; x = x.substr(4)}
if (IN[0].substr(0,1)=="[") {x = '@'+x} else if (IN[0].substr(0,1)=="(") {x = '%'+x} else {x = '$'+x}
x = y+x; return x;
case "use":
x = wsWrite("nom",x);
if (IN[0].substr(0,1)=="[") {x = '@{$'+x+'}'} else if (IN[0].substr(0,1)=="(") {x = '%{$'+x+'}'} else {x = '$'+x}
return x;
case "val":
if (x.substr(0,1)=="[") {x = '('+x.substr(1,x.length-2)+')'}; return x;
case "void":
x = "()"; return x;
case "recons":
var y = ''; var y1,nom;
while(x.match(/(\w+)(,|;)/)) {
nom = RegExp.$1; y1 = RegExp.$2; x = x.substr(nom.length+1);
if (IN[0].match(new RegExp("\\\"(.)"+nom+"\\\""))) {y += RegExp.$1+nom+y1}
}; return y;
}}
function writeVar(nom,IN,LISTE) {
var x = '';
if (!nom.match(/^(\w+)\W/)) {
x += wsWrite("ref",'var '+nom,IN)+' = '+wsWrite("val",IN[0])+';'+"\n";
return x
}
if (LISTE[0].indexOf(';'+RegExp.$1+';')==-1) {
LISTE[0] += RegExp.$1+';';
var In = Array("()");
x += wsWrite("ref",'var '+RegExp.$1,In)+' = '+wsWrite("val",wsWrite("void",'new Array()'))+'; ';
}
x += wsWrite("use",nom,IN)+' = '+wsWrite("val",IN[0])+';'+"\n";
return x
}
function writeVal(x) {
if (x=="") {return "\"\""};
x = x.replace(/\\\/\\#/gi,"\/#");
x = x.replace(/\\/gi,"\\\\");
if (toJs=="false") {
x = x.replace(/\$/gi,"\\\$"); x = x.replace(/\@/gi,"\\\@"); x = x.replace(/\%/gi,"\\\%"); x = x.replace(/\&/gi,"\\\&");
}
x = x.replace(/\n/gi,"\\n"); x = x.replace(/\"/gi,"\\\""); x = x.replace(/\'/gi,"\\\'");
return "\""+x+"\"";
}
function wsImportVar(nom,val,LISTE) {
var In = Array('');
In[0] = writeVal(val);
return writeVar(nom,In,LISTE);
}
function wsImportVal(To,TAB,CHP,idx,LISTE) {
var k,i,nom,In,Out;
var y1,Struct,Liste;
var x='';
if (typeof(idx)=="undefined") {idx = ""; LISTE = Array(';')};
y1 = ""; Struct = Array(''); Liste = Array(LISTE[0]);
nom = "/#T"; if (typeof(TAB[0][nom])!="undefined") {x += wsWrite("imed",TAB[0][nom])+"\n"}
for(k=0;k<CHP[0].length;k++) {
nom = CHP[0][k];
if (typeof(TAB[0][nom])!="undefined") {
In = Array(TAB[0][nom]); Out = Array('');
if ((i=wsImportRec(0,nom+idx,TAB,In,Out,Struct,[]))!=0) {return ''};
} else {
Out = Array('""');
}
x += writeVar(nom+idx,Out,Liste);
y1 += ','+writeVal(wsWrite("ref",nom,Out));
}
Struct[0] = wsWrite("recons",Struct[0],Array(y1));
Out = Array('['+writeVal(Struct[0])+y1+']');
x += writeVar(To+idx,Out,Liste);
LISTE[0] = Liste[0];
return x;
}
function wsImportRec(n,nom,TAB,IN,OUT,STRUCT,Tparm) {
var x = IN[0];
var i,k,Type,Parm,cas;
var Out;
Type = Array(); Type[0] = 0; Parm = Array(Array());
if ((i=wsImportStruct(TAB,IN,Type,Parm))!=0) {return i}; cas = Type[0]; IN[0] = x;
if ((cas!=1)&&(Tparm.length!=0)) {return 21};
if (cas==0) {
x = IN[0]; k = x.indexOf("/#"); if (k==-1) {k = x.length};
OUT[0] += writeVal(x.substr(0,k)); x = x.substr(k);
} else if (((cas==1)&&(Tparm.length==0))||((cas==2)&&(Parm[0].length==0))) {
Out = Array('');
while(true) {
x = IN[0]; if (x!="") {x = x.replace(/^\s*/,"")};
if ((x=='')||(x.substr(0,2)=="/#")) {break};
Type = Array(); Type[0] = 0; Parm = Array(Array());
if ((i=wsImportStruct(TAB,IN,Type,Parm))!=0) {return i};
if (Type[0]!=cas) {return 22};
if (!IN[0].match(/^\s*\/#L/)) {return 22}
if ((i=wsImportArray1(n,nom,TAB,IN,Out))!=0) {return i};
}
if (n==0) {
x = nom.replace(/^(\w+).*/,"$1"); if (cas==2) {x += ',1'};
STRUCT[0] += x+';';
}
OUT[0] += '['+Out[0].substr(1)+']';
} else {
OUT[0] += wsWrite("void",'new Array()');
while(true) {
x = IN[0]; if (x!="") {x = x.replace(/^\s*/,"")};
if ((x=='')||(x.substr(0,2)=="/#")) {break};
Type = Array(); Type[0] = 0; Parm = Array(Array());
if ((i=wsImportStruct(TAB,IN,Type,Parm))!=0) {return i};
if (Type[0]!=cas) {return 22};
if (n==0) {
x = nom.replace(/^(\w+).*/,"$1"); for(i=0;i<Parm[0].length;i++) {x += ','+Parm[0][i]};
STRUCT[0] += x+';';
}
if ((i=wsImportArray(n,nom,TAB,IN,OUT,((cas==2)?Parm[0]:Tparm)))!=0) {return i};
}
}
IN[0] = x; return 0;
}
function wsImportStruct(TAB,IN,TYPE,PARM) {
var x = IN[0];
var k;
if (x!="") {x = x.replace(/^\s*/,"")};
if (x.substr(0,3)!="(#L") {TYPE[0] = 0; return 0}
if (x.substr(0,4)=="(#L)") {IN[0] = "/#L)"+x.substr(4); TYPE[0] = 1; return 0}
if (x.substr(0,4)=="(#L:") {IN[0] = "/#L:"+x.substr(4); TYPE[0] = 1; return 0}
if (x.substr(0,4)!="(#L(") {return 11}; x = x.substr(4); k = x.indexOf(")");
if (k==-1) {return 12}; if (x.substr(0,k)=="1") {PARM[0] = []} else {PARM[0] = x.substr(0,k).split(/\/#/)}; x = x.substr(k+1);
for(k=0;k<PARM[0].length;k++) {if (typeof(TAB[0][PARM[0][k]])=="undefined") {return 13}}
if (x.substr(0,1)==")") {IN[0] = "/#L)"+x.substr(1); TYPE[0] = 2; return 0}
if (x.substr(0,1)==":") {IN[0] = "/#L:"+x.substr(1); TYPE[0] = 2; return 0}
{return 14};
}
function wsImportArray(n,nom,TAB,IN,OUT,Tparm) {
var x = IN[0];
var i,In,Out,k;
var y,T,T0;
y = TAB[0][Tparm[0]]; T = Tparm.slice(1); T0 = [];
if (y!="") {y = y.replace(/^\s*/,"")};
if (y.substr(0,6)=="(#L(1)") {y = "(#L"+y.substr(6)}
if (y.substr(0,4)=="(#L)") {y = "/#L)"+y.substr(4)}
if (y!="") {y = y.replace(/\/#L\)\s*/,"\/#L\)")};
if (y!="/#L)") {
if ((y.substr(0,4)!="(#L:")||(y.substr(y.length-4)!="/#L)")) {return 31}; T0 = y.substr(4,y.length-8).split(/\/#L:/);
}
for(k=0;k<T0.length;k++) {
if (x!="") {x = x.replace(/^\s*/,"")};
if (x.substr(0,4)=="/#L:"){
In = Array(x.substr(4)); Out = Array('');
if ((i=wsImportRec(n+1,nom+'['+writeVal(T0[k])+']',TAB,In,Out,"",T))!=0) {return i};
} else {Out = Array('""')}
OUT[0] += ';'+wsWrite("use",nom+'['+writeVal(T0[k])+']',Out)+' = '+wsWrite("val",Out[0]);
x = In[0];
}
if (x.substr(0,4)!="/#L)") {return 32}; IN[0] = x.substr(4); return 0;
}
function wsImportArray1(n,nom,TAB,IN,OUT) {
var x = IN[0];
var k;
while(true) {
if (x!="") {x = x.replace(/^\s*/,"")};
if (x.substr(0,4)!="/#L:") {break}; x = x.substr(4);
if (x.match(/^\s*\(#L/)) {return 41};
k = x.indexOf("/#"); if (k==-1) {k = x.length};
OUT[0] += ','+writeVal(x.substr(0,k)); x = x.substr(k);
}
if (x.substr(0,4)!="/#L)") {return 42}; IN[0] = x.substr(4); return 0;
}
|