1
function [tree]=%e2sci(tree)
4
// Conversion function for Matlab extraction
5
// Input: tree = Matlab operation tree
6
// Output: tree = Scilab equivalent for tree
7
// Emulation function: mtlb_e()
10
// Global variable for M2SCI
15
// Special case for varargin/varargout
16
if or(var.name==["varargin","varargout"]) then
19
tree=Variable(var.name,Infer())
21
if type(ind(1))==15 | ind(1).vtype<>String then
22
tree.operands(2)(2)=null() // Del 'entries'
23
elseif typeof(ind(1))=="cste" then
24
tree.operands(2)(2)=null() // Del 'entries'
26
tree.operands(2)(1)=null() // Del 'entries'
32
// Extraction from cells
33
if var.vtype==Cell then
38
// Extraction from structs
39
if var.vtype==Struct then
44
// Do not consider variable as a rhs...
51
// --- Recursive extraction ---
53
for kind=1:lstsize(ind)
54
if type(ind(kind))<>15 then
55
if ind(kind).vtype==String then
56
if ind(kind).value=="entries" then
57
tree.operands(1).vtype=Cell
62
tree.operands(1).vtype=Struct
70
error("%e2sci: recursive extraction from a variable "+var.name+" of type "+string(var.vtype))
71
elseif var.vtype==String then // Character string extraction
72
tree=Funcall("part",1,Rhs(var,ind),tree.out)
73
tree.lhs(1).dims=list(1,1)
74
tree.lhs(1).type=var.type
75
else // Extraction x(i)
76
if var.vtype==Unknown then // Unknown type -> can be String
77
tree=Funcall("mtlb_e",1,Rhs(var,ind),tree.out)
78
tree.lhs(1).dims=list(Unknown,Unknown)
79
tree.lhs(1).type=var.type
81
if typeof(ind)=="cste" then
82
if ind.value==":" then
83
if var.dims(1)<>Unknown & var.dims(2)<>Unknown then
84
tree.out(1).dims=list(var.dims(1)*var.dims(2),1)
85
tree.out(1).type=var.type
87
tree.out(1).dims=list(Unknown,1)
88
tree.out(1).type=var.type
94
if ind.dims(1)==1 & ind.dims(2)==1 then
95
tree.out(1).dims=list(1,1)
96
tree.out(1).type=var.type
97
elseif var.dims(1)==1 then
98
tree.out(1).dims=list(1,Unknown)
99
tree.out(1).type=var.type
100
elseif var.dims(2)==1 then
101
tree.out(1).dims=list(Unknown,1)
102
tree.out(1).type=var.type
103
elseif ind.dims(2)==1 then
104
tree.out(1).dims=list(Unknown,1)
105
tree.out(1).type=var.type
106
elseif ind.dims(1)==1 then
107
tree.out(1).dims=list(1,Unknown)
108
tree.out(1).type=var.type
109
elseif var.dims(1)<>Unknown & var.dims(2)<>Unknown then
110
tree=Operation(".''",list(tree),tree.out)
111
tree.out(1).dims=list(Unknown,1)
112
tree.out(1).type=var.type
113
else // at leat one dimension unknown
114
tree=Funcall("mtlb_e",1,Rhs(var,ind),tree.out)
115
tree.lhs(1).dims=list(Unknown,Unknown)
116
tree.lhs(1).type=var.type
120
// More than one index value
125
for l=1:size(tree.operands(k).dims)
126
dimsum=dimsum+tree.operands(k).dims(l)
128
if dimsum==size(tree.operands(k).dims) // All dims are 1
130
if typeof(tree.operands(k))=="cste" then
131
if tree.operands(k).value==":" then
132
dims(k-1)=var.dims(k-1)
140
if var.vtype==String then // extraction in strings
142
rhsarg=Operation("ext",list(var,tree.operands(2)),list())
143
tree=Funcall("part",1,Rhs(rhsarg,tree.operands(3)),tree.out)
144
tree.lhs(1).dims=list(dims(1:2))
145
tree.lhs(1).type=var.type
147
error("%e2sci(): Extraction from strings with more than two indexes not implemented!")
150
tree.out(1).dims=dims
151
tree.out(1).type=var.type
b'\\ No newline at end of file'