MicroModelicaCCompiler  4.5.3
composition.cpp
Go to the documentation of this file.
1 /*****************************************************************************
2 
3  This file is part of QSS Solver.
4 
5  QSS Solver is free software: you can redistribute it and/or modify
6  it under the terms of the GNU General Public License as published by
7  the Free Software Foundation, either version 3 of the License, or
8  (at your option) any later version.
9 
10  QSS Solver is distributed in the hope that it will be useful,
11  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  GNU General Public License for more details.
14 
15  You should have received a copy of the GNU General Public License
16  along with QSS Solver. If not, see <http://www.gnu.org/licenses/>.
17 
18  ******************************************************************************/
19 
20 #include "composition.hpp"
21 
22 #include <iostream>
23 #include <list>
24 
25 #include "../util/ast_util.hpp"
26 #include "ast_builder.hpp"
27 #include "element.hpp"
28 #include "equation.hpp"
29 #include "expression.hpp"
30 #include "modification.hpp"
31 #include "statement.hpp"
32 
33 /* Composition Class */
34 
35 AST_Composition_::AST_Composition_(AST_ElementList el, AST_CompositionElementList cl)
36  : _composition_list(cl), _element_list(el), _annot(nullptr), _ext(nullptr)
37 {
38 }
39 
40 CLASSP_PRINTER_IMP(AST_Composition);
41 
42 AST_ElementList AST_Composition_::elementList() const { return _element_list; }
43 
44 AST_CompositionElementList AST_Composition_::compositionList() const { return _composition_list; }
45 
46 ostream &operator<<(ostream &ret, const AST_Composition_ &cm)
47 {
48  AST_CompositionElementListIterator it;
49  AST_ElementListIterator el_it;
50  foreach (el_it, cm.elementList())
51  ret << current_element(el_it) << endl;
52  foreach (it, cm.compositionList()) {
53  ret << current_element(it);
54  }
55  if (cm.externalCall() != nullptr) {
56  ret << " external ";
57  if (cm.externalCall()->language() != nullptr) {
58  ret << "\"" << cm.externalCall()->language() << "\"";
59  }
60  if (cm.externalCall()->annotation()->size()) {
61  AST_ListPrint(cm.externalCall()->annotation(), ret, "annotation(", ",", "", ")", true);
62  }
63  ret << ";" << endl;
64  }
65  return ret;
66 }
67 
68 void AST_Composition_::setExternalFunctionCall(AST_External_Function_Call ext) { _ext = ext; }
69 
70 AST_External_Function_Call AST_Composition_::externalCall() const { return _ext; }
71 
72 void AST_Composition_::setAnnotation(AST_ArgumentList al) { _annot = al; }
73 
75 {
76  visitor->visit(this);
77  AST_ElementListIterator _element_list_it;
78  foreach (_element_list_it, _element_list) {
79  current_element(_element_list_it)->accept(visitor);
80  }
81  AST_CompositionElementListIterator _composition_list_it;
82  foreach (_composition_list_it, _composition_list) {
83  if (current_element(_composition_list_it)->hasElements()) {
84  current_element(_composition_list_it)->accept(visitor);
85  }
86  }
87  foreach (_composition_list_it, _composition_list) {
88  if (current_element(_composition_list_it)->hasEquations()) {
89  current_element(_composition_list_it)->accept(visitor);
90  }
91  }
92  foreach (_composition_list_it, _composition_list) {
93  if (current_element(_composition_list_it)->hasStatements()) {
94  current_element(_composition_list_it)->accept(visitor);
95  }
96  }
97  AST_ArgumentListIterator _annot_it;
98  foreach (_annot_it, _annot) {
99  current_element(_annot_it)->accept(visitor);
100  }
101  if (_ext != nullptr) {
102  _ext->accept(visitor);
103  }
104  visitor->leave(this);
105 }
106 
108 {
109  if (_composition_list == nullptr) {
110  return false;
111  }
112  return _composition_list->size() > 0;
113 }
114 
116 {
117  if (_ext == nullptr) {
118  return false;
119  }
120  return true;
121 }
122 
124 {
125  if (_annot == nullptr) {
126  return false;
127  }
128  return true;
129 }
130 
131 /* Composition Element class */
132 
133 AST_CompositionElement_::AST_CompositionElement_(AST_CompositionEqsAlgs eqs_algs) : _eqs_algs(eqs_algs), _el(newAST_ElementList()) {}
134 
136 {
137  AST_ElementListIterator it;
138 }
139 
140 AST_CompositionEqsAlgs AST_CompositionElement_::getEquationsAlgs() { return _eqs_algs; }
141 
142 AST_ElementList AST_CompositionElement_::getElementList() { return _el; }
143 
144 ostream &operator<<(ostream &ret, const AST_CompositionElement_ &ce)
145 {
146  AST_EquationListIterator it;
147  AST_StatementListIterator st_it;
148  if (ce._eqs_algs != nullptr) {
149  if (ce._eqs_algs->getEquations()->size() > 0) {
150  MAKE_SPACE;
151  ret << (ce._eqs_algs->isInitial() ? "initial " : "");
152  ret << "equation" << endl;
153  }
154  BEGIN_BLOCK;
155  foreach (it, ce._eqs_algs->getEquations()) {
156  ret << current_element(it);
157  }
158  END_BLOCK;
159  if (ce._eqs_algs->getAlgorithms()->size() > 0) {
160  MAKE_SPACE;
161  ret << (ce._eqs_algs->isInitial() ? "initial " : "");
162  ret << "algorithm" << endl;
163  }
164  BEGIN_BLOCK;
165  foreach (st_it, ce._eqs_algs->getAlgorithms()) {
166  ret << current_element(st_it);
167  }
168  END_BLOCK;
169  }
170  AST_ElementListIterator et;
171  if (ce._el != nullptr) {
172  if (ce._el->size() > 0) {
173  ret << "public" << endl;
174  }
175  foreach (et, ce._el) {
176  ret << " " << current_element(et) << endl;
177  }
178  }
179 
180  return ret;
181 }
182 
184 {
185  visitor->visit(this);
186  if (_eqs_algs != nullptr) {
187  _eqs_algs->accept(visitor);
188  }
189  AST_ElementListIterator _el_it;
190  foreach (_el_it, _el) {
191  current_element(_el_it)->accept(visitor);
192  }
193  visitor->leave(this);
194 }
195 
197 {
198  if (_eqs_algs == nullptr) {
199  return false;
200  }
201  return _eqs_algs->hasEquations();
202 }
203 
205 {
206  if (_eqs_algs == nullptr) {
207  return false;
208  }
209  return _eqs_algs->hasStatements();
210 }
211 
213 {
214  if (_el == nullptr) {
215  return false;
216  }
217  return _el->size() > 0;
218 }
219 
220 /* Composition Equations and Algorithm class */
221 
222 AST_CompositionEqsAlgs_::AST_CompositionEqsAlgs_(AST_EquationList eq) : _initial(false), _eq(eq), _st(newAST_StatementList()) {}
223 
224 AST_CompositionEqsAlgs_::AST_CompositionEqsAlgs_(AST_EquationList eq, bool i) : _initial(i), _eq(eq), _st(newAST_StatementList()) {}
225 
226 AST_CompositionEqsAlgs_::AST_CompositionEqsAlgs_(AST_StatementList st, bool i) : _initial(i), _eq(newAST_EquationList()), _st(st) {}
227 
228 AST_CompositionEqsAlgs_::AST_CompositionEqsAlgs_(AST_StatementList st) : _initial(false), _eq(newAST_EquationList()), _st(st) {}
229 
230 AST_EquationList AST_CompositionEqsAlgs_::getEquations() { return _eq; }
231 
232 AST_StatementList AST_CompositionEqsAlgs_::getAlgorithms() { return _st; }
233 
235 
237 {
238  visitor->visit(this);
239  AST_EquationListIterator _eq_it;
240  foreach (_eq_it, _eq) {
241  current_element(_eq_it)->accept(visitor);
242  }
243  AST_StatementListIterator _st_it;
244  foreach (_st_it, _st) {
245  current_element(_st_it)->accept(visitor);
246  }
247  visitor->leave(this);
248 }
249 
251 {
252  if (_eq == nullptr) {
253  return false;
254  }
255  return _eq->size() > 0;
256 }
257 
259 {
260  if (_st == nullptr) {
261  return false;
262  }
263  return _st->size() > 0;
264 }
265 
266 /* External function call class */
267 
269 
271 
272 AST_ArgumentList AST_External_Function_Call_::annotation() { return _annot; }
273 
274 AST_External_Function_Call_::AST_External_Function_Call_(AST_String lang, AST_Expression_ComponentReference cr, AST_Expression args,
275  AST_ArgumentList annot)
276  : _lang(lang), _annot(annot), _exp(args), _cr(cr)
277 {
278  _call = args->getAsCall();
279 }
280 
281 AST_ExpressionList AST_External_Function_Call_::args() { return _call->arguments(); }
282 
283 string AST_External_Function_Call_::name() { return *_call->name(); }
284 
285 AST_Expression_ComponentReference AST_External_Function_Call_::componentReference() { return _cr; }
286 
288 
290 {
291  visitor->visit(this);
292  AST_ArgumentListIterator _annot_it;
293  foreach (_annot_it, _annot) {
294  current_element(_annot_it)->accept(visitor);
295  }
296 }
AST_CompositionElement_::AST_CompositionElement_
AST_CompositionElement_(AST_CompositionEqsAlgs eqs_algs)
Definition: composition.cpp:133
AST_CompositionEqsAlgs_::_initial
bool _initial
Definition: composition.hpp:87
equation.hpp
AST_External_Function_Call_::args
AST_ExpressionList args()
Definition: composition.cpp:281
AST_External_Function_Call_::language
AST_String language()
Definition: composition.cpp:268
AST_CompositionEqsAlgs_::AST_CompositionEqsAlgs_
AST_CompositionEqsAlgs_(AST_EquationList eq)
Definition: composition.cpp:222
ast_builder.hpp
newAST_NullCompositionEquations
AST_CompositionEqsAlgs newAST_NullCompositionEquations()
Definition: ast_builder.cpp:638
AST_Composition_::elementList
AST_ElementList elementList() const
Definition: composition.cpp:42
AST_External_Function_Call_::componentReference
AST_Expression_ComponentReference componentReference()
Definition: composition.cpp:285
newAST_ElementList
AST_ElementList newAST_ElementList()
Definition: ast_builder.cpp:109
AST_CompositionEqsAlgs_::getEquations
AST_EquationList getEquations()
Definition: composition.cpp:230
AST_Composition_::setAnnotation
void setAnnotation(AST_ArgumentList)
Definition: composition.cpp:72
AST_ListPrint
void AST_ListPrint(list< T1 > *l1, ostream &ret, string sec_name="", string separator=" ", string opener="", string closer="", bool block=false)
Definition: ast_types.hpp:319
END_BLOCK
#define END_BLOCK
Definition: ast_types.hpp:33
AST_Composition_::externalCall
AST_External_Function_Call externalCall() const
Definition: composition.cpp:70
AST_CompositionEqsAlgs_::isInitial
bool isInitial()
Definition: composition.cpp:234
AST_Composition_::accept
void accept(AST_Visitor *visitor)
Definition: composition.cpp:74
element.hpp
composition.hpp
AST_External_Function_Call_::_annot
AST_ArgumentList _annot
Definition: composition.hpp:107
AST_Composition_::_annot
AST_ArgumentList _annot
Definition: composition.hpp:52
AST_Composition_::AST_Composition_
AST_Composition_(AST_ElementList el, AST_CompositionElementList cl)
Definition: composition.cpp:35
AST_External_Function_Call_::_call
AST_Expression_Call _call
Definition: composition.hpp:108
AST_String
string * AST_String
Definition: ast_types.hpp:46
operator<<
ostream & operator<<(ostream &ret, const AST_Composition_ &cm)
Definition: composition.cpp:46
AST_Composition_::hasAnnotation
bool hasAnnotation()
Definition: composition.cpp:123
BEGIN_BLOCK
#define BEGIN_BLOCK
Definition: ast_types.hpp:32
newAST_EquationList
AST_EquationList newAST_EquationList()
Definition: ast_builder.cpp:151
AST_CompositionElement_::accept
void accept(AST_Visitor *visitor)
Definition: composition.cpp:183
AST_CompositionElement_::_eqs_algs
AST_CompositionEqsAlgs _eqs_algs
Definition: composition.hpp:69
AST_External_Function_Call_::annotation
AST_ArgumentList annotation()
Definition: composition.cpp:272
AST_CompositionElement_::hasEquations
bool hasEquations()
Definition: composition.cpp:196
MAKE_SPACE
#define MAKE_SPACE
Definition: ast_types.hpp:30
AST_CompositionEqsAlgs_::_eq
AST_EquationList _eq
Definition: composition.hpp:88
AST_Composition_::_ext
AST_External_Function_Call _ext
Definition: composition.hpp:53
AST_CompositionElement_
Definition: composition.hpp:56
AST_Composition_::setExternalFunctionCall
void setExternalFunctionCall(AST_External_Function_Call)
Definition: composition.cpp:68
AST_CompositionEqsAlgs_::accept
void accept(AST_Visitor *visitor)
Definition: composition.cpp:236
newAST_StatementList
AST_StatementList newAST_StatementList()
Definition: ast_builder.cpp:481
AST_Composition_::_element_list
AST_ElementList _element_list
Definition: composition.hpp:51
AST_CompositionElement_::getEquationsAlgs
AST_CompositionEqsAlgs getEquationsAlgs()
Definition: composition.cpp:140
AST_CompositionElement_::getElementList
AST_ElementList getElementList()
Definition: composition.cpp:142
AST_External_Function_Call_::hasComponentReference
bool hasComponentReference()
Definition: composition.cpp:287
AST_External_Function_Call_::name
string name()
Definition: composition.cpp:283
AST_CompositionElement_::hasElements
bool hasElements()
Definition: composition.cpp:212
AST_CompositionEqsAlgs_::hasEquations
bool hasEquations()
Definition: composition.cpp:250
AST_External_Function_Call_::AST_External_Function_Call_
AST_External_Function_Call_(AST_String, AST_Expression_ComponentReference, AST_Expression, AST_ArgumentList)
Definition: composition.cpp:274
modification.hpp
AST_Visitor::visit
virtual void visit(AST_Class x)=0
AST_CompositionEqsAlgs_::_st
AST_StatementList _st
Definition: composition.hpp:89
AST_Composition_::hasCompositionList
bool hasCompositionList()
Definition: composition.cpp:107
AST_CompositionElement_::_el
AST_ElementList _el
Definition: composition.hpp:70
AST_Visitor
Definition: ast_util.hpp:224
AST_Visitor::leave
virtual void leave(AST_Class x)=0
AST_External_Function_Call_::languageString
string languageString()
Definition: composition.cpp:270
AST_External_Function_Call_::_cr
AST_Expression_ComponentReference _cr
Definition: composition.hpp:110
AST_Composition_::_composition_list
AST_CompositionElementList _composition_list
Definition: composition.hpp:50
AST_CompositionEqsAlgs_::getAlgorithms
AST_StatementList getAlgorithms()
Definition: composition.cpp:232
AST_External_Function_Call_::_lang
AST_String _lang
Definition: composition.hpp:106
AST_Composition_::compositionList
AST_CompositionElementList compositionList() const
Definition: composition.cpp:44
current_element
#define current_element(it)
Definition: ast_types.hpp:34
AST_External_Function_Call_::accept
void accept(AST_Visitor *visitor)
Definition: composition.cpp:289
AST_CompositionElement_::hasStatements
bool hasStatements()
Definition: composition.cpp:204
AST_Composition_::hasExternalFunctionCall
bool hasExternalFunctionCall()
Definition: composition.cpp:115
AST_Composition_
Definition: composition.hpp:34
AST_CompositionEqsAlgs_::hasStatements
bool hasStatements()
Definition: composition.cpp:258
expression.hpp
CLASSP_PRINTER_IMP
CLASSP_PRINTER_IMP(AST_Composition)
statement.hpp