1*78bc99aaSAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3*78bc99aaSAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4*78bc99aaSAndrew Rist * or more contributor license agreements. See the NOTICE file 5*78bc99aaSAndrew Rist * distributed with this work for additional information 6*78bc99aaSAndrew Rist * regarding copyright ownership. The ASF licenses this file 7*78bc99aaSAndrew Rist * to you under the Apache License, Version 2.0 (the 8*78bc99aaSAndrew Rist * "License"); you may not use this file except in compliance 9*78bc99aaSAndrew Rist * with the License. You may obtain a copy of the License at 10cdf0e10cSrcweir * 11*78bc99aaSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 13*78bc99aaSAndrew Rist * Unless required by applicable law or agreed to in writing, 14*78bc99aaSAndrew Rist * software distributed under the License is distributed on an 15*78bc99aaSAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*78bc99aaSAndrew Rist * KIND, either express or implied. See the License for the 17*78bc99aaSAndrew Rist * specific language governing permissions and limitations 18*78bc99aaSAndrew Rist * under the License. 19cdf0e10cSrcweir * 20*78bc99aaSAndrew Rist *************************************************************/ 21cdf0e10cSrcweir 22cdf0e10cSrcweir #include <precomp.h> 23cdf0e10cSrcweir #include "pe_file.hxx" 24cdf0e10cSrcweir 25cdf0e10cSrcweir // NOT FULLY DECLARED SERVICES 26cdf0e10cSrcweir #include "pe_defs.hxx" 27cdf0e10cSrcweir #include "pe_enum.hxx" 28cdf0e10cSrcweir #include "pe_namsp.hxx" 29cdf0e10cSrcweir #include "pe_tpltp.hxx" 30cdf0e10cSrcweir #include "pe_tydef.hxx" 31cdf0e10cSrcweir #include "pe_vafu.hxx" 32cdf0e10cSrcweir #include "pe_ignor.hxx" 33cdf0e10cSrcweir 34cdf0e10cSrcweir 35cdf0e10cSrcweir // NOT FULLY DECLARED SERVICES 36cdf0e10cSrcweir 37cdf0e10cSrcweir 38cdf0e10cSrcweir namespace cpp 39cdf0e10cSrcweir { 40cdf0e10cSrcweir 41cdf0e10cSrcweir PE_File::PE_File( cpp::PeEnvironment & io_rEnv) 42cdf0e10cSrcweir : Cpp_PE(io_rEnv), 43cdf0e10cSrcweir pEnv(&io_rEnv), 44cdf0e10cSrcweir pStati( new PeStatusArray<PE_File> ), 45cdf0e10cSrcweir // pSpNamespace, 46cdf0e10cSrcweir // pSpTypedef, 47cdf0e10cSrcweir // pSpVarFunc, 48cdf0e10cSrcweir // pSpIgnore, 49cdf0e10cSrcweir // pSpuNamespace, 50cdf0e10cSrcweir // pSpuClass, 51cdf0e10cSrcweir // pSpuTypedef, 52cdf0e10cSrcweir // pSpuVarFunc, 53cdf0e10cSrcweir // pSpuTemplate, 54cdf0e10cSrcweir // pSpuUsing, 55cdf0e10cSrcweir // pSpuIgnoreFailure, 56cdf0e10cSrcweir bWithinSingleExternC(false) 57cdf0e10cSrcweir { 58cdf0e10cSrcweir Setup_StatusFunctions(); 59cdf0e10cSrcweir 60cdf0e10cSrcweir pSpNamespace = new SP_Namespace(*this); 61cdf0e10cSrcweir pSpTypedef = new SP_Typedef(*this); 62cdf0e10cSrcweir pSpVarFunc = new SP_VarFunc(*this); 63cdf0e10cSrcweir pSpTemplate = new SP_Template(*this); 64cdf0e10cSrcweir pSpDefs = new SP_Defines(*this); 65cdf0e10cSrcweir pSpIgnore = new SP_Ignore(*this); 66cdf0e10cSrcweir 67cdf0e10cSrcweir pSpuNamespace = new SPU_Namespace(*pSpNamespace, 0, 0); 68cdf0e10cSrcweir pSpuTypedef = new SPU_Typedef(*pSpTypedef, 0, 0); 69cdf0e10cSrcweir pSpuVarFunc = new SPU_VarFunc(*pSpVarFunc, 0, &PE_File::SpReturn_VarFunc); 70cdf0e10cSrcweir pSpuTemplate = new SPU_Template(*pSpTemplate, 0, &PE_File::SpReturn_Template); 71cdf0e10cSrcweir pSpuDefs = new SPU_Defines(*pSpDefs, 0, 0); 72cdf0e10cSrcweir pSpuUsing = new SPU_Ignore(*pSpIgnore, 0, 0); 73cdf0e10cSrcweir pSpuIgnoreFailure 74cdf0e10cSrcweir = new SPU_Ignore(*pSpIgnore, 0, 0); 75cdf0e10cSrcweir } 76cdf0e10cSrcweir 77cdf0e10cSrcweir PE_File::~PE_File() 78cdf0e10cSrcweir { 79cdf0e10cSrcweir } 80cdf0e10cSrcweir 81cdf0e10cSrcweir void 82cdf0e10cSrcweir PE_File::Call_Handler( const cpp::Token & i_rTok ) 83cdf0e10cSrcweir { 84cdf0e10cSrcweir pStati->Cur().Call_Handler(i_rTok.TypeId(), i_rTok.Text()); 85cdf0e10cSrcweir } 86cdf0e10cSrcweir 87cdf0e10cSrcweir Cpp_PE * 88cdf0e10cSrcweir PE_File::Handle_ChildFailure() 89cdf0e10cSrcweir { 90cdf0e10cSrcweir SetCurSPU(pSpuIgnoreFailure.Ptr()); 91cdf0e10cSrcweir return &pSpuIgnoreFailure->Child(); 92cdf0e10cSrcweir } 93cdf0e10cSrcweir 94cdf0e10cSrcweir void 95cdf0e10cSrcweir PE_File::Setup_StatusFunctions() 96cdf0e10cSrcweir { 97cdf0e10cSrcweir typedef CallFunction<PE_File>::F_Tok F_Tok; 98cdf0e10cSrcweir static F_Tok stateF_std[] = { &PE_File::On_std_VarFunc, 99cdf0e10cSrcweir &PE_File::On_std_ClassKey, 100cdf0e10cSrcweir &PE_File::On_std_ClassKey, 101cdf0e10cSrcweir &PE_File::On_std_ClassKey, 102cdf0e10cSrcweir &PE_File::On_std_enum, 103cdf0e10cSrcweir 104cdf0e10cSrcweir &PE_File::On_std_typedef, 105cdf0e10cSrcweir &PE_File::On_std_template, 106cdf0e10cSrcweir &PE_File::On_std_VarFunc, 107cdf0e10cSrcweir &PE_File::On_std_VarFunc, 108cdf0e10cSrcweir &PE_File::On_std_extern, 109cdf0e10cSrcweir 110cdf0e10cSrcweir &PE_File::On_std_VarFunc, 111cdf0e10cSrcweir &PE_File::On_std_VarFunc, 112cdf0e10cSrcweir &PE_File::On_std_VarFunc, 113cdf0e10cSrcweir &PE_File::On_std_namespace, 114cdf0e10cSrcweir &PE_File::On_std_using, 115cdf0e10cSrcweir 116cdf0e10cSrcweir &PE_File::On_std_SwBracketRight, 117cdf0e10cSrcweir &PE_File::On_std_VarFunc, 118cdf0e10cSrcweir &PE_File::On_std_VarFunc, 119cdf0e10cSrcweir &PE_File::On_std_DefineName, 120cdf0e10cSrcweir &PE_File::On_std_MacroName, 121cdf0e10cSrcweir 122cdf0e10cSrcweir &PE_File::On_std_VarFunc, 123cdf0e10cSrcweir &PE_File::On_std_VarFunc }; 124cdf0e10cSrcweir 125cdf0e10cSrcweir static INT16 stateT_std[] = { Tid_Identifier, 126cdf0e10cSrcweir Tid_class, 127cdf0e10cSrcweir Tid_struct, 128cdf0e10cSrcweir Tid_union, 129cdf0e10cSrcweir Tid_enum, 130cdf0e10cSrcweir 131cdf0e10cSrcweir Tid_typedef, 132cdf0e10cSrcweir Tid_template, 133cdf0e10cSrcweir Tid_const, 134cdf0e10cSrcweir Tid_volatile, 135cdf0e10cSrcweir Tid_extern, 136cdf0e10cSrcweir 137cdf0e10cSrcweir Tid_static, 138cdf0e10cSrcweir Tid_register, 139cdf0e10cSrcweir Tid_inline, 140cdf0e10cSrcweir Tid_namespace, 141cdf0e10cSrcweir Tid_using, 142cdf0e10cSrcweir 143cdf0e10cSrcweir Tid_SwBracket_Right, 144cdf0e10cSrcweir Tid_DoubleColon, 145cdf0e10cSrcweir Tid_typename, 146cdf0e10cSrcweir Tid_DefineName, 147cdf0e10cSrcweir Tid_MacroName, 148cdf0e10cSrcweir 149cdf0e10cSrcweir Tid_BuiltInType, 150cdf0e10cSrcweir Tid_TypeSpecializer }; 151cdf0e10cSrcweir 152cdf0e10cSrcweir static F_Tok stateF_in_extern[] = { &PE_File::On_in_extern_Constant }; 153cdf0e10cSrcweir static INT16 stateT_in_extern[] = { Tid_Constant }; 154cdf0e10cSrcweir 155cdf0e10cSrcweir static F_Tok stateF_in_externC[] = { &PE_File::On_in_externC_SwBracket_Left }; 156cdf0e10cSrcweir static INT16 stateT_in_externC[] = { Tid_SwBracket_Left }; 157cdf0e10cSrcweir 158cdf0e10cSrcweir 159cdf0e10cSrcweir SEMPARSE_CREATE_STATUS(PE_File, std, Hdl_SyntaxError); 160cdf0e10cSrcweir SEMPARSE_CREATE_STATUS(PE_File, in_extern, On_in_extern_Ignore); 161cdf0e10cSrcweir SEMPARSE_CREATE_STATUS(PE_File, in_externC, On_in_externC_NoBlock); 162cdf0e10cSrcweir } 163cdf0e10cSrcweir 164cdf0e10cSrcweir void 165cdf0e10cSrcweir PE_File::InitData() 166cdf0e10cSrcweir { 167cdf0e10cSrcweir pStati->SetCur(std); 168cdf0e10cSrcweir } 169cdf0e10cSrcweir 170cdf0e10cSrcweir void 171cdf0e10cSrcweir PE_File::TransferData() 172cdf0e10cSrcweir { 173cdf0e10cSrcweir pStati->SetCur(size_of_states); 174cdf0e10cSrcweir } 175cdf0e10cSrcweir 176cdf0e10cSrcweir void 177cdf0e10cSrcweir PE_File::Hdl_SyntaxError( const char * i_sText) 178cdf0e10cSrcweir { 179cdf0e10cSrcweir if ( *i_sText == ';' ) 180cdf0e10cSrcweir { 181cdf0e10cSrcweir Cerr() << Env().CurFileName() << ", line " 182cdf0e10cSrcweir << Env().LineCount() 183cdf0e10cSrcweir << ": Sourcecode warning: ';' as a toplevel declaration is deprecated." 184cdf0e10cSrcweir << Endl(); 185cdf0e10cSrcweir SetTokenResult(done,stay); 186cdf0e10cSrcweir return; 187cdf0e10cSrcweir } 188cdf0e10cSrcweir 189cdf0e10cSrcweir StdHandlingOfSyntaxError(i_sText); 190cdf0e10cSrcweir } 191cdf0e10cSrcweir 192cdf0e10cSrcweir void 193cdf0e10cSrcweir PE_File::SpReturn_VarFunc() 194cdf0e10cSrcweir { 195cdf0e10cSrcweir if (bWithinSingleExternC) 196cdf0e10cSrcweir { 197cdf0e10cSrcweir access_Env().CloseBlock(); 198cdf0e10cSrcweir bWithinSingleExternC = false; 199cdf0e10cSrcweir } 200cdf0e10cSrcweir } 201cdf0e10cSrcweir 202cdf0e10cSrcweir void 203cdf0e10cSrcweir PE_File::SpReturn_Template() 204cdf0e10cSrcweir { 205cdf0e10cSrcweir access_Env().OpenTemplate( pSpuTemplate->Child().Result_Parameters() ); 206cdf0e10cSrcweir } 207cdf0e10cSrcweir 208cdf0e10cSrcweir void 209cdf0e10cSrcweir PE_File::On_std_namespace(const char * ) 210cdf0e10cSrcweir { 211cdf0e10cSrcweir pSpuNamespace->Push(done); 212cdf0e10cSrcweir } 213cdf0e10cSrcweir 214cdf0e10cSrcweir void 215cdf0e10cSrcweir PE_File::On_std_ClassKey(const char * ) 216cdf0e10cSrcweir { 217cdf0e10cSrcweir pSpuVarFunc->Push(not_done); // This is correct, 218cdf0e10cSrcweir // classes are parsed via PE_Type. 219cdf0e10cSrcweir } 220cdf0e10cSrcweir 221cdf0e10cSrcweir void 222cdf0e10cSrcweir PE_File::On_std_typedef(const char * ) 223cdf0e10cSrcweir { 224cdf0e10cSrcweir pSpuTypedef->Push(not_done); 225cdf0e10cSrcweir } 226cdf0e10cSrcweir 227cdf0e10cSrcweir void 228cdf0e10cSrcweir PE_File::On_std_enum(const char * ) 229cdf0e10cSrcweir { 230cdf0e10cSrcweir pSpuVarFunc->Push(not_done); // This is correct, 231cdf0e10cSrcweir // enums are parsed via PE_Type. 232cdf0e10cSrcweir } 233cdf0e10cSrcweir 234cdf0e10cSrcweir void 235cdf0e10cSrcweir PE_File::On_std_VarFunc(const char * ) 236cdf0e10cSrcweir { 237cdf0e10cSrcweir pSpuVarFunc->Push(not_done); 238cdf0e10cSrcweir } 239cdf0e10cSrcweir 240cdf0e10cSrcweir void 241cdf0e10cSrcweir PE_File::On_std_template(const char * ) 242cdf0e10cSrcweir { 243cdf0e10cSrcweir pSpuTemplate->Push(done); 244cdf0e10cSrcweir } 245cdf0e10cSrcweir 246cdf0e10cSrcweir void 247cdf0e10cSrcweir PE_File::On_std_extern(const char * ) 248cdf0e10cSrcweir { 249cdf0e10cSrcweir SetTokenResult(done, stay); 250cdf0e10cSrcweir pStati->SetCur(in_extern); 251cdf0e10cSrcweir } 252cdf0e10cSrcweir 253cdf0e10cSrcweir void 254cdf0e10cSrcweir PE_File::On_std_using(const char * ) 255cdf0e10cSrcweir { 256cdf0e10cSrcweir pSpuUsing->Push(done); 257cdf0e10cSrcweir } 258cdf0e10cSrcweir 259cdf0e10cSrcweir void 260cdf0e10cSrcweir PE_File::On_std_SwBracketRight(const char * ) 261cdf0e10cSrcweir { 262cdf0e10cSrcweir SetTokenResult(done,stay); 263cdf0e10cSrcweir access_Env().CloseBlock(); 264cdf0e10cSrcweir } 265cdf0e10cSrcweir 266cdf0e10cSrcweir void 267cdf0e10cSrcweir PE_File::On_std_DefineName(const char * ) 268cdf0e10cSrcweir { 269cdf0e10cSrcweir pSpuDefs->Push(not_done); 270cdf0e10cSrcweir } 271cdf0e10cSrcweir 272cdf0e10cSrcweir void 273cdf0e10cSrcweir PE_File::On_std_MacroName(const char * ) 274cdf0e10cSrcweir { 275cdf0e10cSrcweir pSpuDefs->Push(not_done); 276cdf0e10cSrcweir } 277cdf0e10cSrcweir 278cdf0e10cSrcweir void 279cdf0e10cSrcweir PE_File::On_in_extern_Constant(const char * ) 280cdf0e10cSrcweir { 281cdf0e10cSrcweir SetTokenResult(done,stay); 282cdf0e10cSrcweir pStati->SetCur(in_externC); 283cdf0e10cSrcweir 284cdf0e10cSrcweir access_Env().OpenExternC(); 285cdf0e10cSrcweir } 286cdf0e10cSrcweir 287cdf0e10cSrcweir void 288cdf0e10cSrcweir PE_File::On_in_extern_Ignore(const char * ) 289cdf0e10cSrcweir { 290cdf0e10cSrcweir SetTokenResult(not_done, stay); 291cdf0e10cSrcweir pStati->SetCur(std); 292cdf0e10cSrcweir } 293cdf0e10cSrcweir 294cdf0e10cSrcweir void 295cdf0e10cSrcweir PE_File::On_in_externC_SwBracket_Left(const char * ) 296cdf0e10cSrcweir { 297cdf0e10cSrcweir SetTokenResult(done, stay); 298cdf0e10cSrcweir pStati->SetCur(std); 299cdf0e10cSrcweir } 300cdf0e10cSrcweir 301cdf0e10cSrcweir void 302cdf0e10cSrcweir PE_File::On_in_externC_NoBlock(const char * ) 303cdf0e10cSrcweir { 304cdf0e10cSrcweir SetTokenResult(not_done, stay); 305cdf0e10cSrcweir pStati->SetCur(std); 306cdf0e10cSrcweir 307cdf0e10cSrcweir bWithinSingleExternC = true; 308cdf0e10cSrcweir } 309cdf0e10cSrcweir 310cdf0e10cSrcweir 311cdf0e10cSrcweir } // namespace cpp 312