libutap  0.93
Uppaal Timed Automata Parser
statement.cpp
Go to the documentation of this file.
1 // -*- mode: C++; c-file-style: "stroustrup"; c-basic-offset: 4; indent-tabs-mode: nil; -*-
2 
3 /* libutap - Uppaal Timed Automata Parser.
4  Copyright (C) 2002-2006 Uppsala University and Aalborg University.
5 
6  This library is free software; you can redistribute it and/or
7  modify it under the terms of the GNU Lesser General Public License
8  as published by the Free Software Foundation; either version 2.1 of
9  the License, or (at your option) any later version.
10 
11  This library is distributed in the hope that it will be useful, but
12  WITHOUT ANY WARRANTY; without even the implied warranty of
13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14  Lesser General Public License for more details.
15 
16  You should have received a copy of the GNU Lesser General Public
17  License along with this library; if not, write to the Free Software
18  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
19  USA
20 */
21 
22 #include <cassert>
23 
24 #include "utap/statement.h"
25 
26 using namespace UTAP;
27 using std::string;
28 
30 {
31 
32 }
33 
34 
36 {
37 
38 }
39 
41 {
42  return visitor->visitEmptyStatement(this);
43 }
44 
46 {
47  return false;
48 }
49 
50 string EmptyStatement::toString(const string& prefix) const
51 {
52  return "";
53 }
54 
56  : Statement(), expr(expr)
57 {
58 
59 }
60 
62 {
63  return visitor->visitExprStatement(this);
64 }
65 
67 {
68  return false;
69 }
70 
71 string ExprStatement::toString(const string& prefix) const
72 {
73  return prefix + expr.toString() + ";";
74 }
75 
76 
78  : Statement(), expr(expr)
79 {
80 
81 }
82 
84 {
85  return visitor->visitAssertStatement(this);
86 }
87 
89 {
90  return false;
91 }
92 
93 string AssertStatement::toString(const string& prefix) const
94 {
95  return prefix + "assert(" + expr.toString()+");";
96 }
97 
99  expression_t cond, expression_t step, Statement* _stat)
100  : Statement(), init(init), cond(cond), step(step), stat(_stat)
101 {
102  assert(_stat != nullptr);
103 }
104 
106 {
107  return visitor->visitForStatement(this);
108 }
109 
111 {
112  return false;
113 }
114 
115 string ForStatement::toString(const string& prefix) const
116 {
117  return prefix + "for (" + init.toString() + "; "
118  + cond.toString() + "; " + step.toString() + ")\n{\n"
119  + stat->toString(prefix + INDENT) + "}";
120 }
121 
123 {
124  this->symbol = sym;
125  this->frame = f;
126  this->stat = s;
127 }
128 
130 {
131  return visitor->visitIterationStatement(this);
132 }
133 
135 {
136  return false;
137 }
138 
139 string IterationStatement::toString(const string& prefix) const
140 {
141  string type = symbol.getType()[0].getLabel(0);
142  return prefix + "for (" + symbol.getName() + " : "
143  + type //TODO: to be tested
144  +")\n{\n"
145  + stat->toString(prefix + INDENT) + "}";
146 }
147 
149  Statement* _stat)
150  : Statement(), cond(cond), stat(_stat)
151 {
152  assert(_stat != nullptr);
153 }
154 
156 {
157  return visitor->visitWhileStatement(this);
158 }
159 
161 {
162  return false;
163 }
164 
165 string WhileStatement::toString(const string& prefix) const
166 {
167  return prefix + "while(" + cond.toString()+")\n" +prefix +"{\n"
168  + stat->toString(prefix + INDENT) + prefix+ "}";
169 }
170 
173  : Statement(), stat(_stat), cond(cond)
174 {
175  assert(_stat!=NULL);
176 }
177 
179 {
180  return visitor->visitDoWhileStatement(this);
181 }
182 
184 {
185  return stat->returns();
186 }
187 
188 string DoWhileStatement::toString(const string& prefix) const
189 {
190  return prefix +"do {\n" + stat->toString(prefix + INDENT)
191  + prefix + "}";
192 }
194  : Statement()
195 {
196  this->frame = frame;
197 }
198 
200 {
201  while(!stats.empty()) delete pop_stat();
202 }
203 
205 {
206  assert(stat!=NULL);
207  stats.push_back(stat);
208 }
209 
211 {
212  return stats.begin();
213 }
214 
216 {
217  return stats.end();
218 }
219 
221 {
222  return stats.begin();
223 }
224 
226 {
227  return stats.end();
228 }
229 
231 {
232  assert(!stats.empty());
233  return stats.back();
234 }
235 
237 {
238  Statement* st = back();
239  stats.pop_back();
240  return st;
241 }
242 
244 {
245  return visitor->visitBlockStatement(this);
246 }
247 
249 {
250  return begin() != end() && back()->returns();
251 }
252 
253 std::string BlockStatement::toString(const std::string& prefix) const
254 {
255  std::string str = "";
256  std::vector<Statement*>::const_iterator stats_itr;
257  for (stats_itr = stats.begin(); stats_itr != stats.end(); ++ stats_itr)
258  {
259  str += (*stats_itr)->toString(prefix) + "\n";
260  }
261  return str;
262 }
263 
265  : BlockStatement(frame), cond(cond)
266 {
267 
268 }
269 
271 {
272  return visitor->visitSwitchStatement(this);
273 }
274 
276 {
277  return false;
278 }
279 
280 string SwitchStatement::toString(const string& prefix) const
281 {
282  return prefix +"switch(" + cond.toString() + ")\n" + prefix + "{\n"
283  + BlockStatement::toString(prefix + INDENT) + prefix + "}";
284 }
285 
287  : BlockStatement(frame), cond(cond)
288 {
289 
290 }
291 
293 {
294  return visitor->visitCaseStatement(this);
295 }
296 
298 {
299  return false;
300 }
301 
302 string CaseStatement::toString(const string& prefix) const
303 {
304  return prefix + "case " + cond.toString() +":\n"
305  + BlockStatement::toString(prefix + INDENT) ;
306 }
307 
309  : BlockStatement(frame)
310 {
311 
312 };
313 
315 {
316  return visitor->visitDefaultStatement(this);
317 }
318 
320 {
321  return false;
322 }
323 
325  Statement* _true, Statement* _false)
326  : Statement(), cond(cond), trueCase(_true), falseCase(_false)
327 {
328  assert(_true!=NULL);
329 }
330 
332 {
333  return visitor->visitIfStatement(this);
334 }
335 
337 {
338  // This is wrong: An if statement returns *for sure* if both its
339  // true and false branches return.
340  //return trueCase->returns() && (falseCase == NULL || falseCase->returns());
341 
342  return trueCase->returns() && falseCase != NULL && falseCase->returns();
343 }
344 
345 string IfStatement::toString(const string& prefix) const
346 {
347  std::string str =prefix + "if (" + cond.toString() + ")\n"
348  + prefix +"{\n"
349  + trueCase->toString(prefix + INDENT) + prefix +"}";
350  if (falseCase)
351  str += "else {\n" + falseCase->toString(prefix + INDENT)
352  + prefix +"}";
353  return str;
354 }
355 
357 {
358 
359 }
360 
362 {
363  return visitor->visitBreakStatement(this);
364 }
365 
367 {
368  return false;
369 }
370 
371 string BreakStatement::toString(const string& prefix) const
372 {
373  return prefix + "break;";
374 }
375 
377 {
378 
379 }
380 
382 {
383  return visitor->visitContinueStatement(this);
384 }
385 
387 {
388  return false;
389 }
390 
391 string ContinueStatement::toString(const string& prefix) const
392 {
393  return prefix + "continue;";
394 }
395 
397  : Statement()
398 {
399 
400 }
401 
403  : Statement(), value(value)
404 {
405 
406 }
407 
409 {
410  return visitor->visitReturnStatement(this);
411 }
412 
414 {
415  return true;
416 }
417 
418 string ReturnStatement::toString(const string& prefix) const
419 {
420  return prefix + "return " + value.toString() + ";";
421 }
422 
424 {
425  return 0;
426 }
427 
429 {
430  return visitStatement(stat);
431 }
432 
434 {
435  return visitStatement(stat);
436 }
437 
439 {
440  return visitStatement(stat);
441 }
442 
444 {
445  return stat->stat->accept(this);
446 }
447 
449 {
450  return stat->stat->accept(this);
451 }
452 
454 {
455  return stat->stat->accept(this);
456 }
457 
459 {
460  return stat->stat->accept(this);
461 }
462 
464 {
465  int result = 0;
467  for (i = stat->begin(); i != stat->end(); i++)
468  {
469  result = (*i)->accept(this);
470  }
471  return result;
472 }
473 
475 {
476  return visitBlockStatement(stat);
477 }
478 
480 {
481  return visitBlockStatement(stat);
482 }
483 
485 {
486  return visitBlockStatement(stat);
487 }
488 
490 {
491  if (stat->falseCase)
492  {
493  stat->trueCase->accept(this);
494  return stat->falseCase->accept(this);
495  }
496  else
497  {
498  return stat->trueCase->accept(this);
499  }
500 }
501 
503 {
504  return visitStatement(stat);
505 }
506 
508 {
509  return visitStatement(stat);
510 }
511 
513 {
514  return visitStatement(stat);
515 }
516 
518 {
519  visitExpression(stat->expr);
520  return 0;
521 }
522 
524 {
525  visitExpression(stat->expr);
526  return 0;
527 }
528 
530 {
531  visitExpression(stat->init);
532  visitExpression(stat->cond);
533  visitExpression(stat->step);
534  return stat->stat->accept(this);
535 }
536 
538 {
539  visitExpression(stat->cond);
540  return stat->stat->accept(this);
541 }
542 
544 {
545  visitExpression(stat->cond);
546  return stat->stat->accept(this);
547 }
548 
550 {
551  /* Visit variable initialisers.
552  */
553  frame_t vars = stat->getFrame();
554  for (size_t i = 0; i < vars.getSize(); i++)
555  {
556  if (vars[i].getData())
557  {
558  // REVISIT: This will only work if vars[i] is a variable!
559  visitExpression(((variable_t *)vars[i].getData())->expr);
560  }
561  }
562 
563  /* Visit statements.
564  */
566  for (s = stat->begin(); s != stat->end(); ++s)
567  {
568  (*s)->accept(this);
569  }
570  return 0;
571 }
572 
574 {
575  visitExpression(stat->cond);
576  return visitBlockStatement(stat);
577 }
578 
580 {
581  visitExpression(stat->cond);
582  return visitBlockStatement(stat);
583 }
584 
586 {
587  return visitBlockStatement(stat);
588 }
589 
591 {
592  visitExpression(stat->cond);
593  stat->trueCase->accept(this);
594  if (stat->falseCase)
595  {
596  stat->falseCase->accept(this);
597  }
598  return 0;
599 }
600 
602 {
603  visitExpression(stat->value);
604  return 0;
605 }
606 
607 
609  : changes(changes)
610 {
611 
612 }
613 
615 {
617 }
618 
620  std::set<symbol_t> &dependencies)
621  : dependencies(dependencies)
622 {
623 
624 }
625 
627 {
629 }
630 
632  std::list<expression_t>& e)
633  : expressions (e)
634 {
635 
636 }
637 
639 {
640  if (expr.isDynamic() || expr.hasDynamicSub ())
641  expressions.push_back(expr);
642 }
643 
expression_t value
Definition: statement.h:214
ForStatement(expression_t, expression_t, expression_t, Statement *)
Definition: statement.cpp:98
std::vector< Statement * >::const_iterator const_iterator
Definition: statement.h:130
int32_t visitDefaultStatement(DefaultStatement *stat) override
Definition: statement.cpp:484
int32_t visitBlockStatement(BlockStatement *stat) override
Definition: statement.cpp:549
int32_t visitAssertStatement(AssertStatement *stat) override
Definition: statement.cpp:438
#define INDENT
Definition: statement.h:25
ExprStatement(expression_t)
Definition: statement.cpp:55
void visitExpression(expression_t) override
Definition: statement.cpp:638
expression_t cond
Definition: statement.h:165
int32_t visitExprStatement(ExprStatement *stat) override
Definition: statement.cpp:433
std::string toString(const std::string &prefix) const override
Definition: statement.cpp:302
Statement * falseCase
Definition: statement.h:185
static map< int, string > expressions
Definition: tracer.cpp:141
frame_t getFrame()
Definition: statement.h:141
virtual int32_t visitWhileStatement(WhileStatement *stat)=0
virtual int32_t visitExprStatement(ExprStatement *stat)=0
WhileStatement(expression_t, Statement *)
Definition: statement.cpp:148
std::string toString(const std::string &prefix) const override
Definition: statement.cpp:253
virtual bool returns()=0
int32_t visitDoWhileStatement(DoWhileStatement *stat) override
Definition: statement.cpp:458
DoWhileStatement(Statement *, expression_t)
Definition: statement.cpp:171
int32_t visitDefaultStatement(DefaultStatement *stat) override
Definition: statement.cpp:585
int32_t accept(StatementVisitor *visitor) override
Definition: statement.cpp:408
int32_t visitContinueStatement(ContinueStatement *stat) override
Definition: statement.cpp:507
int32_t visitBreakStatement(BreakStatement *stat) override
Definition: statement.cpp:502
uint32_t getSize() const
Returns the number of symbols in this frame.
Definition: symbols.cpp:328
virtual int32_t visitCaseStatement(CaseStatement *stat)=0
const_iterator end() const
Definition: statement.cpp:215
expression_t cond
Definition: statement.h:183
bool returns() override
Definition: statement.cpp:134
expression_t cond
Definition: statement.h:155
virtual int32_t visitBreakStatement(BreakStatement *stat)=0
int32_t visitDoWhileStatement(DoWhileStatement *stat) override
Definition: statement.cpp:543
virtual int32_t visitAssertStatement(AssertStatement *stat)=0
std::string toString(const std::string &prefix) const override
Definition: statement.cpp:345
int32_t accept(StatementVisitor *visitor) override
Definition: statement.cpp:270
int32_t visitForStatement(ForStatement *stat) override
Definition: statement.cpp:443
int32_t visitReturnStatement(ReturnStatement *stat) override
Definition: statement.cpp:601
int32_t visitIfStatement(IfStatement *stat) override
Definition: statement.cpp:489
Statement * stat
Definition: statement.h:109
A reference to a symbol.
Definition: symbols.h:107
int32_t accept(StatementVisitor *visitor) override
Definition: statement.cpp:61
std::string toString(const std::string &prefix) const override
Definition: statement.cpp:50
int32_t accept(StatementVisitor *visitor) override
Definition: statement.cpp:105
int32_t visitIterationStatement(IterationStatement *stat) override
Definition: statement.cpp:448
std::vector< Statement * >::iterator iterator
Definition: statement.h:131
CollectDynamicExpressions(std::list< expression_t > &)
Definition: statement.cpp:631
virtual int32_t visitIfStatement(IfStatement *stat)=0
bool returns() override
Definition: statement.cpp:386
~BlockStatement() override
Definition: statement.cpp:199
int32_t visitSwitchStatement(SwitchStatement *stat) override
Definition: statement.cpp:474
virtual int32_t visitReturnStatement(ReturnStatement *stat)=0
AssertStatement(expression_t)
Definition: statement.cpp:77
bool returns() override
Definition: statement.cpp:297
virtual int32_t visitEmptyStatement(EmptyStatement *stat)=0
std::string toString(const std::string &prefix) const override
Definition: statement.cpp:371
Statement class for the iterator loop-construction.
Definition: statement.h:91
int32_t accept(StatementVisitor *visitor) override
Definition: statement.cpp:292
int32_t visitIfStatement(IfStatement *stat) override
Definition: statement.cpp:590
bool returns() override
Definition: statement.cpp:248
expression_t expr
Definition: statement.h:58
int32_t visitEmptyStatement(EmptyStatement *stat) override
Definition: statement.cpp:428
int32_t visitReturnStatement(ReturnStatement *stat) override
Definition: statement.cpp:512
virtual int32_t visitContinueStatement(ContinueStatement *stat)=0
void visitExpression(expression_t) override
Definition: statement.cpp:626
expression_t expr
Definition: statement.h:68
virtual int32_t visitBlockStatement(BlockStatement *stat)=0
Base type for variables, clocks, etc.
Definition: system.h:43
SwitchStatement(frame_t, expression_t)
Definition: statement.cpp:264
virtual int32_t visitIterationStatement(IterationStatement *stat)=0
static string symbol(const char *str)
Extracts the alpha-numerical symbol used for variable/type identifiers.
Definition: xmlreader.cpp:107
Statement * back()
Definition: statement.cpp:230
std::string toString(bool old=false) const
Returns a string representation of the expression.
bool returns() override
Definition: statement.cpp:319
std::string toString(const std::string &prefix) const override
Definition: statement.cpp:165
int32_t accept(StatementVisitor *visitor) override
Definition: statement.cpp:361
int32_t accept(StatementVisitor *visitor) override
Definition: statement.cpp:155
int32_t visitSwitchStatement(SwitchStatement *stat) override
Definition: statement.cpp:573
std::list< expression_t > & expressions
Definition: statement.h:305
std::string toString(const std::string &prefix) const override
Definition: statement.cpp:188
int32_t visitWhileStatement(WhileStatement *stat) override
Definition: statement.cpp:453
const_iterator begin() const
Definition: statement.cpp:210
bool returns() override
Definition: statement.cpp:160
CaseStatement(frame_t, expression_t)
Definition: statement.cpp:286
IterationStatement(symbol_t, frame_t, Statement *)
Definition: statement.cpp:122
int32_t accept(StatementVisitor *visitor) override
Definition: statement.cpp:83
std::string toString(const std::string &prefix) const override
Definition: statement.cpp:139
int32_t accept(StatementVisitor *visitor) override
Definition: statement.cpp:243
A reference to a frame.
Definition: symbols.h:183
void collectPossibleWrites(std::set< symbol_t > &) const
int32_t visitCaseStatement(CaseStatement *stat) override
Definition: statement.cpp:479
std::set< symbol_t > & changes
Definition: statement.h:287
std::vector< Statement * > stats
Definition: statement.h:133
virtual int32_t visitForStatement(ForStatement *stat)=0
int32_t visitAssertStatement(AssertStatement *stat) override
Definition: statement.cpp:523
int32_t visitBlockStatement(BlockStatement *stat) override
Definition: statement.cpp:463
int32_t visitCaseStatement(CaseStatement *stat) override
Definition: statement.cpp:579
bool returns() override
Definition: statement.cpp:366
std::string toString(const std::string &prefix) const override
Definition: statement.cpp:71
std::set< symbol_t > & dependencies
Definition: statement.h:296
void push_stat(Statement *stat)
Definition: statement.cpp:204
std::string toString(const std::string &prefix) const override
Definition: statement.cpp:115
bool returns() override
Definition: statement.cpp:66
A reference to an expression.
Definition: expression.h:70
int32_t accept(StatementVisitor *visitor) override
Definition: statement.cpp:129
expression_t cond
Definition: statement.h:120
std::string toString(const std::string &prefix) const override
Definition: statement.cpp:391
bool hasDynamicSub() const
Definition: expression.cpp:353
Statement * pop_stat()
Definition: statement.cpp:236
int32_t accept(StatementVisitor *visitor) override
Definition: statement.cpp:40
expression_t init
Definition: statement.h:78
bool returns() override
Definition: statement.cpp:275
bool returns() override
Definition: statement.cpp:110
int32_t accept(StatementVisitor *visitor) override
Definition: statement.cpp:178
bool returns() override
Definition: statement.cpp:45
bool isDynamic() const
Definition: expression.cpp:329
virtual int32_t visitStatement(Statement *stat)
Definition: statement.cpp:423
virtual int32_t accept(StatementVisitor *visitor)=0
expression_t step
Definition: statement.h:80
int32_t visitForStatement(ForStatement *stat) override
Definition: statement.cpp:529
void visitExpression(expression_t) override
Definition: statement.cpp:614
expression_t cond
Definition: statement.h:108
virtual int32_t visitSwitchStatement(SwitchStatement *stat)=0
int32_t accept(StatementVisitor *visitor) override
Definition: statement.cpp:331
expression_t cond
Definition: statement.h:79
int32_t visitWhileStatement(WhileStatement *stat) override
Definition: statement.cpp:537
Statement * trueCase
Definition: statement.h:184
bool returns() override
Definition: statement.cpp:336
Definition: lexer.cc:817
bool returns() override
Definition: statement.cpp:413
CollectDependenciesVisitor(std::set< symbol_t > &)
Definition: statement.cpp:619
virtual std::string toString(const std::string &prefix) const =0
std::string toString(const std::string &prefix) const override
Definition: statement.cpp:93
Statement * stat
Definition: statement.h:81
IfStatement(expression_t, Statement *, Statement *falseStat=nullptr)
Definition: statement.cpp:324
void collectPossibleReads(std::set< symbol_t > &, bool collectRandom=false) const
int32_t accept(StatementVisitor *visitor) override
Definition: statement.cpp:381
virtual int32_t visitDoWhileStatement(DoWhileStatement *stat)=0
CollectChangesVisitor(std::set< symbol_t > &)
Definition: statement.cpp:608
bool returns() override
Definition: statement.cpp:183
bool returns() override
Definition: statement.cpp:88
virtual int32_t visitDefaultStatement(DefaultStatement *stat)=0
std::string toString(const std::string &prefix) const override
Definition: statement.cpp:418
int32_t accept(StatementVisitor *visitor) override
Definition: statement.cpp:314
int32_t visitExprStatement(ExprStatement *stat) override
Definition: statement.cpp:517
std::string toString(const std::string &prefix) const override
Definition: statement.cpp:280