diff options
Diffstat (limited to 'modules/string/macros/instruction2code.sci')
-rwxr-xr-x | modules/string/macros/instruction2code.sci | 319 |
1 files changed, 319 insertions, 0 deletions
diff --git a/modules/string/macros/instruction2code.sci b/modules/string/macros/instruction2code.sci new file mode 100755 index 000000000..3523dfe33 --- /dev/null +++ b/modules/string/macros/instruction2code.sci @@ -0,0 +1,319 @@ +// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab +// Copyright (C) INRIA - vincent COUVERT +// +// This file must be used under the terms of the CeCILL. +// This source file is licensed as described in the file COPYING, which +// you should have received as part of this distribution. The terms +// are also available at +// http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt + + +function C=instruction2code(I, bprettyprintformat) + // Translate an instruction tlist to Scilab code (called by tree2code) + // Input: + // - I: instruction 'tree' + // - bprettyprintformat: boolean value, if FALSE (default value), generated code is not formated else it is + // Output: + // - C: Scilab code corresponding to I + + // Default value + rhs=argn(2) + if rhs==1 then + bprettyprintformat=%F + end + + C=[] + + // ----------- + // Empty lines + // ----------- + if I==list("EOL") then + C="" + return + end + + // --------------------------------------------- + // Generate code corresponding to a TRY-CATCH + // --------------------------------------------- + if typeof(I)=="trycatch" then + + //TRYCATCH + C="try " + [C,indent_space] = format_txt(C,I.trystat(1),bprettyprintformat); // Add EOL after while if needed and returns indent_space + for k=1:size(I.trystat) + C=cat_code(C,indent_space+instruction2code(I.trystat(k))) + if k<size(I.trystat) then // Add EOL between statements if needed + C = format_txt(C,I.trystat(k),bprettyprintformat,I.trystat(k+1)); + end + end + C = format_txt(C,I.trystat($),bprettyprintformat); // Add EOL after last statement if needed + C=cat_code(C,"catch ") + for k=1:size(I.catchstat) + C=cat_code(C,indent_space+instruction2code(I.catchstat(k))) + if k<size(I.catchstat) then // Add EOL between statements if needed + C = format_txt(C,I.catchstat(k),bprettyprintformat,I.catchstat(k+1)); + end + end + C = format_txt(C,I.catchstat($),bprettyprintformat); // Add EOL after last statement if needed + C=cat_code(C,"end") + C($)=C($)+";" + return + end + + // --------------------------------------------- + // Generate code corresponding to a IF-THEN-ELSE + // --------------------------------------------- + if typeof(I)=="ifthenelse" then + + // IF + C="if "+expression2code(I.expression)+" then" + [C,indent_space] = format_txt(C,I.then(1),bprettyprintformat); // Add EOL after then if needed and returns indent_space + for k=1:size(I.then) + C=cat_code(C,indent_space+instruction2code(I.then(k))) + if k<size(I.then) then // Add EOL between then statements if needed + C = format_txt(C,I.then(k),bprettyprintformat,I.then(k+1)); + end + end + C = format_txt(C,I.then($),bprettyprintformat); // Add EOL after last then statement if needed + + // ELSEIF + if size(I.elseifs)<>0 then + for k=1:size(I.elseifs) + C=cat_code(C,"elseif "+expression2code(I.elseifs(k).expression)+" then") + [C,indent_space] = format_txt(C,I.elseifs(k).then(1),bprettyprintformat); // Add EOL after then if needed and returns indent_space + for l=1:size(I.elseifs(k).then) + C=cat_code(C,indent_space+instruction2code(I.elseifs(k).then(l))) + if l<size(I.elseifs(k).then) then // Add EOL between then statements + C = format_txt(C,I.elseifs(k).then(l),bprettyprintformat,I.elseifs(k).then(l+1)); + end + end + C = format_txt(C,I.elseifs(k).then($),bprettyprintformat); // Add EOL after last then statement if needed + end + end + + // ELSE + if size(I.else)<>0 then + C=cat_code(C,"else") + [C,indent_space] = format_txt(C,I.else(1),bprettyprintformat); // Add EOL after else if needed and returns indent_space + for k=1:size(I.else) + C=cat_code(C,indent_space+instruction2code(I.else(k))) + if k<size(I.else) then // Add EOL between else statements if needed + C = format_txt(C,I.else(k),bprettyprintformat,I.else(k+1)); + end + end + C = format_txt(C,I.else($),bprettyprintformat); // Add EOL after last else statement if needed + end + C=cat_code(C,"end") + C($)=C($)+";" + return + end + + // -------------------------------------------- + // Generate code corresponding to a SELECT-CASE + // -------------------------------------------- + if typeof(I)=="selectcase" then + + // SELECT + C="select "+expression2code(I.expression(1)) + + if size(I.expression)==1 // Not EOL and not comment after the expression + if bprettyprintformat then + C = cat_code(C,"") // Add EOL after expression + end + else + for i=2:size(I.expression) + C=cat_code(C," "+ instruction2code(I.expression(i))) + end + end + + // CASES + if size(I.cases)<>0 then + for k=1:size(I.cases) + C=cat_code(C," case "+expression2code(I.cases(k).expression)+" then") + [C,indent_space] = format_txt(C,I.cases(k).then(1),bprettyprintformat); // Add EOL after then if needed and returns indent_space + if indent_space==" " then // indent_space is modified because indentation differs from others control instructions + indent_space=" " + end + for l=1:size(I.cases(k).then) + C=cat_code(C,indent_space+instruction2code(I.cases(k).then(l))) + if l<size(I.cases(k).then) then // Add EOL between then statements if needed + C = format_txt(C,I.cases(k).then(l),bprettyprintformat,I.cases(k).then(l+1)); + end + end + C = format_txt(C,I.cases(k).then($),bprettyprintformat); // Add EOL after last then statement if needed + end + end + // ELSE + if size(I.else)<>0 then + C=cat_code(C," else") + [C,indent_space] = format_txt(C,I.else(1),bprettyprintformat); // Add EOL after else if needed and returns indent_space + if indent_space==" " then // indent_space is modified because indentation differs from others control instructions + indent_space=" " + end + for k=1:size(I.else) + C=cat_code(C,indent_space+instruction2code(I.else(k))) + if k<size(I.else) then // Add EOL between else statements if needed + C = format_txt(C,I.else(k),bprettyprintformat,I.else(k+1)); + end + end + C = format_txt(C,I.else($),bprettyprintformat); // Add EOL after last else statement if needed + end + C=cat_code(C,"end") + C($)=C($)+";" + return + end + + // -------------------------------------- + // Generate code corresponding to a WHILE + // -------------------------------------- + if typeof(I)=="while" then + + C="while "+expression2code(I.expression) + [C,indent_space] = format_txt(C,I.statements(1),bprettyprintformat); // Add EOL after while if needed and returns indent_space + for k=1:size(I.statements) + C=cat_code(C,indent_space+instruction2code(I.statements(k))) + if k<size(I.statements) then // Add EOL between statements if needed + C = format_txt(C,I.statements(k),bprettyprintformat,I.statements(k+1)); + end + end + C = format_txt(C,I.statements($),bprettyprintformat); // Add EOL after last statement if needed + C=cat_code(C,"end") + C($)=C($)+";" + return + end + + // ------------------------------------ + // Generate code corresponding to a FOR + // ------------------------------------ + if typeof(I)=="for" then + + C="for "+instruction2code(I.expression) + [C,indent_space] = format_txt(C,I.statements(1),bprettyprintformat); // Add EOL after while if needed and returns indent_space + for k=1:size(I.statements) + C=cat_code(C,indent_space+instruction2code(I.statements(k))) + if k<size(I.statements) then // Add EOL between statements if needed + C = format_txt(C,I.statements(k),bprettyprintformat,I.statements(k+1)); + end + end + C = format_txt(C,I.statements($),bprettyprintformat); // Add EOL after last statement if needed + C=cat_code(C,"end") + C($)=C($)+";" + return + end + + // -------------------------------------- + // Generate code corresponding to a EQUAL + // -------------------------------------- + if typeof(I)=="equal" then + + // Comments + if typeof(I.expression)=="funcall" then + if I.expression.name=="%comment" then + I.expression.rhs(1).value=strsubst(I.expression.rhs(1).value,"""""","""") + I.expression.rhs(1).value=strsubst(I.expression.rhs(1).value,"''''","''") + C="//"+I.expression.rhs(1).value + //C($)=C($)+";" + return + end + end + + // Other EQUAL instruction + if size(I.lhs)==1 then + if typeof(I.lhs(1))=="variable" then + if I.lhs(1).name=="ans" then // expression + C=rhs2code(I.expression) + else + RHS=rhs2code(I.expression) + if size(RHS,"*")==1 then + C=I.lhs(1).name+" = "+rhs2code(I.expression) + else // Multi-line definition + C=[I.lhs(1).name+" = "+RHS(1);" "+RHS(2:$)] + end + end + else // Insertion... + C=expression2code(I.lhs(1))+" = "+rhs2code(I.expression) + end + else + lhsnames=[] + for lhsind=1:size(I.lhs) + lhsnames=[lhsnames,expression2code(I.lhs(lhsind))] + end + if strcat(lhsnames,",")<>"" then + C="["+strcat(lhsnames,",")+"] = "+rhs2code(I.expression) + else + C=rhs2code(I.expression) + end + end + C($)=C($)+I.endsymbol + //C($)=C($)+";"; + return + end + + // -------------------------------------- + // Generate code corresponding to a comment + // -------------------------------------- + if typeof(I)=="comment" then + C="//"+I.text + //C = cat_code(C,"//"+I.text) + return + end + + // --------------------------------------- + // Generate code corresponding to sup_equal + // --------------------------------------- + if typeof(I)=="sup_equal" then + while typeof(I.sup_instr(1))=="equal" | I.sup_instr(1)==list("EOL") + if I.sup_instr(1)==list("EOL") then //Instruction is an EOL + I.sup_instr(1)=null() + elseif typeof(I.sup_instr(1))=="equal" then //Instruction is acomment + if typeof(I.sup_instr(1).expression)=="funcall" then + break + end + end + end + //Optimize the code if all sup_intr are equal tlists and expression of this equal tlists are temporaries variables (not a function) + if size(I.sup_instr)==I.nb_opr+1 then + for i=size(I.sup_instr):-1:2 + optim_instr=%f + if typeof(I.sup_instr(i))=="equal" then + if typeof(I.sup_instr(i).expression)=="variable" then + j=0 + while ~optim_instr & j<=size(I.sup_instr(1).lhs) + j=j+1 + optim_instr=I.sup_instr(i).expression.name==I.sup_instr(1).lhs(j).name + end + end + end + if optim_instr then + I.sup_instr(1).lhs(j)=I.sup_instr(i).lhs(1) + I.sup_instr(i)=null() + end + end + end + for i=1:size(I.sup_instr) + C($+1)=instruction2code(I.sup_instr(i)) + end + return + end + + // ---------------------------------------------------- + // Generate code corresponding to a function definition + // ---------------------------------------------------- + if typeof(I)=="inline" then + C = "function "+I.prototype; + C = cat_code(C,I.definition) + C($+1) = "endfunction"; + return + end + + // ------- + // Command + // ------- + if and(typeof(I)<>["funcall" "variable", "comment"]) then + disp("instruction2code: bug in macr2tree() !"); + pause + end + C=expression2code(I); + C($)=C($)+";" +endfunction + |