Merge remote-tracking branch 'origin/master' into jit
[scilab.git] / scilab / modules / ast / src / cpp / ast / testControlExp.cpp
1 /*
2 *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 *  Copyright (C) 2008-2008 - INRIA - Antoine ELIAS
4 *
5 *  This file must be used under the terms of the CeCILL.
6 *  This source file is licensed as described in the file COPYING, which
7 *  you should have received as part of this distribution.  The terms
8 *  are also available at
9 *  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
10 *
11 */
12
13 #include <iostream>
14 #include <list>
15 #include <assert.h>
16 #include "doubleexp.hxx"
17 #include "commentexp.hxx"
18 #include "floatexp.hxx"
19 #include "boolexp.hxx"
20 #include "intexp.hxx"
21 #include "stringexp.hxx"
22 #include "printvisitor.hxx"
23
24 using namespace symbol;
25 using namespace ast;
26 using namespace std;
27
28 static void WhileExpTest(void)
29 {
30
31     //while ( not EOF(A) ) do
32     //  B = B + readlength(A, 80)
33     //end
34
35     Location *poLoc                                     = new Location();
36
37     //A
38     Symbol *poSymbA                                     = new Symbol("A");
39     SimpleVar *poVarA                           = new SimpleVar(*poLoc, *poSymbA);
40
41     //B
42     Symbol *poSymbB                                     = new Symbol("B");
43     SimpleVar *poVarB                           = new SimpleVar(*poLoc, *poSymbB);
44
45     //Param list : A
46     list<Exp*> lParamEOF;
47     lParamEOF.push_back(poVarA);
48
49     //EOF
50     Symbol *poSymbEOF                           = new Symbol("EOF");
51     SimpleVar *poVarEOF                 = new SimpleVar(*poLoc, *poSymbEOF);
52
53     //EOF(A)
54     CallExp *poEOF                                      = new CallExp(*poLoc, *poVarEOF, lParamEOF);
55
56     // not EOF(A)
57     NotExp *poNotEOF                            = new NotExp(*poLoc, *poEOF);
58
59     //80
60     IntExp *poInt80                                     = new IntExp(*poLoc, IntExp::_32_, 80);
61
62     //Param list : A, 80
63     list<Exp*> lParamRL;
64     lParamRL.push_back(poVarA);
65     lParamRL.push_back(poInt80);
66
67     //readline
68     Symbol *poSymbRL                            = new Symbol("readlength");
69     SimpleVar *poVarRL                  = new SimpleVar(*poLoc, *poSymbRL);
70
71     //readlength(A, 80)
72     CallExp *poRL                                               = new CallExp(*poLoc, *poVarRL, lParamRL);
73
74     //B + readlength(A, 80)
75     OpExp *poBpRL                                               = new OpExp(*poLoc, *poVarB, OpExp::plus, *poRL);
76
77     //B = B + readlength(A, 80)
78     AssignExp *poBeqBpRL                = new AssignExp(*poLoc, *poVarB, *poBpRL);
79
80     //while ( not EOF(A) do B = B + readlength(A,80) end
81     WhileExp *poWhile                   = new WhileExp(*poLoc, *poNotEOF, *poBeqBpRL);
82
83     PrintVisitor *printMe       = new PrintVisitor(cout);
84
85     cout << "-----------------" << endl;
86     cout << "  ast::WhileExp  " << endl;
87     cout << "-----------------" << endl << endl;
88
89     poWhile->accept(*printMe);
90
91     delete printMe;
92     delete poWhile;
93     delete poBeqBpRL;
94     delete poBpRL;
95     delete poRL;
96     delete poVarRL;
97     delete poSymbRL;
98
99     lParamRL.clear();
100
101     delete poInt80;
102     delete poNotEOF;
103     delete poEOF;
104     delete poVarEOF;
105     delete poSymbEOF;
106
107     lParamEOF.clear();
108
109     delete poVarB;
110     delete poSymbB;
111     delete poVarA;
112     delete poSymbA;
113     delete poLoc;
114
115     cout << endl << endl;
116 }
117
118 static void BreakExpTest(void)
119 {
120     Location *poLoc1                    = new Location();
121     BreakExp *poBreak           = new BreakExp(*poLoc1);
122     PrintVisitor *printMe = new PrintVisitor(cout);
123
124     cout << "-----------------" << endl;
125     cout << "  ast::BreakExp  " << endl;
126     cout << "-----------------" << endl;
127
128     poBreak->accept(*printMe);
129     delete printMe;
130     delete poBreak;
131     delete poLoc1;
132 }
133
134 static void ForExpTest(void)
135 {
136
137     char *toto                                                  = new char[23567];
138     Symbol *poSymb1                                     = new Symbol("a");
139     Symbol *poSymb2                                     = new Symbol("b");
140     Symbol *poSymb3                                     = new Symbol("c");
141     Location *poLoc                                     = new Location();
142     SimpleVar *poVar1                           = new SimpleVar(*poLoc, *poSymb1);
143     SimpleVar *poVar2                           = new SimpleVar(*poLoc, *poSymb2);
144     VarDec *poVarDec                            = new VarDec(*poLoc, *poSymb3, *poVar1);
145     ForExp *poFor                                               = new ForExp(*poLoc, *poVarDec, *poVar2);
146     PrintVisitor *printMe               = new PrintVisitor(cout);
147
148     cout << "---------------" << endl;
149     cout << "  ast::ForExp  " << endl;
150     cout << "---------------" << endl;
151
152     //test vardec->name ("c")
153     assert(poFor->vardec_get().name_get() == poVarDec->name_get());
154     //test vardec->init ("a")
155     assert((SimpleVar*)&poFor->vardec_get().init_get() == poVar1);
156     //test body ("b")
157     assert((SimpleVar*)&poFor->body_get() == poVar2);
158
159     cout << "variable = " << ((SimpleVar*)&poFor->vardec_get())->name_get().name_get() << endl;
160     cout << "condition = " << ((SimpleVar*)&poFor->vardec_get().init_get())->name_get() << endl;
161     cout << "body = " << ((SimpleVar*)&poFor->body_get())->name_get() << endl;
162
163     poFor->accept(*printMe);
164
165     delete printMe;
166     delete poFor;
167     delete poVarDec;
168     delete poVar2;
169     delete poVar1;
170     delete poLoc;
171     delete poSymb3;
172     delete poSymb2;
173     delete poSymb1;
174
175 }
176
177 static void IfExpTest(void)
178 {
179
180     //if(A == bar(B)) then
181     //  //B has a good value
182     //  C = B'
183     //else
184     // //A is better then B
185     //  C = A'
186     //end
187
188     Location *poLoc                                     = new Location();
189
190     //B
191     Symbol *poSymbB                                     = new Symbol("B");
192     SimpleVar *poVarB                           = new SimpleVar(*poLoc, *poSymbB);
193
194     //Param list : B
195     list<Exp*> lParamBar;
196     lParamBar.push_back(poVarB);
197
198     //bar
199     Symbol *poSymbBar                           = new Symbol("bar");
200     SimpleVar *poVarBar                 = new SimpleVar(*poLoc, *poSymbBar);
201
202     //bar(B)
203     CallExp *poBar                                      = new CallExp(*poLoc, *poVarBar, lParamBar);
204
205     //A
206     Symbol *poSymbA                                     = new Symbol("A");
207     SimpleVar *poVarA                           = new SimpleVar(*poLoc, *poSymbA);
208
209     //A == bar(B)
210     OpExp *poAeqBarB                            = new OpExp(*poLoc, *poVarA, OpExp::eq, *poBar);
211
212     //C
213     Symbol *poSymbC                                     = new Symbol("C");
214     SimpleVar *poVarC                           = new SimpleVar(*poLoc, *poSymbC);
215
216     //B' ( non conjugate )
217     TransposeExp *poTransB      = new TransposeExp(*poLoc, *poVarB, TransposeExp::_NonConjugate_);
218
219     //C = B'
220     AssignExp *poCeqBt                  = new AssignExp(*poLoc, *poVarC, *poTransB);
221
222     //A' ( non conjugate )
223     TransposeExp *poTransA      = new TransposeExp(*poLoc, *poVarA, TransposeExp::_NonConjugate_);
224
225     //C = A'
226     AssignExp *poCeqAt                  = new AssignExp(*poLoc, *poVarC, *poTransA);
227
228     //if (poAeqBarB) then poCeqBt else poCeqAt
229     IfExp *poIf                                                 = new IfExp(*poLoc, *poAeqBarB, *poCeqBt, *poCeqAt);
230
231     PrintVisitor *printMe               = new PrintVisitor(cout);
232
233     std::cout << "--------------" << std::endl;
234     std::cout << "  ast::IfExp  " << std::endl;
235     std::cout << "--------------" << std::endl << endl;
236
237     poIf->accept(*printMe);
238
239     delete printMe;
240     delete poIf;
241     delete poCeqAt;
242     delete poTransA;
243     delete poCeqBt;
244     delete poTransB;
245     delete poVarC;
246     delete poSymbC;
247     delete poAeqBarB;
248     delete poVarA;
249     delete poSymbA;
250     delete poBar;
251     delete poVarBar;
252     delete poSymbBar;
253
254     lParamBar.clear();
255
256     delete poVarB;
257     delete poSymbB;
258     delete poLoc;
259
260     cout << endl << endl;
261
262 }
263
264 static void ReturnExpTest(void)
265 {
266     Symbol *poSymb                                      = new Symbol("a");
267     Location *poLoc1                            = new Location();
268     Location *poLoc2                            = new Location();
269     Location *poLoc3                            = new Location();
270     SimpleVar *poVar                            = new SimpleVar(*poLoc1, *poSymb);
271     ReturnExp *poReturn1                = new ReturnExp(*poLoc2);// retrun
272     ReturnExp *poReturn2                = new ReturnExp(*poLoc3, poVar);// retrun a
273     PrintVisitor *printMe               = new PrintVisitor(cout);
274
275     std::cout << "------------------" << std::endl;
276     std::cout << "  ast::ReturnExp  " << std::endl;
277     std::cout << "------------------" << std::endl;
278
279     //test exp
280     assert((SimpleVar*)&poReturn2->exp_get() == poVar);
281
282     poReturn1->accept(*printMe);
283     poReturn2->accept(*printMe);
284
285     delete printMe;
286     delete poReturn2;
287     delete poReturn1;
288     delete poVar;
289     delete poLoc3;
290     delete poLoc2;
291     delete poLoc1;
292     delete poSymb;
293 }
294
295 static void TryCatchExpTest(void)
296 {
297     //try
298     // A = B + 1
299     // C = foo(A)
300     //catch
301     //print_error("dummy msg")
302
303     //dummy location
304     Location *poLoc                             = new Location();
305
306     //A
307     Symbol *poSymbA                             = new Symbol("A");
308     SimpleVar *poVarA                   = new SimpleVar(*poLoc, *poSymbA);
309
310     //B
311     Symbol *poSymbB                             = new Symbol("B");
312     SimpleVar *poVarB                   = new SimpleVar(*poLoc, *poSymbB);
313
314     //1
315     IntExp *poInt1                              = new IntExp(*poLoc, IntExp::_32_, 1);
316
317     //B + 1
318     OpExp *poBp1                                        = new OpExp(*poLoc, *poVarB, OpExp::plus, *poInt1);
319
320     //A = B + 1
321     AssignExp *poAeqBp1         = new AssignExp(*poLoc, *poVarA, *poBp1);
322
323     //C
324     Symbol *poSymbC                             = new Symbol("C");
325     SimpleVar *poVarC                   = new SimpleVar(*poLoc, *poSymbC);
326
327     //Param list : A
328     list<Exp*> lParamFoo;
329     lParamFoo.push_back(poVarA);
330
331     //foo
332     Symbol *poSymbFoo                   = new Symbol("foo");
333     SimpleVar *poVarFoo         = new SimpleVar(*poLoc, *poSymbFoo);
334
335     //foo(A)
336     CallExp *poFoo                              = new CallExp(*poLoc, *poVarFoo, lParamFoo);
337
338     //C = foo(A)
339     AssignExp *poCeqFooA        = new AssignExp(*poLoc, *poVarC, *poFoo);
340
341     //A = B +1
342     //C = foo(A)
343     list<Exp*> lTry;
344     lTry.push_back(poAeqBp1);
345     lTry.push_back(poCeqFooA);
346
347     SeqExp *poSeqTry                    = new SeqExp(*poLoc, lTry);
348
349     // "dummy msg"
350     StringExp *poStr                    = new StringExp(*poLoc, "dummy msg");
351
352     //Param list : str
353     list<Exp*> lParamPrint;
354     lParamPrint.push_back(poStr);
355
356     //print_error
357     Symbol *poSymbPrint         = new Symbol("print_error");
358     SimpleVar *poVarPrint       = new SimpleVar(*poLoc, *poSymbPrint);
359
360     //print_error("dummy msg")
361     CallExp *poPrint                    = new CallExp(*poLoc, *poVarPrint, lParamPrint);
362
363     list<Exp*> lCatch;
364     lCatch.push_back(poPrint);
365
366     SeqExp *poSeqCatch          = new SeqExp(*poLoc, lCatch);
367
368
369     TryCatchExp *poTry          = new TryCatchExp(*poLoc, *poSeqTry, *poSeqCatch);
370
371     PrintVisitor *printMe = new PrintVisitor(cout);
372
373     std::cout << "--------------------" << std::endl;
374     std::cout << "  ast::TryCatchExp  " << std::endl;
375     std::cout << "--------------------" << std::endl << endl;
376
377     poTry->accept(*printMe);
378
379
380     delete printMe;
381     delete poTry;
382     delete poSeqCatch;
383
384     lCatch.clear();
385
386     delete poPrint;
387     delete poVarPrint;
388     delete poSymbPrint;
389
390     lParamPrint.clear();
391
392     delete poStr;
393     delete poSeqTry;
394
395     lTry.clear();
396
397     delete poCeqFooA;
398     delete poFoo;
399     delete poVarFoo;
400     delete poSymbFoo;
401
402     lParamFoo.clear();
403
404     delete poVarC;
405     delete poSymbC;
406     delete poAeqBp1;
407     delete poBp1;
408     delete poInt1;
409     delete poVarB;
410     delete poSymbB;
411     delete poVarA;
412     delete poSymbA;
413     delete poLoc;
414
415     cout << endl << endl;
416
417 }
418
419 int main(void)
420 {
421     WhileExpTest();
422     BreakExpTest();
423     ForExpTest();
424     IfExpTest();
425     ReturnExpTest();
426     TryCatchExpTest();
427     return 0;
428 }