33 #define IS_CREF(X) ((X)->expressionType() == EXPCOMPREF) 
   34 #define IS_UMINUS(X) ((X)->expressionType() == EXPUMINUS) 
   35 #define IS_UMINUS_VAR(X) (IS_UMINUS(X) && IS_CREF((X)->getAsUMinus()->exp())) 
   36 #define UMINUS_EXP(X) ((X)->getAsUMinus()->exp()) 
   37 #define CREF_NAME(X) \ 
   38   (IS_UMINUS(X) ? *(UMINUS_EXP(X)->getAsComponentReference()->names()->front()) : *((X)->getAsComponentReference()->names()->front())) 
   39 #define IS_VAR(X) ((IS_CREF(X) || IS_UMINUS_VAR(X)) && (!IS_PARAMETER(X))) 
   40 #define IS_ZERO_REAL(X) ((X)->expressionType() == EXPREAL && (X)->getAsReal()->val() == 0.0) 
   41 #define IS_ZERO_INT(X) ((X)->expressionType() == EXPINTEGER && (X)->getAsInteger()->val() == 0) 
   42 #define IS_ZERO(X) (IS_ZERO_REAL(X) || IS_ZERO_INT(X)) 
   43 #define IS_ADD(X) ((X)->expressionType() == EXPBINOP && (X)->getAsBinOp()->binopType() == BINOPADD) 
   44 #define LEFT_EXP(X) ((X)->getAsBinOp()->left()) 
   45 #define RIGHT_EXP(X) ((X)->getAsBinOp()->right()) 
   46 #define IS_SUB(X) ((X)->expressionType() == EXPBINOP && (X)->getAsBinOp()->binopType() == BINOPSUB) 
   47 #define IS_SUM_(X) (IS_SUB(X) || IS_ADD(X)) 
   48 #define IS_SUM_OF_VARS(X) (IS_SUM_(X) && (IS_VAR((X)->getAsBinOp()->left()) && IS_VAR((X)->getAsBinOp()->right()))) 
   49 #define IS_STATE(X) (_varSymbolTable->lookup(CREF_NAME(X)) != nullptr && _varSymbolTable->lookup(CREF_NAME(X))->isState()) 
   50 #define IS_PARAMETER(X)                                                                                                                   \ 
   52        ? _varSymbolTable->lookup(CREF_NAME(UMINUS_EXP(X))) != nullptr && _varSymbolTable->lookup(CREF_NAME(UMINUS_EXP(X)))->isParameter() \ 
   53        : _varSymbolTable->lookup(CREF_NAME(X)) != nullptr && _varSymbolTable->lookup(CREF_NAME(X))->isParameter()) 
   55   ((X)->expressionType() == EXPBINOP && (X)->getAsBinOp()->binopType() >= BINOPLOWER && (X)->getAsBinOp()->binopType() <= BINOPGREATEREQ) 
   56 #define IS_BNOT(X) ((X)->expressionType() == EXPBOOLEANNOT) 
   57 #define _VAR(v) newAST_Expression_ComponentReferenceExp(v) 
   58 #define GREATER(l, r) newAST_Expression_BinOp(l, r, BINOPGREATER) 
   59 #define LOWER(l, r) newAST_Expression_BinOp(l, r, BINOPLOWER) 
   60 #define ADD(l, r) newAST_Expression_BinOp(l, r, BINOPADD) 
   61 #define MULT(l, r) newAST_Expression_BinOp(l, r, BINOPMULT) 
   62 #define SUB(l, r) newAST_Expression_BinOp(l, r, BINOPSUB) 
   63 #define I(n) newAST_Expression_Integer(n) 
   64 #define _R(n) newAST_Expression_Real(n) 
   65 #define _PA(e) newAST_Expression_OutputExpressions(e) 
   66 #define UMENOS(e) SUB(I(1), e) 
   67 #define UNARYM(e) newAST_Expression_UnaryMinus(e) 
   68 #define GREATEREQ(l, r) newAST_Expression_BinOp(l, r, BINOPGREATEREQ) 
   69 #define LOWEREQ(l, r) newAST_Expression_BinOp(l, r, BINOPLOWERWQ) 
   70 #define EQUAL(l, r) newAST_Expression_BinOp(l, r, BINOPCOMPEQ) 
   75   AST_Expression 
apply(AST_Expression);
 
   88     switch (e->expressionType()) {
 
   90       AST_Expression_BinOp b = e->getAsBinOp();
 
  108   AST_Expression 
_left;
 
  118 template <
class F, 
class R, 
class V>
 
  127     switch (stm->statementType()) {
 
  130       AST_StatementListIterator it;
 
  131       AST_StatementList l = stm->getAsWhen()->statements();
 
  146       AST_StatementListIterator it;
 
  147       AST_StatementList l = stm->getAsIf()->statements();
 
  151       l = stm->getAsIf()->else_statements();
 
  155       AST_Statement_ElseListIterator eit;
 
  156       AST_Statement_ElseList el = stm->getAsIf()->else_if();
 
  167       AST_StatementListIterator it;
 
  168       AST_StatementList l = stm->getAsFor()->statements();
 
  175       AST_Statement_OutputAssigment out_stm = stm->getAsOutputAssigment();
 
  176       AST_Expression call_exp = 
newAST_Expression_Call(
new string(out_stm->function()->cname()), 
nullptr, out_stm->arguments());
 
  201     switch (e->expressionType()) {
 
  203       AST_Expression_BinOp b = e->getAsBinOp();
 
  204       AST_Expression left = b->left(), right = b->right();
 
  208       AST_Expression_Output o = e->getAsOutput();
 
  227   virtual void visit(AST_Class x) = 0;
 
  228   virtual void leave(AST_Class x) = 0;
 
  229   virtual void visit(AST_Composition x) = 0;
 
  230   virtual void leave(AST_Composition x) = 0;
 
  231   virtual void visit(AST_CompositionElement x) = 0;
 
  232   virtual void leave(AST_CompositionElement x) = 0;
 
  233   virtual void visit(AST_CompositionEqsAlgs x) = 0;
 
  234   virtual void leave(AST_CompositionEqsAlgs x) = 0;
 
  235   virtual void visit(AST_External_Function_Call) = 0;
 
  236   virtual void visit(AST_Element x) = 0;
 
  237   virtual void visit(AST_Modification x) = 0;
 
  238   virtual void leave(AST_Modification x) = 0;
 
  239   virtual void visit(AST_Comment x) = 0;
 
  240   virtual void visit(AST_Equation x) = 0;
 
  241   virtual void visit(AST_ForIndex x) = 0;
 
  242   virtual void visit(AST_Equation_Else x) = 0;
 
  243   virtual void visit(AST_Expression x) = 0;
 
  244   virtual void visit(AST_Argument x) = 0;
 
  245   virtual void visit(AST_Statement x) = 0;
 
  246   virtual void leave(AST_Statement x) = 0;
 
  247   virtual void visit(AST_Statement_Else x) = 0;
 
  248   virtual void visit(AST_StoredDefinition x) = 0;
 
  249   virtual void leave(AST_StoredDefinition x) = 0;
 
  250   virtual int apply(AST_Node x) = 0;
 
  259   bool _compareList(AST_ExpressionList ael, AST_ExpressionList bel);
 
  262   bool compareArrays(AST_Expression_ComponentReference arrayA, AST_Expression_ComponentReference arrayB);
 
  278   AST_Expression 
replaceExp(AST_Expression rep, AST_Expression for_exp, AST_Expression in,