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 #include <precomp.h> 23 #include "pe_tpltp.hxx" 24 25 26 // NOT FULLY DECLARED SERVICES 27 #include <cosv/tpl/tpltools.hxx> 28 29 30 31 namespace cpp { 32 33 34 35 PE_TemplateTop::PE_TemplateTop( Cpp_PE * i_pParent ) 36 : Cpp_PE(i_pParent), 37 pStati( new PeStatusArray<PE_TemplateTop> ), 38 // aResult_Parameters, 39 bCurIsConstant(false) 40 { 41 Setup_StatusFunctions(); 42 } 43 44 45 PE_TemplateTop::~PE_TemplateTop() 46 { 47 } 48 49 void 50 PE_TemplateTop::Call_Handler( const cpp::Token & i_rTok ) 51 { 52 pStati->Cur().Call_Handler(i_rTok.TypeId(), i_rTok.Text()); 53 } 54 55 void 56 PE_TemplateTop::Setup_StatusFunctions() 57 { 58 typedef CallFunction<PE_TemplateTop>::F_Tok F_Tok; 59 60 static F_Tok stateF_start[] = { &PE_TemplateTop::On_start_Less }; 61 static INT16 stateT_start[] = { Tid_Less }; 62 63 static F_Tok stateF_expect_qualifier[]= { &PE_TemplateTop::On_expect_qualifier_ClassOrTypename, 64 &PE_TemplateTop::On_expect_qualifier_Greater, 65 &PE_TemplateTop::On_expect_qualifier_ClassOrTypename }; 66 static INT16 stateT_expect_qualifier[]= { Tid_class, 67 Tid_Greater, 68 Tid_typename }; 69 70 static F_Tok stateF_expect_name[] = { &PE_TemplateTop::On_expect_name_Identifier }; 71 static INT16 stateT_expect_name[] = { Tid_Identifier }; 72 73 static F_Tok stateF_expect_separator[]= { &PE_TemplateTop::On_expect_separator_Comma, 74 &PE_TemplateTop::On_expect_separator_Greater }; 75 static INT16 stateT_expect_separator[]= { Tid_Comma, 76 Tid_Greater }; 77 78 SEMPARSE_CREATE_STATUS(PE_TemplateTop, start, Hdl_SyntaxError); 79 SEMPARSE_CREATE_STATUS(PE_TemplateTop, expect_qualifier, On_expect_qualifier_Other); 80 SEMPARSE_CREATE_STATUS(PE_TemplateTop, expect_name, Hdl_SyntaxError); 81 SEMPARSE_CREATE_STATUS(PE_TemplateTop, expect_separator, Hdl_SyntaxError); 82 } 83 84 void 85 PE_TemplateTop::InitData() 86 { 87 pStati->SetCur(start); 88 csv::erase_container(aResult_Parameters); 89 bCurIsConstant = false; 90 } 91 92 void 93 PE_TemplateTop::TransferData() 94 { 95 pStati->SetCur(size_of_states); 96 } 97 98 void 99 PE_TemplateTop::Hdl_SyntaxError(const char * i_sText) 100 { 101 StdHandlingOfSyntaxError(i_sText); 102 } 103 104 void 105 PE_TemplateTop::On_start_Less( const char *) 106 { 107 SetTokenResult(done, stay); 108 pStati->SetCur(expect_qualifier); 109 } 110 111 void 112 PE_TemplateTop::On_expect_qualifier_ClassOrTypename( const char *) 113 { 114 SetTokenResult(done, stay); 115 pStati->SetCur(expect_name); 116 } 117 118 void 119 PE_TemplateTop::On_expect_qualifier_Greater(const char *) 120 { 121 SetTokenResult(done, pop_success); 122 } 123 124 void 125 PE_TemplateTop::On_expect_qualifier_Other( const char *) 126 { 127 SetTokenResult(done, stay); 128 pStati->SetCur(expect_name); 129 130 bCurIsConstant = true; 131 } 132 133 void 134 PE_TemplateTop::On_expect_name_Identifier( const char * i_sText) 135 { 136 SetTokenResult(done, stay); 137 pStati->SetCur(expect_separator); 138 139 StreamLock sl(50); 140 if ( NOT bCurIsConstant ) 141 { 142 String sText( sl() << "typename " << i_sText << c_str ); 143 aResult_Parameters.push_back(sText); 144 } 145 else // 146 { 147 String sText( sl() << "constant " << i_sText << c_str ); 148 aResult_Parameters.push_back(sText); 149 bCurIsConstant = false; 150 } // endif 151 } 152 153 void 154 PE_TemplateTop::On_expect_separator_Comma( const char *) 155 { 156 SetTokenResult(done, stay); 157 pStati->SetCur(expect_qualifier); 158 } 159 160 void 161 PE_TemplateTop::On_expect_separator_Greater( const char *) 162 { 163 SetTokenResult(done, pop_success); 164 } 165 166 167 168 169 } // namespace cpp 170