/**
*
* OOAS Compiler - C++ AST
*
* Copyright 2015, AIT Austrian Institute of Technology.
* All rights reserved.
*
* SEE THE "LICENSE" FILE FOR THE TERMS UNDER WHICH THIS FILE IS PROVIDED.
*
* If you modify the file please update the list of contributors below to in-
* clude your name. Please also stick to the coding convention of using TABs
* to do the basic (block-level) indentation and spaces for anything after
* that. (Enable the display of special chars and it should be pretty obvious
* what this means.) Also, remove all trailing whitespace.
*
* Contributors:
* Willibald Krenn (AIT)
* Stephan Zimmerer (AIT)
* Christoph Czurda (AIT)
*
*/
#pragma once
#include
#include
#include
#include
#include
#include
#include
namespace Ast {
/**
* You must not change the assigned values as this
* needs to be kept in sync with the definitions in Argos!
*/
enum class ExpressionKind : std::uint8_t
{
/*tern.*/
conditional = 0,
/*map binary*/
domresby = 1, domresto = 2, rngresby = 3, rngresto = 4, munion = 5,
/*set/list binary*/
conc = 6, diff = 7, inter = 8, elemin = 9, notelemin = 10, subset = 11, _union = 12,
/*numeric binary*/
div = 13, greater = 14, greaterequal = 15, idiv = 16, less = 17, lessequal = 18,
minus = 19, mod = 20, pow = 21, prod = 22, sum = 23,
/*bool binary*/
_and = 24, biimplies = 25, implies = 26, _or = 27,
/*other binary*/
equal = 28, notequal = 29, seqmod_mapoverride = 30,
/*map unary*/
dom = 31, range = 32, merge = 33,
/*set/list unary*/
card = 34, dconc = 35, dinter = 36, dunion = 37, elems = 38, head = 39,
inds = 40, len = 41, tail = 42,
/*unary numberic*/
unminus = 43, unplus = 44, _not = 45, abs = 46,
/*unary quantors*/
forall = 47, exists = 48,
/*Constructors*/
ListConstr = 49, SetConstr = 50, MapConstr = 51, TupleConstr = 52, ObjectConstr = 53, QValConstr = 54,
/* identifier */
Identifier = 55,
UnresolvedIdentifier = 56,
Type = 57,
/* tuple access and method call */
TupleMapAccess = 58, Call = 59,
/* point operator */
Access = 60,
/* primed */
Primed = 61,
/* cast */
Cast = 62,
/* fold */
foldLR = 63,
foldRL = 64,
/* values */
Value_Integer = 65,
Value_Bool = 66,
Value_Reference = 67,
EXPRESSIONKIND_LAST_ITEM = Value_Reference
};
#define EXPRESSIONKIND_NR_ITEMS ((std::uint8_t)ExpressionKind::EXPRESSIONKIND_LAST_ITEM + 1)
class Expression:
public AstElement
{
protected:
typedef Expression* (*ConstrPtr)(ExpressionKind k);
typedef Expression* (*CopyConstrPtr) (const Expression& toCopy);
ExpressionKind m_kind;
Type* m_type;
std::int32_t m_line;
std::int32_t m_pos;
SymbolTable* m_freeVariables;
FunctionIdentifierList m_callTargets;
Expression(ExpressionKind kind):
AstElement(AstNodeTypeEnum::expression),
m_kind(kind),
m_type (nullptr),
m_line (-1),
m_pos (-1),
m_freeVariables (nullptr)
{}
Expression(const Expression& toCopy):
AstElement(AstNodeTypeEnum::expression),
m_kind (toCopy.m_kind),
m_type (toCopy.m_type),
m_line (toCopy.m_line),
m_pos (toCopy.m_pos),
m_freeVariables (toCopy.m_freeVariables)
{}
~Expression()
{}
static Base::FuncPtr s_exprVmt [2][EXPRESSIONKIND_NR_ITEMS];
static Expression* createVirtual(ExpressionKind k);
static Expression* createVirtual(const Expression& toCopy);
public:
friend class Ast;
void init(
std::int32_t line,
std::int32_t pos,
Type* typeRef,IdentifierList* callTargetsIdentifierListRef,
SymbolTable* symbTabRef)
{
m_line = line;
m_pos = pos;
m_type = typeRef;
m_callTargets.clear();
if (callTargetsIdentifierListRef != nullptr) {
for (auto& id: *callTargetsIdentifierListRef) {
IdentifierKind kind = id->kind();
if (kind != IdentifierKind::MethodIdentifier &&
kind != IdentifierKind::NamedActionIdentifier)
{
throw new Base::InvalidArgumentException("Calltargets must be methods or actions.");
}
m_callTargets.push_back((FunctionIdentifier*)id);
}
}
m_freeVariables = symbTabRef;
}
ExpressionKind kind() const { return m_kind; };
Type* type() const { return m_type; };
std::int32_t line() const { return m_line; };
std::int32_t pos() const { return m_pos; };
SymbolTable* freeVariables() { return m_freeVariables; };
FunctionIdentifierList& callTargets() { return m_callTargets; };
void accept(IAstVisitor& visitor) override;
};
}