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,