diff options
Diffstat (limited to 'autodoc/source/parser/inc/semantic')
-rw-r--r-- | autodoc/source/parser/inc/semantic/callf.hxx | 287 | ||||
-rw-r--r-- | autodoc/source/parser/inc/semantic/parseenv.hxx | 110 | ||||
-rw-r--r-- | autodoc/source/parser/inc/semantic/sub_pe.hxx | 112 | ||||
-rw-r--r-- | autodoc/source/parser/inc/semantic/sub_peu.hxx | 131 |
4 files changed, 640 insertions, 0 deletions
diff --git a/autodoc/source/parser/inc/semantic/callf.hxx b/autodoc/source/parser/inc/semantic/callf.hxx new file mode 100644 index 000000000000..a76da81e280c --- /dev/null +++ b/autodoc/source/parser/inc/semantic/callf.hxx @@ -0,0 +1,287 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef ADC_CPP_CALLF_HXX +#define ADC_CPP_CALLF_HXX + +// USED SERVICES + + + + +/** This represents a function to be called, if a specific kind of token + arrives in the semantic parser. + + @descr This class is only to be used as member of PeStatus<PE>. + @template PE + The owning ParseEnvironment. + @see PeStatus, ParseEnvironment +*/ +template <class PE> +class CallFunction +{ + public: + typedef void (PE::*F_Tok)(const char *); + + CallFunction( + F_Tok i_f2Call, + INT16 i_nTokType ); + + F_Tok GetF() const; + INT16 TokType() const; + + private: + // DATA + F_Tok f2Call; + INT16 nTokType; +}; + + +/** One state within a ParseEnvironment. + + @template PE + The owning ParseEnvironment. +*/ +template <class PE> +class PeStatus +{ + public: + typedef typename CallFunction<PE>::F_Tok F_Tok; + + PeStatus( + PE & i_rMyPE, + uintt i_nSize, + F_Tok * i_pFuncArray, + INT16 * i_pTokTypeArray, + F_Tok i_pDefault ); + virtual ~PeStatus(); + + virtual void Call_Handler( + INT16 i_nTokTypeId, + const char * i_sTokenText ) const; + + private: + bool CheckForCall( + uintt i_nPos, + INT16 i_nTokTypeId, + const char * i_sTokenText ) const; + + PE * pMyPE; + std::vector< CallFunction<PE> > + aBranches; + F_Tok fDefault; +}; + + +template <class PE> +class PeStatusArray +{ + public: + typedef typename PE::E_State State; + + PeStatusArray(); + void InsertState( + State i_ePosition, + DYN PeStatus<PE> & let_drState ); + ~PeStatusArray(); + + const PeStatus<PE> & + operator[]( + State i_ePosition ) const; + + void SetCur( + State i_eCurState ); + const PeStatus<PE> & + Cur() const; + + private: + DYN PeStatus<PE> * aStati[PE::size_of_states]; + State eState; +}; + + + +// IMPLEMENTATION + + +// CallFunction + +template <class PE> +CallFunction<PE>::CallFunction( F_Tok i_f2Call, + INT16 i_nTokType ) + : f2Call(i_f2Call), + nTokType(i_nTokType) +{ +} + +template <class PE> +inline typename CallFunction<PE>::F_Tok +CallFunction<PE>::GetF() const +{ + return f2Call; +} + +template <class PE> +inline INT16 +CallFunction<PE>::TokType() const +{ + return nTokType; +} + + + +// PeStatus + +template <class PE> +PeStatus<PE>::PeStatus( PE & i_rMyPE, + uintt i_nSize, + F_Tok * i_pFuncArray, + INT16 * i_pTokTypeArray, + F_Tok i_fDefault ) + : pMyPE(&i_rMyPE), + fDefault(i_fDefault) +{ + aBranches.reserve(i_nSize); + for ( uintt i = 0; i < i_nSize; ++i ) + { +// csv_assert(i > 0 ? i_pTokTypeArray[i] > i_pTokTypeArray[i-1] : true); + aBranches.push_back( CallFunction<PE>( i_pFuncArray[i], i_pTokTypeArray[i]) ); + } // end for +} + +template <class PE> +PeStatus<PE>::~PeStatus() +{ + +} + +template <class PE> +void +PeStatus<PE>::Call_Handler( INT16 i_nTokTypeId, + const char * i_sTokenText ) const +{ + uintt nSize = aBranches.size(); + uintt nPos = nSize / 2; + + if ( i_nTokTypeId < aBranches[nPos].TokType() ) + { + for ( --nPos; intt(nPos) >= 0; --nPos ) + { + if (CheckForCall(nPos, i_nTokTypeId, i_sTokenText)) + return; + } + } + else + { + for ( ; nPos < nSize; ++nPos ) + { + if (CheckForCall(nPos, i_nTokTypeId, i_sTokenText)) + return; + } + } + + (pMyPE->*fDefault)(i_sTokenText); +} + +template <class PE> +bool +PeStatus<PE>::CheckForCall( uintt i_nPos, + INT16 i_nTokTypeId, + const char * i_sTokenText ) const +{ + if ( aBranches[i_nPos].TokType() == i_nTokTypeId ) + { + (pMyPE->*aBranches[i_nPos].GetF())(i_sTokenText); + return true; + } + return false; +} + +// PeStatusArray + +template <class PE> +PeStatusArray<PE>::PeStatusArray() + : eState(PE::size_of_states) +{ + memset(aStati, 0, sizeof aStati); +} + +template <class PE> +void +PeStatusArray<PE>::InsertState( State i_ePosition, + DYN PeStatus<PE> & let_drState ) +{ + csv_assert(aStati[i_ePosition] == 0); + aStati[i_ePosition] = &let_drState; +} + +template <class PE> +PeStatusArray<PE>::~PeStatusArray() +{ + int i_max = PE::size_of_states; + for (int i = 0; i < i_max; i++) + { + delete aStati[i]; + } // end for +} + +template <class PE> +inline const PeStatus<PE> & +PeStatusArray<PE>::operator[]( State i_ePosition ) const +{ + csv_assert( uintt(i_ePosition) < PE::size_of_states ); + csv_assert( aStati[i_ePosition] != 0 ); + return *aStati[i_ePosition]; +} + +template <class PE> +inline void +PeStatusArray<PE>::SetCur( State i_eCurState ) +{ + eState = i_eCurState; +} + + +template <class PE> +const PeStatus<PE> & +PeStatusArray<PE>::Cur() const +{ + return (*this)[eState]; +} + +#define SEMPARSE_CREATE_STATUS(penv, state, default_function) \ + pStati->InsertState( state, \ + *new PeStatus<penv>( \ + *this, \ + sizeof( stateT_##state ) / sizeof (INT16), \ + stateF_##state, \ + stateT_##state, \ + &penv::default_function ) ) + + +#endif + diff --git a/autodoc/source/parser/inc/semantic/parseenv.hxx b/autodoc/source/parser/inc/semantic/parseenv.hxx new file mode 100644 index 000000000000..d6ba3daf661a --- /dev/null +++ b/autodoc/source/parser/inc/semantic/parseenv.hxx @@ -0,0 +1,110 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef ADC_PARSEENV_HXX +#define ADC_PARSEENV_HXX + + + +// USED SERVICES + // BASE CLASSES +#include <tokens/tokproct.hxx> + // COMPONENTS + // PARAMETERS + + +namespace ary +{ +namespace info +{ +class CodeInfo; +} // namespace info +} // namespace ary) + + + +class SubPeUseIfc; + + +class ParseEnvironment : protected TokenProcessing_Types +{ + public: + virtual ~ParseEnvironment() {} + + // Parsing + void Enter( + E_EnvStackAction i_eWayOfEntering ); + void Leave( + E_EnvStackAction i_eWayOfLeaving ); + void SetCurSPU( + const SubPeUseIfc * i_pCurSPU ); + + ParseEnvironment * Parent() const; + + + // ACCESS + protected: + ParseEnvironment( + ParseEnvironment * i_pParent ); + const SubPeUseIfc * CurSubPeUse() const; + private: + virtual void InitData() = 0; + virtual void TransferData() = 0; + + ParseEnvironment * pParent; + const SubPeUseIfc * pCurSubPe; +}; + +class SubPeUseIfc +{ + public: + virtual ~SubPeUseIfc() {} + + virtual void InitParse() const = 0; + virtual void GetResults() const = 0; +}; + + + +// IMPLEMENTATION + +inline void +ParseEnvironment::SetCurSPU( const SubPeUseIfc * i_pCurSPU ) + { pCurSubPe = i_pCurSPU; } + +inline ParseEnvironment * +ParseEnvironment::Parent() const + { return pParent; } + +inline const SubPeUseIfc * +ParseEnvironment::CurSubPeUse() const + { return pCurSubPe; } + + + +#endif + diff --git a/autodoc/source/parser/inc/semantic/sub_pe.hxx b/autodoc/source/parser/inc/semantic/sub_pe.hxx new file mode 100644 index 000000000000..84775f2e9425 --- /dev/null +++ b/autodoc/source/parser/inc/semantic/sub_pe.hxx @@ -0,0 +1,112 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef ADC_CPP_SUB_PE_HXX +#define ADC_CPP_SUB_PE_HXX + + + +// USED SERVICES + // BASE CLASSES + // COMPONENTS + // PARAMETERS + + +class ParseEnvironment; + +template <class PE, class SUB> +class SubPe +{ + public: + typedef SubPe< PE, SUB > self; + + SubPe( + PE & i_rParent ); + PE & Parent() const; + SUB & Child() const; + + ParseEnvironment & Get() const; + + private: + SUB & CreateChild() const; + + PE & rParent; + Dyn<SUB> pChild; +}; + + + +// IMPLEMENTATION + + +// SubPe + +template <class PE, class SUB> +SubPe<PE,SUB>::SubPe( PE & i_rParent ) + : rParent(i_rParent) +{ +} + +template <class PE, class SUB> +PE & +SubPe<PE,SUB>::Parent() const +{ + return rParent; +} + +template <class PE, class SUB> +inline SUB & +SubPe<PE,SUB>::Child() const +{ + return pChild ? *pChild.MutablePtr() : CreateChild(); +} + +template <class PE, class SUB> +ParseEnvironment & +SubPe<PE,SUB>::Get() const +{ + return Child(); +} + +template <class PE, class SUB> +SUB & +SubPe<PE,SUB>::CreateChild() const +{ + self * pThis = const_cast< self* >(this); + + SUB * pNewChild = new SUB( &rParent); + + pThis->pChild = pNewChild; + + return *pChild.MutablePtr(); +} + + + + +#endif + diff --git a/autodoc/source/parser/inc/semantic/sub_peu.hxx b/autodoc/source/parser/inc/semantic/sub_peu.hxx new file mode 100644 index 000000000000..c939f295c373 --- /dev/null +++ b/autodoc/source/parser/inc/semantic/sub_peu.hxx @@ -0,0 +1,131 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef ADC_CPP_SUB_PEU_HXX +#define ADC_CPP_SUB_PEU_HXX + + + +// USED SERVICES + // BASE CLASSES +#include <semantic/parseenv.hxx> +#include <tokens/tokproct.hxx> + // COMPONENTS + // PARAMETERS +#include <semantic/sub_pe.hxx> + + + +template <class PE, class SUB> +class SubPeUse : public SubPeUseIfc, + private TokenProcessing_Types +{ + public: + typedef void (PE::*F_INIT)(); + typedef void (PE::*F_RETURN)(); + + SubPeUse( + SubPe<PE,SUB> & i_rSubPeCreator, + F_INIT i_fInit, + F_RETURN i_fReturn ); + ~SubPeUse(); + + void Push( + E_TokenDone i_eDone ); + virtual void InitParse() const; + virtual void GetResults() const; + + PE & Parent() const; + SUB & Child() const; + + private: + // DATA + SubPe<PE,SUB> & rSubPeCreator; + F_INIT fInit; + F_RETURN fReturn; +}; + + +// IMPLEMENTATION + + +template <class PE, class SUB> +SubPeUse<PE,SUB>::SubPeUse( SubPe<PE,SUB> & i_rSubPeCreator, + F_INIT i_fInit, + F_RETURN i_fReturn ) + : rSubPeCreator(i_rSubPeCreator), + fInit(i_fInit), + fReturn(i_fReturn) +{ +} + +template <class PE, class SUB> +SubPeUse<PE,SUB>::~SubPeUse() +{ +} + +template <class PE, class SUB> +void +SubPeUse<PE,SUB>::Push( E_TokenDone i_eDone ) +{ + Parent().SetTokenResult( i_eDone, push, &rSubPeCreator.Get() ); + Parent().SetCurSPU(this); +} + +template <class PE, class SUB> +void +SubPeUse<PE,SUB>::InitParse() const +{ + if (fInit != 0) + (Parent().*fInit)(); +} + +template <class PE, class SUB> +void +SubPeUse<PE,SUB>::GetResults() const +{ + if (fReturn != 0) + (Parent().*fReturn)(); +} + +template <class PE, class SUB> +inline PE & +SubPeUse<PE,SUB>::Parent() const +{ + return rSubPeCreator.Parent(); +} + +template <class PE, class SUB> +inline SUB & +SubPeUse<PE,SUB>::Child() const +{ + return rSubPeCreator.Child(); +} + + +#endif + |