blob: 15c3f21e1737f7c8fd1bb017d67279ebc7fe7b5a [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2016 CEA LIST.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Created on: 22 juin 2010
*
* Contributors:
* Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
* - Initial API and implementation
******************************************************************************/
#ifndef OPERATORLIB_H_
#define OPERATORLIB_H_
#include <util/avm_numeric.h>
#include <util/avm_string.h>
namespace sep
{
/**
* ENUMERATE DECLARATIONS
*/
enum ALGEBRA_QUALIFIER
{
ALGEBRA_STD,
ALGEBRA_ASSOC,
ALGEBRA_LEFT_ASSOC,
ALGEBRA_RIGHT_ASSOC,
ALGEBRA_COMM,
ALGEBRA_ASSOC_COMM
};
enum FIX_NOTATION
{
NOTATION_INFIX,
NOTATION_PREFIX,
NOTATION_SUFFIX,
NOTATION_FUNCTION,
NOTATION_STATEMENT
};
enum AVM_OPCODE
{
AVM_OPCODE_NULL,
/*
***************************************************************************
* AVM NOP STATEMENT
***************************************************************************
*/
AVM_OPCODE_NOP,
AVM_OPCODE_FAILED,
AVM_OPCODE_THROW,
/*
***************************************************************************
* AVM META STATEMENT
***************************************************************************
*/
AVM_OPCODE_INFORMAL,
AVM_OPCODE_TRACE,
AVM_OPCODE_DEBUG,
AVM_OPCODE_COMMENT,
AVM_OPCODE_QUOTE,
AVM_OPCODE_META_EVAL,
AVM_OPCODE_META_RUN,
/*
***************************************************************************
* AVM UFI STATEMENT
***************************************************************************
*/
AVM_OPCODE_UFI,
/*
***************************************************************************
* AVM FORM CONSTRUCTOR STATEMENT
***************************************************************************
*/
AVM_OPCODE_CTOR,
/*
***************************************************************************
* AVM FORM REGEX STATEMENT
***************************************************************************
*/
AVM_OPCODE_REGEX,
/*
***************************************************************************
* AVM MACHINE MANAGING
***************************************************************************
*/
AVM_OPCODE_CONTEXT_SWITCHER,
AVM_OPCODE_INIT,
AVM_OPCODE_FINAL,
AVM_OPCODE_DESTROY,
AVM_OPCODE_START,
AVM_OPCODE_RESTART,
AVM_OPCODE_STOP,
AVM_OPCODE_WAIT,
AVM_OPCODE_SUSPEND,
AVM_OPCODE_RESUME,
AVM_OPCODE_IENABLE_INVOKE,
AVM_OPCODE_ENABLE_INVOKE,
AVM_OPCODE_ENABLE_SET,
AVM_OPCODE_IDISABLE_INVOKE,
AVM_OPCODE_DISABLE_INVOKE,
AVM_OPCODE_DISABLE_SET,
AVM_OPCODE_DISABLE_CHILD,
AVM_OPCODE_DISABLE_SELF,
AVM_OPCODE_DISABLE_SELVES,
AVM_OPCODE_IABORT_INVOKE,
AVM_OPCODE_ABORT_INVOKE,
AVM_OPCODE_ABORT_SET,
AVM_OPCODE_ABORT_CHILD,
AVM_OPCODE_ABORT_SELF,
AVM_OPCODE_ABORT_SELVES,
AVM_OPCODE_HISTORY_CLEAR,
AVM_OPCODE_DEEP_HISTORY_INVOKE,
AVM_OPCODE_SHALLOW_HISTORY_INVOKE,
AVM_OPCODE_IRUN,
AVM_OPCODE_RUN,
AVM_OPCODE_RTC,
AVM_OPCODE_SCHEDULE_INVOKE,
AVM_OPCODE_SCHEDULE_GET,
AVM_OPCODE_SCHEDULE_IN,
AVM_OPCODE_SCHEDULE_SET,
AVM_OPCODE_DEFER_INVOKE,
AVM_OPCODE_DEFER_GET,
AVM_OPCODE_DEFER_SET,
AVM_OPCODE_GOTO,
AVM_OPCODE_FORK,
AVM_OPCODE_JOIN,
AVM_OPCODE_INPUT_ENABLED,
AVM_OPCODE_RDV,
AVM_OPCODE_SYNCHRONIZE,
AVM_OPCODE_INVOKE_NEW,
AVM_OPCODE_INVOKE_ROUTINE,
AVM_OPCODE_INVOKE_TRANSITION,
AVM_OPCODE_INVOKE_METHOD,
AVM_OPCODE_INVOKE_PROGRAM,
AVM_OPCODE_INVOKE_FUNCTION,
AVM_OPCODE_INVOKE_LAMBDA_APPLY,
AVM_OPCODE_INVOKE_LAMBDA_LET,
/*
***************************************************************************
* AVM MACHINE STATUS
***************************************************************************
*/
AVM_OPCODE_STATUS_WAS,
AVM_OPCODE_STATUS_IS,
AVM_OPCODE_STATUS_BEING,
AVM_OPCODE_STATUS_WILL,
AVM_OPCODE_CHANGED,
AVM_OPCODE_CHANGED_TO,
/*
***************************************************************************
* AVM PROGRAM SCHEDULING
***************************************************************************
*/
AVM_OPCODE_ASYNCHRONOUS,
AVM_OPCODE_STRONG_SYNCHRONOUS,
AVM_OPCODE_WEAK_SYNCHRONOUS,
AVM_OPCODE_INTERLEAVING,
AVM_OPCODE_PARTIAL_ORDER_REDUCTION,
AVM_OPCODE_PARALLEL,
// Optimized version of concurrency for RDV synchronization
AVM_OPCODE_RDV_ASYNCHRONOUS,
AVM_OPCODE_RDV_STRONG_SYNCHRONOUS,
AVM_OPCODE_RDV_WEAK_SYNCHRONOUS,
AVM_OPCODE_RDV_INTERLEAVING,
AVM_OPCODE_RDV_PARTIAL_ORDER_REDUCTION,
AVM_OPCODE_RDV_PARALLEL,
AVM_OPCODE_EXCLUSIVE,
AVM_OPCODE_NONDETERMINISM,
AVM_OPCODE_PRIOR_GT,
AVM_OPCODE_PRIOR_LT,
AVM_OPCODE_SCHEDULE_AND_THEN,
AVM_OPCODE_SCHEDULE_OR_ELSE,
AVM_OPCODE_ATOMIC_SEQUENCE,
AVM_OPCODE_SEQUENCE,
AVM_OPCODE_SEQUENCE_SIDE,
AVM_OPCODE_SEQUENCE_WEAK,
AVM_OPCODE_PRODUCT,
/*
***************************************************************************
* AVM BUFFER MANAGING
***************************************************************************
*/
AVM_OPCODE_UPDATE_BUFFER,
/*
***************************************************************************
* LAMBDA STATEMENT
***************************************************************************
*/
AVM_OPCODE_APPLY,
AVM_OPCODE_LAMBDA,
/*
***************************************************************************
* FUNCTIONB STATEMENT
***************************************************************************
*/
AVM_OPCODE_FUN,
/*
***************************************************************************
* LET STATEMENT
***************************************************************************
*/
AVM_OPCODE_LET,
/*
***************************************************************************
* LOOKUP STATEMENT
***************************************************************************
*/
AVM_OPCODE_LOOKUP_INT_EXT,
AVM_OPCODE_LOOKUP_INT,
AVM_OPCODE_LOOKUP_NEAREST,
AVM_OPCODE_LOOKUP_BELOW,
AVM_OPCODE_LOOKUP_ABOVE,
AVM_OPCODE_LOOKUP2D_INT_EXT,
/*
***************************************************************************
* AVM PRIMITIVE STATEMENT
***************************************************************************
*/
AVM_OPCODE_ASSIGN,
AVM_OPCODE_ASSIGN_AFTER,
AVM_OPCODE_ASSIGN_OP,
AVM_OPCODE_ASSIGN_OP_AFTER,
AVM_OPCODE_ASSIGN_REF,
AVM_OPCODE_ASSIGN_MACRO,
AVM_OPCODE_ASSIGN_NEWFRESH,
AVM_OPCODE_ASSIGN_RESET,
AVM_OPCODE_GUARD,
AVM_OPCODE_TIMED_GUARD,
AVM_OPCODE_EVENT,
AVM_OPCODE_CHECK_SAT,
AVM_OPCODE_INPUT,
AVM_OPCODE_INPUT_FROM,
AVM_OPCODE_INPUT_SAVE,
// Optimized version of INPUT
AVM_OPCODE_INPUT_ENV,
AVM_OPCODE_INPUT_VAR,
AVM_OPCODE_INPUT_FLOW,
AVM_OPCODE_INPUT_BUFFER,
AVM_OPCODE_INPUT_RDV,
AVM_OPCODE_INPUT_MULTI_RDV,
AVM_OPCODE_INPUT_BROADCAST,
AVM_OPCODE_INPUT_DELEGATE,
AVM_OPCODE_OUTPUT,
AVM_OPCODE_OUTPUT_TO,
// Optimized version of OUTPUT
AVM_OPCODE_OUTPUT_ENV,
AVM_OPCODE_OUTPUT_VAR,
AVM_OPCODE_OUTPUT_FLOW,
AVM_OPCODE_OUTPUT_BUFFER,
AVM_OPCODE_OUTPUT_RDV,
AVM_OPCODE_OUTPUT_MULTI_RDV,
AVM_OPCODE_OUTPUT_BROADCAST,
AVM_OPCODE_OUTPUT_DELEGATE,
AVM_OPCODE_PRESENT,
AVM_OPCODE_ABSENT,
AVM_OPCODE_IF,
AVM_OPCODE_IFE,
AVM_OPCODE_WHERE,
AVM_OPCODE_WHERE_ELSE,
AVM_OPCODE_FOR,
AVM_OPCODE_FOREACH,
AVM_OPCODE_WHILE_DO,
AVM_OPCODE_DO_WHILE,
AVM_OPCODE_BREAK,
AVM_OPCODE_CONTINUE,
AVM_OPCODE_RETURN,
AVM_OPCODE_EXIT,
AVM_OPCODE_STEP_MARK,
/*
***************************************************************************
* AVM QUANTIFIER EXPRESSION
***************************************************************************
*/
AVM_OPCODE_EXIST,
AVM_OPCODE_FORALL,
/*
***************************************************************************
* AVM PREDICAT EXPRESSION
***************************************************************************
*/
AVM_OPCODE_NOT,
AVM_OPCODE_AND,
AVM_OPCODE_AND_THEN,
AVM_OPCODE_NAND,
AVM_OPCODE_XAND,
AVM_OPCODE_OR,
AVM_OPCODE_OR_ELSE,
AVM_OPCODE_NOR,
AVM_OPCODE_XOR,
AVM_OPCODE_XNOR,
/*
***************************************************************************
* AVM INTEGER BIT A BIT OPERATOR
***************************************************************************
*/
AVM_OPCODE_BNOT,
AVM_OPCODE_BAND,
AVM_OPCODE_BOR,
AVM_OPCODE_BXOR,
AVM_OPCODE_LSHIFT,
AVM_OPCODE_RSHIFT,
/*
***************************************************************************
* AVM COMPARISON EXPRESSION
***************************************************************************
*/
AVM_OPCODE_EQ,
AVM_OPCODE_NEQ,
AVM_OPCODE_SEQ,
AVM_OPCODE_NSEQ,
AVM_OPCODE_LT,
AVM_OPCODE_LTE,
AVM_OPCODE_GT,
AVM_OPCODE_GTE,
/*
***************************************************************************
* AVM ARITHMETIC EXPRESSION
***************************************************************************
*/
AVM_OPCODE_PLUS,
AVM_OPCODE_MINUS,
AVM_OPCODE_UMINUS,
AVM_OPCODE_MULT,
AVM_OPCODE_POW,
AVM_OPCODE_DIV,
AVM_OPCODE_MOD,
AVM_OPCODE_MIN,
AVM_OPCODE_MAX,
/*
***************************************************************************
* AVM MATHEMATICAL FUNCTION
***************************************************************************
*/
// RANDOM
AVM_OPCODE_RANDOM,
// ROUNDING
AVM_OPCODE_ABS,
AVM_OPCODE_CEIL,
AVM_OPCODE_FLOOR,
AVM_OPCODE_ROUND,
AVM_OPCODE_TRUNCATE,
// EXP - LOG
AVM_OPCODE_SQRT,
AVM_OPCODE_EXP,
AVM_OPCODE_LN,
AVM_OPCODE_LOG,
// TRIGONOMETRIC
AVM_OPCODE_SIN,
AVM_OPCODE_COS,
AVM_OPCODE_TAN,
AVM_OPCODE_SINH,
AVM_OPCODE_COSH,
AVM_OPCODE_TANH,
AVM_OPCODE_ASIN,
AVM_OPCODE_ACOS,
AVM_OPCODE_ATAN,
AVM_OPCODE_ATAN2,
AVM_OPCODE_ASINH,
AVM_OPCODE_ACOSH,
AVM_OPCODE_ATANH,
/*
***************************************************************************
* AVM STRING / CONTAINER OPERATOR
***************************************************************************
*/
AVM_OPCODE_CONTAINS,
AVM_OPCODE_IN,
AVM_OPCODE_NOTIN,
AVM_OPCODE_SUBSET,
AVM_OPCODE_SUBSETEQ,
AVM_OPCODE_INTERSECT,
AVM_OPCODE_STARTS_WITH,
AVM_OPCODE_ENDS_WITH,
AVM_OPCODE_CONCAT,
AVM_OPCODE_APPEND,
AVM_OPCODE_REMOVE,
AVM_OPCODE_CLEAR,
AVM_OPCODE_RESIZE,
AVM_OPCODE_SELECT,
AVM_OPCODE_PUSH,
AVM_OPCODE_ASSIGN_TOP,
AVM_OPCODE_TOP,
AVM_OPCODE_POP,
AVM_OPCODE_POP_FROM,
AVM_OPCODE_EMPTY,
AVM_OPCODE_NONEMPTY,
AVM_OPCODE_SINGLETON,
AVM_OPCODE_POPULATED,
AVM_OPCODE_FULL,
AVM_OPCODE_SIZE,
/*
***************************************************************************
* CTL* , IOLTL STATEMENT
***************************************************************************
*/
AVM_OPCODE_NECESSARILY, // A :> in All path
AVM_OPCODE_POSSIBLY, // E :> the Exist a path
AVM_OPCODE_GLOBALLY, // G , \square , [] :> always in the future
AVM_OPCODE_EVENTUALLY, // F , \diamond ' <> :> (or Finally) some time in the Future
AVM_OPCODE_NEXT, // X , \circle , o :> neXtime
AVM_OPCODE_UNTIL, // U :> (p U q ) <=> p holds Until q holds (and ! p)
AVM_OPCODE_UNLESS, // W :> (p W q ) <=> Weak Until (or waiting for)
// <=> (G p) or (p U q)
// as long as q is false, p must be true
AVM_OPCODE_RELEASES, // R :> (p R q ) <=> q holds Until p holds (with q)
// <=> not ((not p) U (not q))
AVM_OPCODE_AND_T,
AVM_OPCODE_OR_T,
AVM_OPCODE_NOT_T,
AVM_OPCODE_IMP_T,
AVM_OPCODE_OBS,
};
enum ENUM_PRINT_OPERATOR_FORMAT
{
PRINT_OPERATOR_UNDEFINED_FORMAT,
PRINT_OPERATOR_NAME_FORMAT,
PRINT_OPERATOR_SYMBOL_FORMAT,
PRINT_OPERATOR_MIXFIX_FORMAT,
PRINT_OPERATOR_CAS_QEPCAD_FORMAT
};
class OperatorLib
{
public:
/**
* TEST
*/
static bool isPropositional(AVM_OPCODE opcode);
static std::string to_string(FIX_NOTATION fix);
static FIX_NOTATION to_fix(const std::string & op,
FIX_NOTATION defaultFix = NOTATION_INFIX);
static std::string to_string(AVM_OPCODE opcode,
ENUM_PRINT_OPERATOR_FORMAT printFormat =
PRINT_OPERATOR_SYMBOL_FORMAT);
static AVM_OPCODE toOpcode(const std::string & op,
AVM_OPCODE defaultOpcode = AVM_OPCODE_NULL);
};
////////////////////////////////////////////////////////////////////////////////
// OperatorFamily
////////////////////////////////////////////////////////////////////////////////
class AvmCode;
class IStatementFamily
{
public:
typedef avm_uint32_t avm_opcode_family;
enum
{
AVM_STATEMENT_UNDEFINED_FAMILY = 0x00000,
AVM_STATEMENT_BASIC_FAMILY = 0x00001,
AVM_STATEMENT_GUARD_FAMILY = 0x00002,
AVM_STATEMENT_INPUT_FAMILY = 0x00010,
AVM_STATEMENT_INPUT_ENV_FAMILY = 0x00020,
AVM_STATEMENT_INPUT_SYNC_FAMILY = 0x00040,
AVM_STATEMENT_INPUT_ASYNC_FAMILY = 0x00080,
AVM_STATEMENT_INPUT_ANY_FAMILY = AVM_STATEMENT_INPUT_FAMILY
| AVM_STATEMENT_INPUT_ENV_FAMILY
| AVM_STATEMENT_INPUT_SYNC_FAMILY
| AVM_STATEMENT_INPUT_ASYNC_FAMILY,
AVM_STATEMENT_OUTPUT_FAMILY = 0x00100,
AVM_STATEMENT_OUTPUT_ENV_FAMILY = 0x00200,
AVM_STATEMENT_OUTPUT_SYNC_FAMILY = 0x00400,
AVM_STATEMENT_OUTPUT_ASYNC_FAMILY = 0x00800,
AVM_STATEMENT_OUTPUT_ANY_FAMILY = AVM_STATEMENT_OUTPUT_FAMILY
| AVM_STATEMENT_OUTPUT_ENV_FAMILY
| AVM_STATEMENT_OUTPUT_SYNC_FAMILY
| AVM_STATEMENT_OUTPUT_ASYNC_FAMILY,
AVM_STATEMENT_COM_FAMILY = AVM_STATEMENT_INPUT_FAMILY
| AVM_STATEMENT_OUTPUT_FAMILY,
AVM_STATEMENT_COM_ENV_FAMILY = AVM_STATEMENT_INPUT_ENV_FAMILY
| AVM_STATEMENT_OUTPUT_ENV_FAMILY,
AVM_STATEMENT_COM_ASYNC_FAMILY = AVM_STATEMENT_INPUT_ASYNC_FAMILY
| AVM_STATEMENT_OUTPUT_ASYNC_FAMILY,
AVM_STATEMENT_COM_SYNC_FAMILY = AVM_STATEMENT_INPUT_SYNC_FAMILY
| AVM_STATEMENT_OUTPUT_SYNC_FAMILY,
AVM_STATEMENT_COM_ANY_FAMILY = AVM_STATEMENT_INPUT_ANY_FAMILY
| AVM_STATEMENT_OUTPUT_ANY_FAMILY,
AVM_STATEMENT_UNCONDIONAL_CLASS = AVM_STATEMENT_BASIC_FAMILY
| AVM_STATEMENT_COM_ENV_FAMILY,
AVM_STATEMENT_COM_CONDITIONAL_CLASS = AVM_STATEMENT_COM_FAMILY
| AVM_STATEMENT_COM_ASYNC_FAMILY
| AVM_STATEMENT_COM_SYNC_FAMILY,
AVM_STATEMENT_CONDIONAL_CLASS = AVM_STATEMENT_GUARD_FAMILY
| AVM_STATEMENT_COM_CONDITIONAL_CLASS,
AVM_STATEMENT_MASK_ALL_FAMILY = 0xFFFFF,
};
protected:
/*
* ATTRIBUTES
*/
avm_opcode_family theStatementFamily;
public:
/**
* CONSTRUCTOR
* Default
*/
IStatementFamily(avm_opcode_family
aCodeFamily = AVM_STATEMENT_UNDEFINED_FAMILY)
: theStatementFamily( aCodeFamily )
{
//!! NOTHING
}
/**
* DESTRUCTOR
*/
virtual ~IStatementFamily()
{
//!! NOTHING
}
/**
* GETTER - SETTER
* theCodeFamily
*/
inline avm_opcode_family getStatementFamily() const
{
return( theStatementFamily );
}
inline bool hasStatementFamily() const
{
return( theStatementFamily != AVM_STATEMENT_UNDEFINED_FAMILY );
}
inline void setStatementFamily(avm_opcode_family aCodeFamily)
{
theStatementFamily = aCodeFamily;
}
inline void updateStatementFamily(AvmCode * aCode)
{
theStatementFamily = computeStatementFamily( aCode );
}
static avm_opcode_family computeStatementFamily(AVM_OPCODE opcode);
static avm_opcode_family computeStatementFamily(AvmCode * aCode);
/**
* TEST
* theCodeFamily
*/
inline bool hasStatementBasicFamily() const
{
return( (theStatementFamily & AVM_STATEMENT_BASIC_FAMILY) != 0 );
}
inline bool isStatementBasicFamily() const
{
return( theStatementFamily == AVM_STATEMENT_BASIC_FAMILY );
}
inline bool hasStatementGuardFamily() const
{
return( (theStatementFamily & AVM_STATEMENT_GUARD_FAMILY) != 0 );
}
inline bool hasStatementInputFamily() const
{
return( (theStatementFamily & AVM_STATEMENT_INPUT_ANY_FAMILY) != 0 );
}
inline bool hasStatementOutputFamily() const
{
return( (theStatementFamily & AVM_STATEMENT_OUTPUT_ANY_FAMILY) != 0 );
}
inline bool hasStatementComFamily() const
{
return( (theStatementFamily & AVM_STATEMENT_COM_ANY_FAMILY) != 0 );
}
inline bool hasConditionalStatementFamily() const
{
return( (theStatementFamily & AVM_STATEMENT_CONDIONAL_CLASS) != 0 );
}
inline bool hasConditionalComStatementFamily() const
{
return( (theStatementFamily & AVM_STATEMENT_COM_CONDITIONAL_CLASS) != 0 );
}
inline bool isGuardConditionalStatementFamily() const
{
return( (theStatementFamily & (~ (AVM_STATEMENT_UNCONDIONAL_CLASS |
AVM_STATEMENT_GUARD_FAMILY)) ) == 0 );
}
inline bool hasUnconditionalStatementFamily() const
{
return( (theStatementFamily & AVM_STATEMENT_UNCONDIONAL_CLASS) != 0 );
}
inline bool isUnconditionalStatementFamily() const
{
return( (theStatementFamily & (~ AVM_STATEMENT_UNCONDIONAL_CLASS)) == 0 );
}
inline bool hasUnconditionalComStatementFamily() const
{
return( (theStatementFamily & AVM_STATEMENT_COM_ENV_FAMILY) != 0 );
}
inline bool isUnconditionalComStatementFamily() const
{
return( (theStatementFamily & (~ (AVM_STATEMENT_COM_ENV_FAMILY |
AVM_STATEMENT_BASIC_FAMILY))) == 0 );
}
/**
* Serialization
*/
std::string strStatementFamily(
avm_opcode_family mask = AVM_STATEMENT_MASK_ALL_FAMILY) const;
};
}
#endif /* OPERATORLIB_H_ */