MicroModelicaCCompiler  4.5.3
ast_util.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 "ast_util.hpp"
21 
22 #include <math.h>
23 #include <list>
24 #include <map>
25 #include <set>
26 #include <sstream>
27 
28 #include <ast/ast_builder.hpp>
29 #include <ast/equation.hpp>
30 #include <ast/modification.hpp>
31 #include <ast/parser/parse.hpp>
32 #include <ast/statement.hpp>
33 #include "debug.hpp"
34 #include "error.hpp"
35 #include <ir/annotation.hpp>
36 #include <ir/class.hpp>
37 #include <ir/equation.hpp>
38 #include <ir/expression.hpp>
39 #include <ir/event.hpp>
40 #include "macros.hpp"
41 #include "model_config.hpp"
42 #include "symbol_table.hpp"
43 #include "type.hpp"
44 #include "util.hpp"
45 
46 using namespace MicroModelica::Util;
47 using namespace MicroModelica::IR;
48 
49 AST_Expression AST_Expression_Traverse::apply(AST_Expression e)
50 {
51  AST_Expression e2 = mapTraverseElement(e);
52  switch (e2->expressionType()) {
53  case EXPBINOP: {
54  AST_Expression_BinOp b = e2->getAsBinOp();
55  return (newAST_Expression_BinOp(apply(b->left()), apply(b->right()), b->binopType()));
56  }
57  case EXPBOOLEANNOT: {
58  AST_Expression_BooleanNot n = e2->getAsBooleanNot();
59  return newAST_Expression_BooleanNot(apply(n->exp()));
60  }
61  case EXPUMINUS: {
62  AST_Expression_UMinus m = e2->getAsUMinus();
63  return newAST_Expression_UnaryMinus(apply(m->exp()));
64  }
65  case EXPOUTPUT: {
66  AST_Expression_Output b = e2->getAsOutput();
67  AST_ExpressionList ls = new list<AST_Expression>();
68  AST_ListAppend(ls, apply(b->expressionList()->front()));
70  }
71  case EXPIF: {
72  AST_Expression_If i = e2->getAsIf();
73  return (newAST_Expression_If(apply(i->condition()), apply(i->then()), i->elseif_list(), apply(i->else_exp())));
74  }
75  case EXPCALL: {
76  AST_Expression_Call c = e2->getAsCall();
77  AST_ExpressionList args = newAST_ExpressionList();
78  AST_ExpressionListIterator args_it;
79  foreach (args_it, c->arguments()) {
80  AST_ListAppend(args, apply(current_element(args_it)));
81  }
82  return newAST_Expression_Call(c->name(), newAST_StringNull(), args);
83  }
84  default:
85  /* TODO */
86  break;
87  }
88  return e2;
89 }
90 
92 
93 bool EqualExp::equalTraverse(AST_Expression a, AST_Expression b)
94 {
95  if (a->expressionType() != b->expressionType()) {
96  return false;
97  }
98  switch (a->expressionType()) {
99  case EXPBINOP: {
100  AST_Expression_BinOp binOpA = a->getAsBinOp();
101  AST_Expression_BinOp binOpB = b->getAsBinOp();
102  return (equalTraverse(binOpA->left(), binOpB->left()) && equalTraverse(binOpA->right(), binOpB->right()));
103  }
104  default:
105  return equalTraverseElement(a, b);
106  }
107 }
108 
109 bool EqualExp::_compareList(AST_ExpressionList ael, AST_ExpressionList bel)
110 {
111  if (AST_Length(ael) != AST_Length(bel)) {
112  return false;
113  }
114  AST_ExpressionListIterator it;
115  bool ret = true;
116  int c = 0;
117  foreach (it, ael) {
118  AST_Expression eb = AST_ListAt(bel, c++);
119  ret = ret && equalTraverse(current_element(it), eb);
120  }
121  return ret;
122 }
123 
124 bool EqualExp::equalTraverseElement(AST_Expression a, AST_Expression b)
125 {
126  if (a->expressionType() != b->expressionType()) {
127  return false;
128  }
129  switch (a->expressionType()) {
130  case EXPCOMPREF: {
131  AST_Expression_ComponentReference compRefA = a->getAsComponentReference();
132  Option<Variable> varInfoA = ModelConfig::instance().lookup(CREF_NAME(compRefA));
133  if (varInfoA && varInfoA->type()->getType() == SymbolType::TYARRAY) {
134  return compareArrays(compRefA, b->getAsComponentReference());
135  } else {
136  return CREF_NAME(a).compare(CREF_NAME(b)) == 0;
137  }
138  }
139  case EXPDERIVATIVE: {
140  AST_ExpressionList argsA = a->getAsDerivative()->arguments();
141  AST_ExpressionList argsB = b->getAsDerivative()->arguments();
142  if (argsA->size() != argsB->size()) {
143  return false;
144  }
145  ERROR_UNLESS(argsA->size() == 1,
146  "EqualExp::equalTraverseElement:\n"
147  "AST_Expression_Derivative with more than 1 argument are not supported yet.\n");
148  AST_Expression_ComponentReference compRef1 = a->getAsDerivative()->arguments()->front()->getAsComponentReference();
149  AST_Expression_ComponentReference compRef2 = b->getAsDerivative()->arguments()->front()->getAsComponentReference();
150  return equalTraverse(compRef1, compRef2);
151  }
152  case EXPREAL: {
153  AST_Expression_Real realA = a->getAsReal();
154  AST_Expression_Real realB = b->getAsReal();
155  return realA->val() == realB->val();
156  }
157  case EXPINTEGER: {
158  AST_Expression_Integer intA = a->getAsInteger();
159  AST_Expression_Integer intB = b->getAsInteger();
160  return intA->val() == intB->val();
161  }
162  case EXPCALL: {
163  string nameA = *(a->getAsCall()->name());
164  string nameB = *(b->getAsCall()->name());
165  if (nameA.compare(nameB)) {
166  return false;
167  }
168  AST_ExpressionList ael = a->getAsCall()->arguments();
169  AST_ExpressionList bel = b->getAsCall()->arguments();
170  return _compareList(ael, bel);
171  }
172  case EXPCALLARG: {
173  AST_ExpressionList ael = a->getAsCallArgs()->arguments();
174  AST_ExpressionList bel = b->getAsCallArgs()->arguments();
175  return _compareList(ael, bel);
176  }
177  case EXPBRACE: {
178  AST_ExpressionList ael = a->getAsBrace()->arguments();
179  AST_ExpressionList bel = b->getAsBrace()->arguments();
180  return _compareList(ael, bel);
181  }
182  case EXPOUTPUT: {
183  AST_ExpressionList ael = a->getAsOutput()->expressionList();
184  AST_ExpressionList bel = b->getAsOutput()->expressionList();
185  return _compareList(ael, bel);
186  }
187  case EXPUMINUS: {
188  AST_Expression_UMinus m = a->getAsUMinus();
189  AST_Expression_UMinus m1 = b->getAsUMinus();
190  return equalTraverseElement(m->exp(), m1->exp());
191  }
192  default:
193  ERROR(
194  "EqualExp::equalTraverseElement:\n"
195  "Incorrect AST_Expression_Type %s",
196  a->expressionType());
197  }
198  return true;
199 }
200 
201 Option<Variable> EqualExp::getVarInfo(AST_Expression_ComponentReference compRef)
202 {
203  Option<Variable> varInfo;
204  AST_StringList names = compRef->names();
205  if (names->size() > 0) {
206  ERROR_UNLESS(names->size() == 1,
207  "EqualExp::getVariable\n"
208  "AST_Component_Reference with names list bigger than 1 are not supported yet.\n");
209  AST_String name = names->front();
210  varInfo = ModelConfig::instance().lookup(*name);
211  } else {
212  varInfo = ModelConfig::instance().lookup(compRef->name());
213  }
214  return varInfo;
215 }
216 
217 bool EqualExp::compareArrays(AST_Expression_ComponentReference arrayA, AST_Expression_ComponentReference arrayB)
218 {
219  AST_ExpressionListList indexesListA = arrayA->indexes();
220  AST_ExpressionListList indexesListB = arrayB->indexes();
221  ERROR_UNLESS(indexesListA->size() == indexesListB->size(),
222  "EqualExp::compareArrays:\n"
223  "indexes list sizes should be equal.\n");
224  ERROR_UNLESS(indexesListA->size() == 1,
225  "EqualExp::compareArrays:\n"
226  "Indexes list sizes greater than 1 are not supported yet.\n");
227  AST_ExpressionList indexesA = indexesListA->front();
228  AST_ExpressionList indexesB = indexesListB->front();
229  ERROR_UNLESS(indexesA->size() == indexesB->size(),
230  "EqualExp::compareArrays:\n"
231  "indexes sizes should be equal.\n");
232  ERROR_UNLESS(indexesA->size() == 1,
233  "EqualExp::compareArrays:\n"
234  "Multidimensional arrays are not supported yet.\n");
235  return equalTraverse(indexesA->front(), indexesB->front());
236 }
237 
238 bool IsConstant::foldTraverseElement(bool b1, bool b2, BinOpType) { return b1 && b2; }
239 
240 bool IsConstant::foldTraverseElementUMinus(AST_Expression e) { return apply(e->getAsUMinus()->exp()); }
241 
242 bool IsConstant::foldTraverseElement(AST_Expression e)
243 {
244  switch (e->expressionType()) {
245  case EXPREAL:
246  case EXPINTEGER:
247  case EXPSTRING:
248  case EXPBOOLEAN:
249  return true;
250  case EXPCOMPREF: {
251  AST_Expression_ComponentReference cr = e->getAsComponentReference();
252  Option<Variable> v = _st[cr->name()];
253  if (v->isParameter()) {
254  return true;
255  }
256  // Check symbol table!!!
257  return false;
258  }
259  default:
260  break;
261  }
262  return false;
263 }
264 
265 AST_Expression ReplaceExp::replaceExp(AST_Expression rep, AST_Expression for_exp, AST_Expression in, VarSymbolTable symbol_table)
266 {
267  _rep = rep;
268  _for_exp = for_exp;
269  _in = in;
270  _symbol_table = symbol_table;
271  return apply(in);
272 }
273 
274 AST_Expression ReplaceExp::mapTraverseElement(AST_Expression e)
275 {
276  EqualExp *equalExp = new EqualExp();
277  if (equalExp->equalTraverse(e, _rep)) {
278  return _for_exp;
279  }
280  return e;
281 }
282 
284 
285 AST_Expression ReplaceBoolean::foldTraverseElement(AST_Expression b1, AST_Expression b2, BinOpType t)
286 {
287  return newAST_Expression_BinOp(b1, b2, t);
288 }
289 
290 AST_Expression ReplaceBoolean::foldTraverseElementUMinus(AST_Expression u)
291 {
292  return newAST_Expression_UnaryMinus(apply(u->getAsUMinus()->exp()));
293 }
294 
295 AST_Expression ReplaceBoolean::foldTraverseElement(AST_Expression e)
296 {
297  switch (e->expressionType()) {
298  case EXPBOOLEAN: {
299  AST_Expression_Boolean b = e->getAsBoolean();
300  if (b->value()) {
301  return newAST_Expression_Real(1.0);
302  } else {
303  return newAST_Expression_Real(0.0);
304  }
305  }
306  default:
307  return e;
308  }
309 }
310 
312 
313 AST_Expression WhenEqualityTrasforms::foldTraverseElement(AST_Expression b1, AST_Expression b2, BinOpType t)
314 {
315  return newAST_Expression_BinOp(b1, b2, t);
316 }
317 
318 AST_Expression WhenEqualityTrasforms::foldTraverseElementUMinus(AST_Expression u)
319 {
320  return newAST_Expression_UnaryMinus(apply(u->getAsUMinus()->exp()));
321 }
322 
323 AST_Expression WhenEqualityTrasforms::foldTraverseElement(AST_Expression e)
324 {
325  switch (e->expressionType()) {
326  case EXPBOOLEAN: {
327  AST_Expression_Boolean b = e->getAsBoolean();
328  if (b->value()) {
329  return newAST_Expression_Real(1.0);
330  } else {
331  return newAST_Expression_Real(0.0);
332  }
333  /* case EXPUMINUS:
334  AST_Expression_UMinus u = e->getAsUMinus();
335  return newAST_Expression_UnaryMinus( foldTraverse(u->exp()) );
336  */
337  }
338  case EXPOUTPUT: {
339  AST_Expression_Output b = e->getAsOutput();
340  return newAST_Expression_OutputExpressions(newAST_SimpleList(apply(b->expressionList()->front())));
341  }
342  case EXPCALL: {
343  AST_Expression_Call call = e->getAsCall();
344  if (toStr(call->name()) == "edge") {
345  return GREATER(call->arguments()->front(), _R(0.5));
346  }
347  return call;
348  }
349  case EXPCOMPREF:
350  return e;
351  case EXPBOOLEANNOT: {
352  AST_Expression_BooleanNot no = e->getAsBooleanNot();
353  return newAST_Expression_BooleanNot(apply(no->exp()));
354  }
355  case EXPIF: {
356  AST_Expression_If i = e->getAsIf();
357  AST_Expression eq1 = apply(i->then());
358  AST_Expression eq2 = apply(i->else_exp());
359  AST_Expression cond = apply(i->condition());
360  return newAST_Expression_If(cond, eq1, newAST_ExpressionList(), eq2);
361  }
362  default:
363  return e;
364  }
365 }
366 
367 PreChange::PreChange(PreSet p) { _pre = p; }
368 
369 AST_Expression PreChange::foldTraverseElement(AST_Expression b1, AST_Expression b2, BinOpType t)
370 {
371  return newAST_Expression_BinOp(b1, b2, t);
372 }
373 
374 AST_Expression PreChange::foldTraverseElementUMinus(AST_Expression u)
375 {
376  return newAST_Expression_UnaryMinus(apply(u->getAsUMinus()->exp()));
377 }
378 
379 AST_Expression PreChange::foldTraverseElement(AST_Expression e)
380 {
381  switch (e->expressionType()) {
382  case EXPOUTPUT: {
383  AST_Expression_Output b = e->getAsOutput();
384  return (newAST_Expression_OutputExpressions(newAST_SimpleList(apply(b->expressionList()->front()))));
385  }
386  case EXPCALL: {
387  AST_Expression_Call call = e->getAsCall();
388  AST_ExpressionListIterator it;
389  foreach (it, call->arguments()) {
390  current_element(it) = apply(current_element(it));
391  }
392  return call;
393  }
394  case EXPCOMPREF: {
395  AST_Expression_ComponentReference cr = e->getAsComponentReference();
396  if (_pre->find(cr->name()) != _pre->end()) {
397  return (newAST_Expression_Call(_MMOC_S("pre"), nullptr, newAST_SimpleList(static_cast<AST_Expression>(cr))));
398  }
399  return e;
400  }
401  case EXPBOOLEANNOT: {
402  AST_Expression_BooleanNot no = e->getAsBooleanNot();
403  return newAST_Expression_BooleanNot(apply(no->exp()));
404  }
405  default:
406  return e;
407  }
408 }
409 
411 
412 bool FindReference::foldTraverseElement(bool b1, bool b2, BinOpType t) { return b1 || b2; }
413 
414 bool FindReference::foldTraverseElementUMinus(AST_Expression u) { return apply(u->getAsUMinus()->exp()); }
415 
417 {
418  switch (e->expressionType()) {
419  case EXPOUTPUT: {
420  AST_Expression_Output b = e->getAsOutput();
421  return apply(b->expressionList()->front());
422  }
423  case EXPCALL: {
424  AST_Expression_Call call = e->getAsCall();
425  AST_ExpressionListIterator it;
426  bool b = false;
427  foreach (it, call->arguments())
428  b |= apply(current_element(it));
429  return b;
430  }
431  case EXPCOMPREF: {
432  AST_Expression_ComponentReference cr = e->getAsComponentReference();
433  return cr->name() == toStr(_var);
434  }
435  case EXPBOOLEANNOT: {
436  AST_Expression_BooleanNot no = e->getAsBooleanNot();
437  return apply(no->exp());
438  }
439  case EXPIF: {
440  AST_Expression_If i = e->getAsIf();
441  bool eq1 = apply(i->then());
442  bool eq2 = apply(i->else_exp());
443  bool cond = apply(i->condition());
444  return eq1 || eq2 || cond;
445  }
446  default:
447  return false;
448  }
449 }
450 
452 {
453  _pre = pre;
454  _post = post;
455 }
456 
457 AST_Expression ReplaceReference::foldTraverseElement(AST_Expression b1, AST_Expression b2, BinOpType t)
458 {
459  return newAST_Expression_BinOp(b1, b2, t);
460 }
461 
462 AST_Expression ReplaceReference::foldTraverseElementUMinus(AST_Expression u)
463 {
464  return newAST_Expression_UnaryMinus(apply(u->getAsUMinus()->exp()));
465 }
466 
467 AST_Expression ReplaceReference::foldTraverseElement(AST_Expression e)
468 {
469  switch (e->expressionType()) {
470  case EXPOUTPUT: {
471  AST_Expression_Output b = e->getAsOutput();
472  return (newAST_Expression_OutputExpressions(newAST_SimpleList(apply(b->expressionList()->front()))));
473  }
474  case EXPCALL: {
475  AST_Expression_Call call = e->getAsCall();
476  AST_ExpressionListIterator it;
477  foreach (it, call->arguments()) {
478  current_element(it) = apply(current_element(it));
479  }
480  return call;
481  }
482  case EXPCOMPREF: {
483  AST_Expression_ComponentReference cr = e->getAsComponentReference();
484  if (cr->name() == toStr(_pre)) {
486  }
487  return e;
488  }
489  case EXPBOOLEANNOT: {
490  AST_Expression_BooleanNot no = e->getAsBooleanNot();
491  return newAST_Expression_BooleanNot(apply(no->exp()));
492  }
493  default:
494  return e;
495  }
496 }
PreSet
PreSet_ * PreSet
Definition: ast_types.hpp:44
equation.hpp
MicroModelica::Util::ModelConfig::lookup
Option< Variable > lookup(std::string var_name)
Definition: model_config.hpp:125
EXPINTEGER
@ EXPINTEGER
Definition: ast_types.hpp:180
EqualExp::getVarInfo
Option< MicroModelica::Util::Variable > getVarInfo(AST_Expression_ComponentReference compRef)
Definition: ast_util.cpp:201
EXPOUTPUT
@ EXPOUTPUT
Definition: ast_types.hpp:182
toStr
#define toStr(it)
Definition: ast_builder.hpp:53
MicroModelica::Util::ERROR
void ERROR(const char *format,...)
Definition: debug.cpp:101
MicroModelica::Util
Definition: equation.hpp:44
ast_builder.hpp
EXPCOMPREF
@ EXPCOMPREF
Definition: ast_types.hpp:165
MicroModelica::Util::VarSymbolTable
Definition: symbol_table.hpp:184
WhenEqualityTrasforms::foldTraverseElementUMinus
AST_Expression foldTraverseElementUMinus(AST_Expression)
Definition: ast_util.cpp:318
newAST_StringNull
AST_String newAST_StringNull()
Definition: ast_builder.cpp:97
newAST_Expression_Real
AST_Expression newAST_Expression_Real(AST_Real r)
Definition: ast_builder.cpp:163
EXPUMINUS
@ EXPUMINUS
Definition: ast_types.hpp:176
expression.hpp
macros.hpp
WhenEqualityTrasforms::foldTraverseElement
AST_Expression foldTraverseElement(AST_Expression)
Definition: ast_util.cpp:323
EqualExp::compareArrays
bool compareArrays(AST_Expression_ComponentReference arrayA, AST_Expression_ComponentReference arrayB)
Definition: ast_util.cpp:217
EXPCALLARG
@ EXPCALLARG
Definition: ast_types.hpp:171
newAST_Expression_BooleanNot
AST_Expression newAST_Expression_BooleanNot(AST_Expression e)
Definition: ast_builder.cpp:347
ReplaceReference::foldTraverseElement
AST_Expression foldTraverseElement(AST_Expression)
Definition: ast_util.cpp:467
symbol_table.hpp
ast_util.hpp
event.hpp
FindReference::FindReference
FindReference(AST_String)
Definition: ast_util.cpp:410
EqualExp::equalTraverse
bool equalTraverse(AST_Expression a, AST_Expression b)
Definition: ast_util.cpp:93
EXPIF
@ EXPIF
Definition: ast_types.hpp:170
Option
Definition: util_types.hpp:32
AST_String
string * AST_String
Definition: ast_types.hpp:46
FindReference::foldTraverseElement
bool foldTraverseElement(AST_Expression)
Definition: ast_util.cpp:416
WhenEqualityTrasforms::WhenEqualityTrasforms
WhenEqualityTrasforms()
Definition: ast_util.cpp:311
model_config.hpp
newAST_Expression_ComponentReferenceExp
AST_Expression newAST_Expression_ComponentReferenceExp(AST_String s)
Definition: ast_builder.cpp:198
PreChange::PreChange
PreChange(PreSet)
Definition: ast_util.cpp:367
newAST_Expression_UnaryMinus
AST_Expression newAST_Expression_UnaryMinus(AST_Expression e)
Definition: ast_builder.cpp:294
EXPDERIVATIVE
@ EXPDERIVATIVE
Definition: ast_types.hpp:167
PreChange::foldTraverseElementUMinus
AST_Expression foldTraverseElementUMinus(AST_Expression)
Definition: ast_util.cpp:374
FindReference::foldTraverseElementUMinus
bool foldTraverseElementUMinus(AST_Expression)
Definition: ast_util.cpp:414
EXPBOOLEAN
@ EXPBOOLEAN
Definition: ast_types.hpp:177
IsConstant::foldTraverseElement
bool foldTraverseElement(AST_Expression)
Definition: ast_util.cpp:242
AST_Length
int AST_Length(list< T1 > *l1)
Definition: ast_types.hpp:292
ReplaceReference::foldTraverseElementUMinus
AST_Expression foldTraverseElementUMinus(AST_Expression)
Definition: ast_util.cpp:462
type.hpp
AST_ListAppend
list< T1 > * AST_ListAppend(list< T1 > *l, T1 e)
Definition: ast_types.hpp:240
MicroModelica::Util::ERROR_UNLESS
void ERROR_UNLESS(bool condition, const char *format,...)
Definition: debug.cpp:115
equation.hpp
EXPCALL
@ EXPCALL
Definition: ast_types.hpp:173
newAST_Expression_BinOp
AST_Expression newAST_Expression_BinOp(AST_Expression left, AST_Expression right, BinOpType type)
Definition: ast_builder.cpp:265
MicroModelica::Util::ModelConfig::instance
static ModelConfig & instance()
Definition: model_config.hpp:87
EqualExp::EqualExp
EqualExp()
Definition: ast_util.cpp:91
_R
#define _R(n)
Definition: ast_util.hpp:64
debug.hpp
EqualExp::_compareList
bool _compareList(AST_ExpressionList ael, AST_ExpressionList bel)
Definition: ast_util.cpp:109
ReplaceExp::mapTraverseElement
AST_Expression mapTraverseElement(AST_Expression)
Definition: ast_util.cpp:274
EXPBOOLEANNOT
@ EXPBOOLEANNOT
Definition: ast_types.hpp:181
ReplaceBoolean::foldTraverseElement
AST_Expression foldTraverseElement(AST_Expression)
Definition: ast_util.cpp:295
newAST_SimpleList
list< T1 > * newAST_SimpleList(T1 t)
Definition: ast_types.hpp:311
AST_ListAt
T1 AST_ListAt(list< T1 > *l1, int i)
Definition: ast_types.hpp:298
ReplaceExp::replaceExp
AST_Expression replaceExp(AST_Expression rep, AST_Expression for_exp, AST_Expression in, MicroModelica::Util::VarSymbolTable symbol_table)
Definition: ast_util.cpp:265
ReplaceBoolean::foldTraverseElementUMinus
AST_Expression foldTraverseElementUMinus(AST_Expression)
Definition: ast_util.cpp:290
modification.hpp
ReplaceReference::ReplaceReference
ReplaceReference(AST_String, AST_String)
Definition: ast_util.cpp:451
newAST_Expression_If
AST_Expression newAST_Expression_If(AST_Expression cond, AST_Expression then, AST_ExpressionList else_list, AST_Expression else_exp)
Definition: ast_builder.cpp:305
newAST_Expression_OutputExpressions
AST_Expression newAST_Expression_OutputExpressions(AST_ExpressionList exp_list)
Definition: ast_builder.cpp:522
IsConstant::foldTraverseElementUMinus
bool foldTraverseElementUMinus(AST_Expression)
Definition: ast_util.cpp:240
EXPBINOP
@ EXPBINOP
Definition: ast_types.hpp:166
CREF_NAME
#define CREF_NAME(X)
Definition: ast_util.hpp:37
ReplaceBoolean::ReplaceBoolean
ReplaceBoolean()
Definition: ast_util.cpp:283
newAST_Expression_Call
AST_Expression newAST_Expression_Call(AST_String name, AST_String rest, AST_ExpressionList args)
Definition: ast_builder.cpp:331
BinOpType
BinOpType
Definition: ast_types.hpp:137
_MMOC_S
#define _MMOC_S(s)
Definition: macros.hpp:32
EXPREAL
@ EXPREAL
Definition: ast_types.hpp:179
newAST_ExpressionList
AST_ExpressionList newAST_ExpressionList(AST_Expression e)
Definition: ast_builder.cpp:132
AST_Expression_Traverse::apply
AST_Expression apply(AST_Expression)
Definition: ast_util.cpp:49
annotation.hpp
EqualExp
Definition: ast_util.hpp:253
MicroModelica::IR
Definition: alg_usage.cpp:47
EXPBRACE
@ EXPBRACE
Definition: ast_types.hpp:172
SymbolType::TYARRAY
@ TYARRAY
GREATER
#define GREATER(l, r)
Definition: ast_util.hpp:58
class.hpp
current_element
#define current_element(it)
Definition: ast_types.hpp:34
PreChange::foldTraverseElement
AST_Expression foldTraverseElement(AST_Expression)
Definition: ast_util.cpp:379
util.hpp
EqualExp::equalTraverseElement
bool equalTraverseElement(AST_Expression a, AST_Expression b)
Definition: ast_util.cpp:124
EXPSTRING
@ EXPSTRING
Definition: ast_types.hpp:178
error.hpp
statement.hpp