blob: c2a64839ea72b26a6946dc45593404b6a1539c2c [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
#ifndef ADC_CPP_PE_FUNCT_HXX
#define ADC_CPP_PE_FUNCT_HXX
// USED SERVICES
// BASE CLASSES
#include "cpp_pe.hxx"
// COMPONENTS
#include <semantic/callf.hxx>
#include <semantic/sub_peu.hxx>
#include <ary/cpp/c_types4cpp.hxx>
#include <ary/cpp/c_vfflag.hxx>
// PARAMETERS
namespace ary
{
namespace cpp
{
class Function;
struct S_VariableInfo;
}
}
namespace cpp
{
class PE_Type;
class PE_Parameter;
class PE_Function : public Cpp_PE
{
public:
enum E_State
{
afterStdOperator, // if initializes as operator
afterStdOperatorLeftBracket,
// if initializes as operator with ( or [
afterCastOperator, // if initializes as operator
afterName, // undecided
expectParameterSeparator, //
afterParameters, // before const, volatile throw or = 0.
afterThrow, // expect (
expectExceptionSeparator, //
afterExceptions, // = 0 oder ; oder ,
expectZero, // after '='
inImplementation, // after {
size_of_states
};
typedef ary::cpp::E_Protection E_Protection;
typedef ary::cpp::E_Virtuality E_Virtuality;
typedef ary::cpp::E_ConVol E_ConVol;
PE_Function(
Cpp_PE * i_pParent );
~PE_Function();
void Init_Std(
const String & i_sName,
ary::cpp::Type_id i_nReturnType,
bool i_bVirtual,
ary::cpp::FunctionFlags
i_aFlags );
void Init_Ctor(
const String & i_sName,
ary::cpp::FunctionFlags
i_aFlags );
void Init_Dtor(
const String & i_sName,
bool i_bVirtual,
ary::cpp::FunctionFlags
i_aFlags );
void Init_CastOperator(
bool i_bVirtual,
ary::cpp::FunctionFlags
i_aFlags );
void Init_NormalOperator(
ary::cpp::Type_id i_nReturnType,
bool i_bVirtual,
ary::cpp::FunctionFlags
i_aFlags );
ary::cpp::Ce_id Result_Id() const;
bool Result_WithImplementation() const;
virtual void Call_Handler(
const cpp::Token & i_rTok );
private:
typedef SubPe< PE_Function, PE_Type > SP_Type;
typedef SubPeUse< PE_Function, PE_Type > SPU_Type;
typedef SubPe< PE_Function, PE_Parameter> SP_Parameter;
typedef SubPeUse<PE_Function, PE_Parameter> SPU_Parameter;
typedef std::vector<ary::cpp::S_Parameter> ParameterList;
typedef std::vector<ary::cpp::Type_id> ExceptionTypeList;
void Setup_StatusFunctions();
virtual void InitData();
virtual void TransferData();
void Hdl_SyntaxError(const char * i_sText);
void SpInit_CastOperatorType();
void SpReturn_Parameter();
void SpReturn_Exception();
void SpReturn_CastOperatorType();
void On_afterOperator_Std_Operator(const char * i_sText); // Operator+() etc.
void On_afterOperator_Std_LeftBracket(const char * i_sText); // operator [] or ()
void On_afterStdOperatorLeftBracket_RightBracket(const char * i_sText);
void On_afterOperator_Cast_Type(const char * i_sText); // Type
void On_afterName_Bracket_Left(const char * i_sText);
void On_expectParameterSeparator_BracketRight(const char * i_sText);
void On_expectParameterSeparator_Comma(const char * i_sText);
void On_afterParameters_const(const char * i_sText);
void On_afterParameters_volatile(const char * i_sText);
void On_afterParameters_throw(const char * i_sText);
void On_afterParameters_SwBracket_Left(const char * i_sText);
void On_afterParameters_Semicolon(const char * i_sText);
void On_afterParameters_Comma(const char * i_sText);
void On_afterParameters_Colon(const char * i_sText);
void On_afterParameters_Assign(const char * i_sText);
void On_afterThrow_Bracket_Left(const char * i_sText);
void On_expectExceptionSeparator_BracketRight(const char * i_sText);
void On_expectExceptionSeparator_Comma(const char * i_sText);
void On_afterExceptions_SwBracket_Left(const char * i_sText);
void On_afterExceptions_Semicolon(const char * i_sText);
void On_afterExceptions_Comma(const char * i_sText);
void On_afterExceptions_Colon(const char * i_sText);
void On_afterExceptions_Assign(const char * i_sText);
void On_expectZero_Constant(const char * i_sText);
void On_inImplementation_SwBracket_Left(const char * i_sText);
void On_inImplementation_SwBracket_Right(const char * i_sText);
void On_inImplementation_Default(const char * i_sText);
void PerformFinishingPunctuation();
void EnterImplementation(
intt i_nBracketCountStart ); /// 1 normally, 0 in initialisation section of c'tors.
// DATA
Dyn< PeStatusArray<PE_Function> >
pStati;
Dyn< SP_Parameter > pSpParameter;
Dyn< SPU_Parameter> pSpuParameter;
Dyn< SP_Type > pSpType;
Dyn< SPU_Type > pSpuException;
Dyn< SPU_Type > pSpuCastOperatorType; // in "operator int()" or "operator ThatClass *()"
ary::cpp::Ce_id nResult;
bool bResult_WithImplementation; // Necessary for the parent ParseEnvironment
// to know, there is no semicolon or comma following.
// Pre results
StreamStr aName;
E_Virtuality eVirtuality;
E_ConVol eConVol;
ary::cpp::FunctionFlags
aFlags;
ary::cpp::Type_id nReturnType;
ParameterList aParameters;
ExceptionTypeList aExceptions;
bool bThrow; // Indicates, if there is a throw - important, if there are 0 exceptions listed.
intt nBracketCounterInImplementation;
};
// IMPLEMENTATION
inline bool
PE_Function::Result_WithImplementation() const
{ return bResult_WithImplementation; }
} // namespace cpp
#endif
/* // Overview of Stati
Undecided
---------
start // vor und während storage class specifiern
->Typ
expectName // Typ ist da
afterName
Variable
--------
start // vor und während storage class specifiern
->Typ
expectName // Typ ist da -> im Falle von '(': notyetimplemented
afterName
expectSize // after [
expectFinish
// vor ; oder ,
expectNextVarName // anders als bei expectName kann hier auch * oder & kommen
Function
--------
start // vor und während storage class specifiern
->Typ
expectName // Typ ist da
expectBracket // Nach Name
expectParameter // nach ( oder ,
-> Parameter
after Parameters // before const, volatile throw or = 0.
after throw // expect (
expectException // after (
after exceptions // = 0 oder ; oder ,
expectNextVarName // anders als bei expectName kann hier auch * oder & kommen
*/