blob: fb409d44ca1755b06610c8af23fa1636e39d064c [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
*
* Contributors:
* Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
* - Initial API and implementation
******************************************************************************/
#ifndef BUILDER_COMPILER_SYMBOLTABLE_H_
#define BUILDER_COMPILER_SYMBOLTABLE_H_
#include <builder/compiler/SymbolPredicate.h>
#include <collection/Typedef.h>
#include <collection/BFContainer.h>
#include <fml/executable/ExecutableQuery.h>
#include <fml/executable/InstanceOfData.h>
#include <fml/executable/InstanceOfMachine.h>
#include <fml/symbol/Symbol.h>
#include <fml/type/BaseTypeSpecifier.h>
namespace sep
{
class COMPILE_CONTEXT;
class Configuration;
class ExecutableForm;
class ExecutableSystem;
class InstanceOfBuffer;
class InstanceOfPort;
class ObjectElement;
class Machine;
class Port;
class TypeSpecifier;
class UniFormIdentifier;
class SymbolTable
{
protected:
/**
* ATTRIBUTE
*/
Configuration & mConfiguration;
ListOfSymbol mListOfInstanceStatic;
ListOfSymbol mListOfPortInstance;
ListOfSymbol mListOfBufferInstance;
ListOfSymbol mListOfConnectorInstance;
ListOfSymbol mListOfDataInstance;
BFList mListOfMachineExecutable;
BFList mListOfAvmTransition;
BFList mListOfAvmProgram;
ExecutableQuery XQuery;
avm_size_t mErrorCount;
avm_size_t mWarningCount;
StringOutStream ERROR_OS;
StringOutStream WARNING_OS;
public:
/**
* CONSTRUCTOR
* Default
*/
SymbolTable(Configuration & aConfiguration)
: mConfiguration( aConfiguration ),
XQuery( mConfiguration ),
mErrorCount( 0 ),
mWarningCount(0),
ERROR_OS(),
WARNING_OS()
{
//!! NOTHING
}
/**
* CONSTRUCTOR
* Copy
*/
SymbolTable(const SymbolTable & aSymbolTable)
: mConfiguration( aSymbolTable.mConfiguration ),
XQuery( mConfiguration ),
mErrorCount( aSymbolTable.mErrorCount ),
mWarningCount(aSymbolTable.mWarningCount ),
ERROR_OS(),
WARNING_OS()
{
//!! NOTHING
}
/**
* DESTRUCTOR
*/
virtual ~SymbolTable()
{
//!! NOTHING
}
/*
* SETTER
* mExecutableSystem
*/
inline void setSymbolTable(SymbolTable & aSymbolTable)
{
mListOfInstanceStatic.append( aSymbolTable.mListOfInstanceStatic );
mListOfPortInstance.append( aSymbolTable.mListOfPortInstance );
mListOfBufferInstance.append( aSymbolTable.mListOfBufferInstance );
mListOfConnectorInstance.append( aSymbolTable.mListOfConnectorInstance );
mListOfDataInstance.append( aSymbolTable.mListOfDataInstance );
mListOfAvmTransition.append( aSymbolTable.mListOfAvmTransition );
mListOfAvmProgram.append( aSymbolTable.mListOfAvmProgram );
}
/**
* SEARCH
* for Port
*/
InstanceOfPort * searchPortConnectorInstance(
ExecutableForm * anExecutable, const ObjectElement * aPort) const;
InstanceOfPort * searchPortConnectorInstance(
ExecutableForm * anExecutable,
const std::string & aFullyQualifiedNameID) const;
const Symbol & searchPortSymbolInstance(
ExecutableForm * anExecutable, Port * aPort) const;
/**
* SEARCH
* for Type
*/
static const TypeSpecifier & searchTypeSpecifier(
ExecutableSystem & anExecutableSystem,
COMPILE_CONTEXT * aCTX, const ObjectElement * objElement);
static const TypeSpecifier & searchTypeSpecifier(
ExecutableSystem & anExecutableSystem, COMPILE_CONTEXT * aCTX,
const std::string & aFullyQualifiedNameID);
/**
* SEARCH
* for Data
*/
const BF & searchDataInstance(BaseAvmProgram * tmpProgram,
const ObjectElement * objElement) const;
const BF & searchDataInstance(
COMPILE_CONTEXT * aCTX, const ObjectElement * objElement);
const BF & searchDataInstance(BaseAvmProgram * tmpProgram,
const std::string & aFullyQualifiedNameID) const;
const BF & searchDataInstance(COMPILE_CONTEXT * aCTX,
const std::string & aFullyQualifiedNameID);
const BF & searchDataInstanceByQualifiedNameID(BaseAvmProgram * tmpProgram,
const std::string & aQualifiedNameID) const;
const BF & searchDataInstanceByQualifiedNameID(
COMPILE_CONTEXT * aCTX, const std::string & aQualifiedNameID);
const BF & searchDataInstanceByNameID(
BaseAvmProgram * tmpProgram, const std::string & aNameID) const;
//$DELETE
// const BF & searchDataInstanceByNameID(
// COMPILE_CONTEXT * aCTX, const std::string & aNameID);
const BF & searchDataInstanceAlias(
COMPILE_CONTEXT * aCTX, const ObjectElement * objElement);
const BF & searchDataInstanceAlias(COMPILE_CONTEXT * aCTX,
const std::string & aFullyQualifiedNameID);
const BF & createDataInstanceAlias(ExecutableForm * anExecutable,
const std::string & aFullyQualifiedNameID,
InstanceOfData * anInstance, ExecutableForm * instContainer);
const BF & createDataInstanceAlias(ExecutableForm * anExecutable,
const std::string & aFullyQualifiedNameID,
InstanceOfData * anInstance,
VectorOfInstanceOfMachine & theInstanceOfMachinePath);
/**
* SEARCH
* for Machine Instance
*/
const Symbol & searchInstanceModel(
COMPILE_CONTEXT * aCTX, const ObjectElement * astElement) const;
const Symbol & searchInstanceStatic(
COMPILE_CONTEXT * aCTX, const ObjectElement * astElement) const;
const Symbol & searchInstanceDynamic(
COMPILE_CONTEXT * aCTX, const ObjectElement * astElement) const;
const Symbol & searchInstanceModelByNameID(
ExecutableForm * anExecutable, const std::string & aNameID) const;
const Symbol & searchInstanceModelByNameID(
COMPILE_CONTEXT * aCTX, const std::string & aNameID) const;
const Symbol & searchMachineInstanceByNameID(
ExecutableForm * anExecutable, const std::string & aNameID) const;
const Symbol & searchMachineInstanceByNameID(
COMPILE_CONTEXT * aCTX, const std::string & aNameID) const;
InstanceOfMachine * searchInstanceStatic(
const ObjectElement * fromMachine, const UniFormIdentifier & anUFI);
void searchInstanceStatic(const ObjectElement * refMachine,
const UniFormIdentifier & anUFI, BFList & foundList) const;
void searchInstanceByNameID(COMPILE_CONTEXT * aCTX,
const std::string & aQualifiedNameID, BFList & foundList) const;
void searchInstanceByQualifiedNameID(COMPILE_CONTEXT * aCTX,
const std::string & aQualifiedNameID, BFList & foundList) const;
/**
* SEARCH
* for Data, Port or Machine
*/
const BF & searchInstance(
COMPILE_CONTEXT * aCTX, const ObjectElement * objElement);
const BF & searchInstance(COMPILE_CONTEXT * aCTX,
const std::string & aFullyQualifiedNameID);
/**
* SEARCH SYMBOL
* for Data, Port or Machine
*/
const BF & searchSymbol(
COMPILE_CONTEXT * aCTX, const ObjectElement * objElement);
const BF & searchSymbol(COMPILE_CONTEXT * aCTX,
const std::string & aFullyQualifiedNameID);
BF searchSymbolByUFI(COMPILE_CONTEXT * aCTX, const UniFormIdentifier & anUFI);
const BF & searchSemSymbol(COMPILE_CONTEXT * aCTX,
const ObjectElement * objElement) const;
const BF & searchSemSymbolByQualifiedNameID(COMPILE_CONTEXT * aCTX,
const std::string & aQualifiedNameID) const;
const BF & searchSemSymbolByNameID(COMPILE_CONTEXT * aCTX,
const std::string & aNameID) const;
BF searchSymbolByQualifiedNameID(COMPILE_CONTEXT * aCTX,
const std::string & aQualifiedNameID);
BF searchSymbolByNameID(
COMPILE_CONTEXT * aCTX, const std::string & aNameID);
BF createAliasIfNotAccessible(COMPILE_CONTEXT * aCTX,
InstanceOfMachine * aContainerInstance, const BF & bfInstance);
BF createAliasIfNotAccessible(COMPILE_CONTEXT * aCTX, const BF & bfInstance);
/**
* SEARCH
* Executable for a given FORM
*/
const BF & searchTransition(
COMPILE_CONTEXT * aCTX, const ObjectElement * objElement) const;
const BF & searchTransition(COMPILE_CONTEXT * aCTX,
const std::string & aFullyQualifiedNameID) const;
const BF & searchTransitionByNameID(
COMPILE_CONTEXT * aCTX, const std::string & aNameID) const;
const BF & searchProgram(COMPILE_CONTEXT * aCTX,
const ObjectElement * objElement) const;
const BF & searchProgram(COMPILE_CONTEXT * aCTX,
const std::string & aFullyQualifiedNameID) const;
const BF & searchProgramByNameID(
COMPILE_CONTEXT * aCTX, const std::string & aNameID) const;
/**
* SEARCH
* Executable of the MODEL for a given FORM
*/
ExecutableForm * searchExecutableModel(const Machine * aMachine);
/**
* SEARCH
* Instance for a given FORM
*/
inline const BF & searchCompiledElement(
const BFList & listOfInstance, const SymbolPredicate & pred) const
{
BFList::const_iterator it = listOfInstance.begin();
for( ; it != listOfInstance.end() ; ++it )
{
if( pred( (*it).to_ptr< BaseCompiledForm >() ) )
{
return( *it );
}
}
return( BF::REF_NULL );
}
inline const Symbol & searchCompiledElement(
const ListOfSymbol & listOfInstance,
const SymbolPredicate & pred) const
{
ListOfSymbol::const_iterator it = listOfInstance.begin();
ListOfSymbol::const_iterator endIt = listOfInstance.end();
for( ; it != endIt ; ++it )
{
if( pred( (*it) ) )
{
return( *it );
}
}
return( Symbol::REF_NULL );
}
template< typename T >
inline T * searchCompiledElement(BFVector & tableOfInstance,
const SymbolPredicate & pred) const
{
BFVector::const_iterator it = tableOfInstance.begin();
for( ; it != tableOfInstance.end() ; ++it )
{
if( pred( (*it).as_ptr< T >() ) )
{
return( (*it).to_ptr< T >() );
}
}
return( NULL );
}
inline const Symbol & searchCompiledElement(
VectorOfSymbol & tableOfInstance,
const SymbolPredicate & pred) const
{
VectorOfSymbol::const_iterator it = tableOfInstance.begin();
VectorOfSymbol::const_iterator endIt = tableOfInstance.end();
for( ; it != endIt ; ++it )
{
if( pred( (*it) ) )
{
return( (*it) );
}
}
return( Symbol::REF_NULL );
}
inline void searchCompiledElement(const ListOfSymbol & listOfInstance,
const SymbolPredicate & pred, BFList & foundList) const
{
ListOfSymbol::const_iterator it = listOfInstance.begin();
ListOfSymbol::const_iterator endIt = listOfInstance.end();
for( ; it != endIt ; ++it )
{
if( pred( (*it) ) )
{
foundList.append( *it );
}
}
}
/**
***************************************************************************
* GETTER / SETTER
* mListOfMachineExecutable
***************************************************************************
*/
inline const BF & searchExecutable(const ObjectElement * anElement) const
{
SymbolPredicateByCompiledElement pred( anElement );
return( searchCompiledElement(mListOfMachineExecutable, pred) );
}
inline const BF & searchExecutable(
const std::string & aFullyQualifiedNameID) const
{
SymbolPredicateByCompiledFQNameID pred(aFullyQualifiedNameID);
return( searchCompiledElement(mListOfMachineExecutable, pred) );
}
inline const BF & searchExecutableByQualifiedNameID(
const std::string & aQualifiedNameID) const
{
SymbolPredicateByQualifiedNameID pred(aQualifiedNameID);
return( searchCompiledElement(mListOfMachineExecutable, pred) );
}
inline const BF & searchExecutableByNameID(
const std::string & aQualifiedNameID) const
{
SymbolPredicateByNameID pred(aQualifiedNameID);
return( searchCompiledElement(mListOfMachineExecutable, pred) );
}
/**
***************************************************************************
* GETTER / SETTER
* mListOfInstanceStatic
* "SYMBOL TABLE : MACHINE"
***************************************************************************
*/
inline void addInstanceStatic(const Symbol & anInstance)
{
mListOfInstanceStatic.append(anInstance);
}
inline const Symbol & searchInstanceStatic(
const ObjectElement * anElement) const
{
SymbolPredicateByCompiledElement pred( anElement );
return( searchCompiledElement(mListOfInstanceStatic, pred) );
}
inline const Symbol & searchInstanceStatic(
const std::string & aFullyQualifiedNameID) const
{
SymbolPredicateByCompiledFQNameID pred(aFullyQualifiedNameID);
return( searchCompiledElement(mListOfInstanceStatic, pred) );
}
inline void searchMachineInstanceByNameID(
const std::string & aNameID, BFList & foundList) const
{
SymbolPredicateByNameID pred(aNameID);
searchCompiledElement(mListOfInstanceStatic, pred, foundList);
}
inline void searchMachineInstanceByQualifiedNameID(
const std::string & aQualifiedNameID, BFList & foundList) const
{
SymbolPredicateByQualifiedNameID pred(aQualifiedNameID);
searchCompiledElement(mListOfInstanceStatic, pred, foundList);
}
/**
***************************************************************************
* GETTER / SETTER
* mListOfPortInstance
* "SYMBOL TABLE : PORT"
***************************************************************************
*/
inline void addPortInstance(const Symbol & anInstance)
{
mListOfPortInstance.append(anInstance);
}
inline const Symbol & searchPortInstance(
const ObjectElement * anElement) const
{
SymbolPredicateByCompiledElement pred( anElement );
return( searchCompiledElement(mListOfPortInstance, pred) );
}
inline void searchPortInstanceByNameID(
const std::string & aNameID, BFList & foundList) const
{
SymbolPredicateByNameID pred(aNameID);
searchCompiledElement(mListOfPortInstance, pred, foundList);
}
inline void searchPortInstanceByQualifiedNameID(
const std::string & aQualifiedNameID, BFList & foundList) const
{
SymbolPredicateByQualifiedNameID pred(aQualifiedNameID);
searchCompiledElement(mListOfPortInstance, pred, foundList);
}
const Symbol & searchPortInstance(
COMPILE_CONTEXT * aCTX, InstanceOfData * aData) const;
/**
***************************************************************************
* GETTER / SETTER
* mListOfBufferInstance
* "SYMBOL TABLE : BUFFER"
***************************************************************************
*/
inline void addBufferInstance(const Symbol & anInstance)
{
mListOfBufferInstance.append(anInstance);
}
inline const Symbol & searchBufferInstance(
const ObjectElement * anElement) const
{
SymbolPredicateByCompiledElement pred( anElement );
return( searchCompiledElement(mListOfBufferInstance, pred) );
}
inline void searchBufferInstanceByNameID(
const std::string & aNameID, BFList & foundList) const
{
SymbolPredicateByNameID pred(aNameID);
searchCompiledElement(mListOfBufferInstance, pred, foundList);
}
inline void searchBufferInstanceByQualifiedNameID(
const std::string & aQualifiedNameID, BFList & foundList) const
{
SymbolPredicateByQualifiedNameID pred(aQualifiedNameID);
searchCompiledElement(mListOfBufferInstance, pred, foundList);
}
const Symbol & searchBufferInstance(ExecutableForm * anExecutable,
const ObjectElement * objElement) const;
const Symbol & searchBufferInstance(ExecutableForm * anExecutable,
const std::string & aFullyQualifiedNameID);
const Symbol & searchBufferInstanceByQualifiedNameID(
ExecutableForm * anExecutable,
const std::string & aQualifiedNameID) const;
const Symbol & searchBufferInstanceByNameID(
ExecutableForm * anExecutable, const std::string & aNameID) const;
const Symbol & searchBufferInstanceAlias(ExecutableForm * anExecutable,
const std::string & aFullyQualifiedNameID);
const Symbol & createBufferInstanceAlias(ExecutableForm * anExecutable,
const std::string & aFullyQualifiedNameID,
InstanceOfBuffer * anInstance,
VectorOfInstanceOfMachine & theInstanceOfMachinePath);
/**
***************************************************************************
* GETTER / SETTER
* theListOfConnectInstance
* "SYMBOL TABLE : CONNECT"
***************************************************************************
*/
inline void addConnectInstance(const Symbol & anInstance)
{
mListOfConnectorInstance.append(anInstance);
}
inline const Symbol & searchConnectorInstance(
const std::string & aFullyQualifiedNameID) const
{
SymbolPredicateByCompiledFQNameID pred(aFullyQualifiedNameID);
return( searchCompiledElement(mListOfConnectorInstance, pred) );
}
inline const Symbol & searchConnectorInstance(
const ObjectElement * anElement) const
{
SymbolPredicateByCompiledElement pred( anElement );
return( searchCompiledElement(mListOfConnectorInstance, pred) );
}
inline void searchConnectorInstanceByNameID(
const std::string & aNameID, BFList & foundList) const
{
SymbolPredicateByNameID pred(aNameID);
searchCompiledElement(mListOfConnectorInstance, pred, foundList);
}
inline void searchConnectorInstanceByQualifiedNameID(
const std::string & aQualifiedNameID, BFList & foundList) const
{
SymbolPredicateByQualifiedNameID pred(aQualifiedNameID);
searchCompiledElement(mListOfConnectorInstance, pred, foundList);
}
const Symbol & searchConnectorInstance(ExecutableForm * anExecutable,
const ObjectElement * objElement) const;
const Symbol & searchConnectorInstance(ExecutableForm * anExecutable,
const std::string & aFullyQualifiedNameID) const;
const Symbol & searchConnectorInstanceByQualifiedNameID(
ExecutableForm * anExecutable,
const std::string & aQualifiedNameID) const;
const Symbol & searchConnectorInstanceByNameID(
ExecutableForm * anExecutable, const std::string & aNameID) const;
/**
***************************************************************************
* GETTER / SETTER
* mListOfDataInstance
* "SYMBOL TABLE : DATA"
***************************************************************************
*/
inline void addDataInstance(const Symbol & anInstance)
{
mListOfDataInstance.append(anInstance);
}
inline void searchDataInstanceByNameID(
const std::string & aNameID, BFList & foundList) const
{
SymbolPredicateByNameID pred(aNameID);
searchCompiledElement(mListOfDataInstance, pred, foundList);
}
inline void searchDataInstanceByQualifiedNameID(
const std::string & aQualifiedNameID, BFList & foundList) const
{
SymbolPredicateByQualifiedNameID pred(aQualifiedNameID);
searchCompiledElement(mListOfDataInstance, pred, foundList);
}
/**
***************************************************************************
* GETTER / SETTER
* mListOfMachineExecutable
* "SYMBOL TABLE : MACHINE EXECUTABLE"
***************************************************************************
*/
inline void addMachineExecutable(const BF & anExecutable)
{
mListOfMachineExecutable.append( anExecutable );
}
/**
***************************************************************************
* GETTER / SETTER
* mListOfAvmTransition
* "SYMBOL TABLE : AVM PROGRAM"
***************************************************************************
*/
inline void addTransition(const BF & aTransition)
{
mListOfAvmTransition.append( aTransition );
}
inline const BF & searchTransition(const ObjectElement * anElement) const
{
SymbolPredicateByCompiledElement pred( anElement );
return( searchCompiledElement(mListOfAvmTransition, pred) );
}
inline const BF & searchTransition(
const std::string & aFullyQualifiedNameID) const
{
SymbolPredicateByCompiledFQNameID pred(aFullyQualifiedNameID);
return( searchCompiledElement(mListOfAvmTransition, pred) );
}
inline const BF & searchTransitionByNameID(const std::string & aNameID) const
{
SymbolPredicateByNameID pred(aNameID);
return( searchCompiledElement(mListOfAvmTransition, pred) );
}
/**
***************************************************************************
* GETTER / SETTER
* mListOfAvmProgram
* "SYMBOL TABLE : AVM PROGRAM"
***************************************************************************
*/
inline void addProgram(const BF & aProgram)
{
mListOfAvmProgram.append( aProgram );
}
inline const BF & searchProgram(const ObjectElement * anElement) const
{
SymbolPredicateByCompiledElement pred( anElement );
return( searchCompiledElement(mListOfAvmProgram, pred) );
}
inline const BF & searchProgram(
const std::string & aFullyQualifiedNameID) const
{
SymbolPredicateByCompiledFQNameID pred(aFullyQualifiedNameID);
return( searchCompiledElement(mListOfAvmProgram, pred) );
}
inline const BF & searchProgramByNameID(const std::string & aNameID) const
{
SymbolPredicateByNameID pred(aNameID);
return( searchCompiledElement(mListOfAvmProgram, pred) );
}
/*
* GETTER
* mErrorCount
*/
inline avm_size_t getErrorCount() const
{
return( mErrorCount );
}
inline bool hasError() const
{
return( mErrorCount > 0 );
}
inline bool hasZeroError() const
{
return( mErrorCount == 0 );
}
inline avm_size_t incrErrorCount()
{
return( ++mErrorCount );
}
/*
* GETTER
* mWarningCount
*/
inline avm_size_t getWarningCount() const
{
return( mWarningCount );
}
inline bool hasWarning() const
{
return( mWarningCount > 0 );
}
inline bool hasZeroWarning() const
{
return( mWarningCount == 0 );
}
inline avm_size_t incrWarningCount()
{
return( ++mWarningCount );
}
/**
* GETTER - SETTER
* ERROR_OS
*/
inline std::string getErrorMessage() const
{
return( ERROR_OS.str() );
}
inline bool hasErrorMessage() const
{
return( ! (ERROR_OS.str().empty()) );
}
inline void addErrorMessage(const std::string & anErrorMessage)
{
if( hasErrorMessage() )
{
ERROR_OS << "\n";
}
ERROR_OS << anErrorMessage;
}
inline void resetError()
{
mErrorCount = 0;
ERROR_OS.str("");
}
inline void setErrorMessage(const std::string & anErrorMessage)
{
resetError();
ERROR_OS << anErrorMessage;
}
/**
* GETTER - SETTER
* WARNING_OS
*/
inline std::string getWarningMessage() const
{
return( WARNING_OS.str() );
}
inline bool hasWarningMessage() const
{
return( ! (WARNING_OS.str().empty()) );
}
inline void addWarningMessage(const std::string & anWarningMessage)
{
if( hasWarningMessage() )
{
WARNING_OS << "\n";
}
WARNING_OS << anWarningMessage;
}
inline void resetWarning()
{
mWarningCount = 0;
WARNING_OS.str("");
}
inline void setWarningMessage(const std::string & anWarningMessage)
{
resetWarning();
WARNING_OS << anWarningMessage;
}
};
}
#endif /* BUILDER_COMPILER_SYMBOLTABLE_H_ */