1 #ifndef __DIADES__ALTARICA_EXPRESSION__HH 2 #define __DIADES__ALTARICA_EXPRESSION__HH 5 #include<arsyntax/altarica-tree.h> 34 typedef enum {
IfThenElse=0,
Case=1,
Or=2,
And=3,
Eq=4,
Neq=5,
Imply=6,
Lt=7,
Gt=8,
Leq=9,
Geq=10,
Add=11,
Sub=12,
Mul=13,
Div=14,
Mod=15,
Neg=16,
Not=17,
Paren=18,
StructMember=19,
ArrayMember=20,
Var=21,
Id=22,
Min=23,
Max=24,
True=25,
False=26,
Integer=27,
ForAll=28,
Exist=29,
FunctionCall=30,
Struct=31,
Array=32}
Category;
60 static string typeName() {
return "Altarica::Expression"; }
64 typedef std::vector<VariableDecl::ConstReference>::size_type
SizeType;
65 typedef std::vector<VariableDecl::ConstReference>
Support;
146 virtual bool valid()
const = 0;
158 VariableIterator
variableEnd()
const {
return _varSupport.end(); }
166 return _varSupport.size();
211 vector<VariableDecl::ConstReference> & mergedSupport);
219 vector<VariableDecl::ConstReference> & appendedSupport);
232 virtual bool valid()
const {
return false; }
264 return ifExpr().isConstant() && thenExpr().isConstant() && elseExpr().isConstant();
297 AlternativeIndex
last()
const {
298 return _choices.size() - 1;
303 return _choices[index];
307 return _expressions[index];
313 bool result = !_choices.empty() && (_choices.size() == _expressions.size()-1);
315 while(result && (index < _choices.size()))
317 result = _choices[index].get().valid() && _expressions[index].get().valid();
322 result = _expressions[_expressions.size()-1].get().valid();
330 return defaultCase().valueType();
338 for(AlternativeIndex index = first(); index<= last(); ++index)
340 result = result && getAlternative(index).isConstant()
341 && getAlternativeExpression(index).isConstant();
343 result = result && defaultCase().isConstant();
350 _expressions.clear();
380 Operator
op()
const {
return _op; }
387 return left().isConstant() && right().isConstant();
406 return _expr.
valid();
418 return expression().isConstant();
504 return (_array.
valid() && _exprField.
valid());
532 return getVariableDecl().type();
556 return !_ident.
str().empty();
583 return _body.begin();
591 bool result = !_body.empty();
593 while(result && (index < _body.size()))
595 result = _body[index].get().valid();
605 ExprVector::size_type index = 0;
606 while(result && (index < _body.size()-1))
608 result = _body[index].get().isConstant();
631 virtual bool valid()
const {
return true; }
660 virtual bool valid()
const {
return true; }
678 virtual bool valid()
const {
return true; }
761 vector<Identifier>::size_type
size()
const 763 return _identifiers.size();
769 return _identifiers[index];
773 return _expressions[index];
781 bool result = !_identifiers.empty() && (_identifiers.size() == _expressions.size());
783 while(result && (index < _identifiers.size()))
785 result = (!_identifiers[index].str().empty()) && (_expressions[index].
get().valid());
794 ExprVector::size_type index = 0;
795 while(result && (index != size()))
797 result = _expressions[index].get().isConstant();
820 return _array.begin();
826 ExprVector::size_type
size()
const 828 return _array.size();
834 bool result = !_array.empty();
836 while(result && (index < _array.size()))
838 result = _array[index].get().valid();
847 ExprVector::size_type index = 0;
848 while(result && (index != _array.size()))
850 result = _array[index].get().isConstant();
ExprVector::const_iterator bodyEnd() const
Expression(const NodeDecl &owner, unsigned id)
Category category() const
const Expression & right() const
An Identifier is a reference to a string (IdentifierData) that only contains alpha-numeric characters...
Category category() const
virtual bool valid() const
virtual bool isConstant() const
const Expression & expression() const
virtual bool isConstant() const
virtual bool valid() const
virtual bool valid() const
VariableIterator variableBegin() const
virtual const Type & valueType() const
const Expression & getMember() const
virtual const Type & valueType() const
virtual bool isConstant() const
vector< VariableDecl > _param
friend ostream & operator<<(ostream &os, const Expression &expr)
Category category() const
Category category() const
virtual bool isConstant() const
const Expression & left() const
ExprVector::const_iterator bodyBegin() const
virtual ~FunctionCallExpression()
Category category() const
const NodeDecl & owner() const
virtual ~BinaryExpression()
virtual bool isConstant() const
virtual bool isConstant() const
virtual bool isConstant() const
const NodeDecl & _owner
VariableDecls that are supporting the Expression.
const string & str() const
virtual Category category() const =0
const Identifier & identifier() const
std::vector< VariableDecl::ConstReference > Support
ExprVector::size_type size() const
const Expression & getStructure() const
virtual bool valid() const
virtual bool valid() const
reference_wrapper< Expression const > ConstReference
AlternativeIndex last() const
virtual const Type & valueType() const =0
const Expression & expressionOfIndex(ExprVector::size_type index) const
const Expression & right() const
const VariableDecl & getVariableDecl() const
Category category() const
bool operator==(const Expression &e) const
virtual bool valid() const
virtual bool valid() const
const Expression & nullExpression()
const Expression & elseExpr() const
const Expression & arrayExpr() const
virtual ~MinMaxExpression()
virtual bool valid() const
virtual const Type & valueType() const
Utils::Exception< Expression > Exception
virtual bool isConstant() const
virtual bool valid() const
virtual ~CaseExpression()
void appendExpressionSupports(const Expression::ExprVector &expr, vector< VariableDecl::ConstReference > &appendedSupport)
Category category() const
virtual bool valid() const
reference_wrapper< Expression > Reference
Category category() const
virtual ~ForAllExpression()
const Identifier & identifierOfIndex(vector< Identifier >::size_type index) const
virtual bool valid() const
virtual bool isConstant() const
SizeType supportSize() const
virtual bool isConstant() const
bool mergeExpressionSupports(const Expression::ExprVector &expr, vector< VariableDecl::ConstReference > &mergedSupport)
virtual bool isConstant() const
ExprVector::const_iterator bodyEnd() const
virtual ~NullExpression()
const Expression & _array
AlternativeIndex first() const
const Expression & _structure
Namespace of the Diades project.
const Expression & getAlternativeExpression(AlternativeIndex index) const
const Expression & left() const
virtual bool valid() const =0
virtual bool isConstant() const
Category category() const
virtual bool isConstant() const
virtual bool isConstant() const
const Expression & getAlternative(AlternativeIndex index) const
const Expression & _field
VariableIterator variableEnd() const
virtual ~FalseExpression()
virtual bool isConstant() const =0
ExprVector::size_type AlternativeIndex
const Expression & _right
Category category() const
virtual ~TrueExpression()
virtual ~ArrayExpression()
virtual bool valid() const
virtual bool valid() const
virtual bool valid() const
virtual bool isConstant() const
Category category() const
Category category() const
Value::BinaryOperator Operator
vector< Identifier > _identifiers
Category category() const
const AltaricaModel & model() const
const Expression & thenExpr() const
virtual bool valid() const
virtual ~IntegerExpression()
Category category() const
virtual bool isConstant() const
virtual Category category() const
vector< Identifier >::size_type size() const
virtual bool isConstant() const
virtual bool isConstant() const
std::vector< VariableDecl::ConstReference >::size_type SizeType
const Expression & ifExpr() const
virtual ~UnaryExpression()
std::vector< ConstReference > ExprVector
const Expression & _exprField
ExprVector::const_iterator bodyBegin() const
const Expression & indexExpr() const
virtual const Type & valueType() const
virtual ~StructExpression()
Category category() const
const Expression & defaultCase() const
std::vector< VariableDecl::ConstReference >::const_iterator VariableIterator
virtual ~ExistExpression()
Category category() const
const Support & support() const
Category category() const