blob: e227fdab1a7c95aba6b595e6ed175fe8da2b2fab [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: 9 juil. 2014
*
* Contributors:
* Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
* - Initial API and implementation
******************************************************************************/
#ifndef PARSER_UTIL_H_
#define PARSER_UTIL_H_
#include <util/avm_string.h>
#include <common/BF.h>
#include <collection/BFContainer.h>
#include <collection/Typedef.h>
#include <fml/common/ModifierElement.h>
#include <fml/lib/IComPoint.h>
#include<stack>
namespace sep
{
class BFCode;
class ObjectElement;
class TraceableElement;
class InstanceOfMachine;
class Machine;
class Port;
class Routine;
class System;
class Transition;
class ParserUtil
{
public:
////////////////////////////////////////////////////////////////////////////
// Current Parse Context :
// System -> Machine -> Routine
struct AvmParseContext
{
System * system = NULL;
Machine * machine = NULL;
Machine * dynamic = NULL;
Routine * routine = NULL;
};
static AvmParseContext _CTX_;
static std::stack< AvmParseContext > _CTX_STACK_;
inline static void pushCTX(Machine * machine)
{
_CTX_.machine = machine;
_CTX_STACK_.push( _CTX_ );
}
inline static void pushDynamicCTX(Machine * dynamic)
{
_CTX_.dynamic = dynamic;
_CTX_STACK_.push( _CTX_ );
}
inline static void pushCTX(Routine * routine)
{
_CTX_.routine = routine;
_CTX_STACK_.push( _CTX_ );
}
inline static void popCTX(Machine * & machine, Routine * & routine)
{
if( not _CTX_STACK_.empty() )
{
_CTX_STACK_.pop();
if( not _CTX_STACK_.empty() )
{
_CTX_ = _CTX_STACK_.top();
machine = _CTX_.machine;
routine = _CTX_.routine;
}
}
}
////////////////////////////////////////////////////////////////////////////
// XLIA_SYNTAX_ERROR_COUNT
static avm_size_t XLIA_SYNTAX_ERROR_COUNT;
/**
* OutStream Manipulator
* SYNTAX_ERROR_EOL
*/
inline static void SYNTAX_ERROR_EOL(OutStream & os)
{
os << " !!!" << std::endl;
}
inline static WarnOutstreamT & avm_syntax_error(
const std::string & rule, avm_size_t line)
{
++XLIA_SYNTAX_ERROR_COUNT;
AVM_OS_WARN << "Error[line:" << line
<< "] in rule '" << rule << "' :> ";
return( AVM_OS_WARN );
}
inline static WarnOutstreamT & avm_syntax_error(const std::string & rule)
{
++XLIA_SYNTAX_ERROR_COUNT;
AVM_OS_WARN << "Error in rule '" << rule << "' :> ";
return( AVM_OS_WARN );
}
////////////////////////////////////////////////////////////////////////////
// SET LOCATION IN TRACEABLE FORM
static void setLocation(TraceableElement * aModelingElement,
avm_size_t bLine, avm_size_t eLine);
static void setLocation(TraceableElement & aModelingElement,
avm_size_t bLine, avm_size_t eLine);
////////////////////////////////////////////////////////////////////////////
// PROLOGUE OPTION
static void setPrologueOption(const std::string & id, BF value);
////////////////////////////////////////////////////////////////////////////
// GET OBJECT BY [Qualified] Name ID
static const BF & getObjectByNameID(const std::string & id);
static const BF & getObjectByQualifiedNameID(
const std::string & qnid, avm_size_t count);
////////////////////////////////////////////////////////////////////////////
// GET VARIABLE BY [ [ Fully ] Qualified ] Name ID
static const BF & getvar(const std::string & qnid, avm_size_t count);
static BF getVariable(const std::string & qnid, avm_size_t count);
static BF getDataType(const std::string & qnid, avm_size_t count);
static BF getDataTypeQueue(const std::string & qnid, avm_size_t count);
////////////////////////////////////////////////////////////////////////////
// GET CONSTANT BY [ [ Fully ] Qualified ] Name ID
static const BF & getConstant(
const std::string & qnid, avm_size_t count);
static avm_size_t getIntegerConstant(
const std::string & qnid, avm_size_t count);
static avm_float_t getFloatConstant(
const std::string & qnid, avm_size_t count);
////////////////////////////////////////////////////////////////////////////
// GET BUFFER BY [ [ Fully ] Qualified ] Name ID
static BF getBuffer(Machine * machine,
const std::string & qnid, avm_size_t count);
static BF getvarBuffer(const std::string & qnid, avm_size_t count);
////////////////////////////////////////////////////////////////////////////
// GET CHANNEL BY [ [ Fully ] Qualified ] Name ID
static BF getChannel(const std::string & qnid, avm_size_t count);
static BF getDataTypeChannel(
const std::string & qnid, avm_size_t count);
static void updateSignalRoutingChannel(Modifier::DIRECTION_KIND ioDirection,
const BFCode & ioCode, const std::string & qnid, avm_size_t count);
////////////////////////////////////////////////////////////////////////////
// GET PORT BY [ [ Fully ] Qualified ] Name ID
inline static const BF & getComPort(
const std::string & qnid, avm_size_t count)
{
return( getComPort(_CTX_.machine, qnid, count) );
}
static const BF & getComPort(Machine * machine,
const std::string & qnid, avm_size_t count);
static BF getvarPort(const std::string & qnid, avm_size_t count);
static void appendPortParameter(Port * port,
const std::string & label, BFVector & labelledParams,
BFList & positionalParams, const BF & param);
static void computePortParameter(
Port * port, const BFCode & ioStatement,
BFVector & labelledParams, BFList & positionalParams);
////////////////////////////////////////////////////////////////////////////
// GET SIGNAL BY [ [ Fully ] Qualified ] Name ID
inline static const BF & getComSignal(
const std::string & qnid, avm_size_t count)
{
return( getComSignal(_CTX_.machine, qnid, count) );
}
static const BF & getComSignal(Machine * machine,
const std::string & qnid, avm_size_t count);
static BF getvarSignal(const std::string & qnid, avm_size_t count);
////////////////////////////////////////////////////////////////////////////
// GET PORT / SIGNAL BY [ [ Fully ] Qualified ] Name ID
static const BF & getComPortSignal(
const std::string & qnid, avm_size_t count)
{
return( getComPortSignal(_CTX_.machine, qnid, count) );
}
static const BF & getComPortSignal(Machine * machine,
const std::string & qnid, avm_size_t count);
static BF getvarPortSignal(const std::string & qnid, avm_size_t count);
////////////////////////////////////////////////////////////////////////////
// GET ROUTINE BY [ [ Fully ] Qualified ] Name ID
static Routine * getRoutine(const std::string & id);
static BF getvarRoutine(const std::string & id);
////////////////////////////////////////////////////////////////////////////
// GET PROCEDURE BY [ [ Fully ] Qualified ] Name ID
static Machine * getProcedure(const std::string & id);
static BF getvarProcedure(const std::string & id);
////////////////////////////////////////////////////////////////////////////
// GET MACHINE BY [ [ Fully ] Qualified ] Name ID
static Machine * getMachine(Machine * machine,
const std::string & qnid, avm_size_t count);
static BF getvarMachine(const std::string & qnid, avm_size_t count);
static BF getExecutableMachine(const std::string & qnid, avm_size_t count);
static void appendInstanceMachineParameter(Machine * machine,
const std::string & label, BFVector & labelledParams,
BFList & positionalParams, const BF & param);
static void computeInstanceMachineParameter(Machine * machine,
BFVector & labelledParams, BFList & positionalParams);
static void appendInstanceMachineReturn(Machine * machine,
const std::string & label, BFVector & labelledReturns,
BFList & positionalReturns, const BF & param);
static void computeInstanceMachineReturn(Machine * machine,
BFVector & labelledReturns, BFList & positionalReturns);
static void appendInstanceDynamicPositionalParameter(
Machine * anInstance, const BF & rvParameter, avm_size_t position);
////////////////////////////////////////////////////////////////////////////
// ROUTINE Parameters / Returns arguments
static void appendRoutineParameters(Routine * routine,
const std::string & label, BFVector & labelledParams,
BFList & positionalParams, const BF & param);
static void appendRoutineReturns(Routine * routine,
const std::string & label, BFVector & labelledReturns,
BFList & positionalReturns, const BF & param);
static void computeRoutineParamReturn(const BF & ctxMachine,
Routine * routine, BFCode & activityStatement,
BFVector & labelledParams, BFList & positionalParams,
BFVector & labelledReturns, BFList & positionalReturns);
////////////////////////////////////////////////////////////////////////////
// ACTIVITY ROUTINE Parameters / Returns arguments
static void computeActivityRoutineParamReturn(const BF & ctxMachine,
Routine * routine, BFCode & activityStatement,
BFVector & labelledParams, BFList & positionalParams,
BFVector & labelledReturns, BFList & positionalReturns);
static void computeActivityRoutineInput(Machine * ctxMachine,
Routine * routine, BFCode & invokeSequende,
BFVector & labelledParams, BFList & positionalParams);
static void computeActivityRoutineDefaultOutput(Machine * ctxMachine,
Routine * routine, BFCode & invokeSequende,
BFVector & labelledReturns, BFList & positionalReturns);
static void computeActivityRoutineOutput(Machine * ctxMachine,
Routine * routine, BFCode & invokeSequende,
BFVector & labelledReturns, BFList & positionalReturns);
////////////////////////////////////////////////////////////////////////////
// GET INVOKABLE BY ID
static BF getInvokable(const BF & target, const std::string & id);
////////////////////////////////////////////////////////////////////////////
// DECLARE DEFAULT STATE #final, #terminal, #return if need
static void declareDefaultEndingStateIfNeed(
ListOfMachine & needDefaultStateFinal,
ListOfMachine & needDefaultStateTerminal,
ListOfMachine & needDefaultStateReturn);
////////////////////////////////////////////////////////////////////////////
// INLINE PROCEDURE CALL IN TRANSITION
static void checkProcedureCompositeMocKind(Machine * aProcedure);
static void inlineTransitionProcedureCall(
Transition * transition, const std::string & refId);
////////////////////////////////////////////////////////////////////////////
// ROUTINE INVOKATION
static BFCode invokeRoutine(Routine * aRoutineInstance);
static BFCode invokeRoutineStatement(Routine * aRoutineInstance);
static BF invokeRoutineExpression(Routine * aRoutineInstance);
};
} /* namespace sep */
#endif /* PARSER_UTIL_H_ */