1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 #ifndef ADC_CPP_PREPROC_HXX 25 #define ADC_CPP_PREPROC_HXX 26 27 28 29 // USED SERVICES 30 // BASE CLASSES 31 // COMPONENTS 32 #include <deque> 33 // PARAMETERS 34 35 class CharacterSource; 36 37 38 namespace cpp 39 { 40 41 class Token; 42 class CodeExplorer; 43 class DefineDescription; 44 45 46 class PreProcessor 47 { 48 public: 49 typedef std::map< String, DefineDescription* > MacroMap; 50 51 // LIFECYCLE 52 PreProcessor(); 53 ~PreProcessor(); 54 // OPERATONS 55 void AssignPartners( 56 CodeExplorer & o_rCodeExplorer, 57 CharacterSource & o_rCharSource, 58 const MacroMap & i_rCurValidDefines ); 59 void Process_Token( 60 cpp::Token & let_drToken ); 61 void UnblockMacro( 62 const char * i_sMacroName ); 63 private: 64 public: // Necessary for instantiation of static variable: 65 enum E_State 66 { 67 plain = 0, 68 expect_macro_bracket_left, 69 expect_macro_param, 70 state_MAX 71 }; 72 typedef void (PreProcessor::* F_TOKENPROC )(cpp::Token &); 73 void On_plain( cpp::Token & ); 74 void On_expect_macro_bracket_left( cpp::Token & ); 75 void On_expect_macro_param( cpp::Token & ); 76 77 private: // Reprivate again: 78 typedef std::deque< DYN cpp::Token * > TokenQueue; 79 typedef StringVector List_MacroParams; 80 81 82 bool CheckForDefine( 83 cpp::Token & let_drToken ); 84 void InterpretMacro(); 85 86 // DATA 87 static F_TOKENPROC aTokProcs[state_MAX]; 88 // Referenced extern objects 89 CodeExplorer * pCppExplorer; 90 CharacterSource * pSourceText; 91 const MacroMap * pCurValidDefines; 92 93 // internal data 94 TokenQueue aTokens; 95 96 E_State eState; 97 98 DefineDescription * pCurMacro; 99 DYN Token * dpCurMacroName; 100 List_MacroParams aCurMacroParams; 101 csv::StreamStr aCurParamText; 102 103 intt nBracketInParameterCounter; 104 StringVector aBlockedMacroNames; 105 }; 106 107 108 109 } // end namespace cpp 110 111 #endif 112 113