summaryrefslogtreecommitdiff
path: root/modules/string/macros/instruction2code.sci
diff options
context:
space:
mode:
Diffstat (limited to 'modules/string/macros/instruction2code.sci')
-rwxr-xr-xmodules/string/macros/instruction2code.sci319
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
+