TNB Library
TnbTmlDocuments.h
[詳解]
1#pragma once
13#include "TnbTmlValue.h"
14#include "TnbTmlCalculator.h"
15#include "TnbTmlResult.h"
16#include "TnbStrVector.h"
17
18
19
20//TNB Library
21namespace TNB
22{
23
24
25
39{
40public:
41
46 struct TFileInfo
47 {
49 struct TFunc
50 {
53 INT_PTR iOffset;
54 INT_PTR iLine;
56 TFunc(void) : iOffset(0), iLine(0){}
58 TFunc(const TFunc& other)
60 {
61 }
63 TFunc& operator=(const TFunc& other)
64 {
67 iOffset = other.iOffset;
68 iLine = other.iLine;
69 return *this;
70 }
71 };
76 TFileInfo(void) {}
78 TFileInfo(const TFileInfo& other) : strName(other.strName), abContents(other.abContents), atFunc(other.atFunc)
79 {
80 }
83 {
84 strName = other.strName;
85 abContents = other.abContents;
86 atFunc = other.atFunc;
87 return *this;
88 }
89 };
90
91
94 {
95 }
96
98 void Empty(void)
99 {
100 m_aaFileInfo.RemoveAll();
101 TTRACE0( "TML::CDocuments::初期化\n" );
102 }
103
108 INT_PTR GetLevel(void) const
109 {
110 return m_aaFileInfo.GetSize();
111 }
112
117 {
120 INT_PTR iFuncLine;
124 {
125 }
131 bool HasData(void) const
132 {
133 return lpszFuncAdds != NULL;
134 }
135 };
136
143 TFuncInfoRes FindFunc(LPCSTR lpszFunc) const
144 {
145 INT_PTR iDim1 = m_aaFileInfo.GetSize();
146 for( INT_PTR i = iDim1 - 1; i >= 0; i-- )
147 {
148 const CFileInfoArray& fiv = m_aaFileInfo.At(i);
149 INT_PTR iDim2 = fiv.GetSize();
150 for( INT_PTR j = 0; j < iDim2; j++ )
151 {
152 const TFileInfo& T = fiv.At(j);
153 INT_PTR iDimF = T.atFunc.GetSize();
154 for( INT_PTR f = 0; f < iDimF; f++ )
155 {
156 const TFileInfo::TFunc& X = T.atFunc[f];
157 if ( X.strFuncName.Compare(lpszFunc) == 0 )
158 {
159 //あった
160 TFuncInfoRes t;
161 t.strFileName = T.strName;
163 t.lpszFuncAdds += X.iOffset;
164 t.iFuncLine = X.iLine;
166 return t;
167 }
168 }
169 }
170 }
171 TFuncInfoRes t;
172 return t;
173 }
174
182 const TFileInfo* FindFileName(LPCSTR lpszFile) const
183 {
184 INT_PTR iDim1 = m_aaFileInfo.GetSize();
185 for( INT_PTR i = 0; i < iDim1; i++ )
186 {
187 const CFileInfoArray& fiv = m_aaFileInfo.At(i);
188 INT_PTR iDim2 = fiv.GetSize();
189 for( INT_PTR j = 0; j < iDim2; j++ )
190 {
191 const TFileInfo &T = fiv.At(j);
192 if ( T.strName.Compare(lpszFile) == 0 )
193 {
194 return &T;
195 }
196 }
197 }
198 return NULL;
199 }
200
204 void IncLevel(void)
205 {
207 m_aaFileInfo.Add(A);
208 TTRACE1( "TML::CDocuments::レベル++ NowLvl=%d\n", GetLevel() );
209 }
210
216 bool DecLevel(void)
217 {
218 INT_PTR l = m_aaFileInfo.GetSize();
219 if ( l <= 0 )
220 {
221 return false;
222 }
223 //
224 m_aaFileInfo.SetSize( l - 1 );
225 TTRACE1( "TML::CDocuments::レベル-- NowLvl=%d\n", GetLevel() );
226 return true;
227 }
228
236 bool DecLevels(INT_PTR level)
237 {
238 while( level < GetLevel() )
239 {
240 if ( ! DecLevel() )
241 {
242 return false;
243 }
244 }
245 return true;
246 }
247
256 CTmlResult Add(TFuncInfoRes& _tFuncInfo, LPCSTR lpszName, LPCSTR lpszData)
257 {
258 size_t l = m_aaFileInfo.GetSize();
259 if ( l == 0 )
260 {
261 //マクロコンテンツレベルが異常です。
263 return r;
264 }
265 if ( FindFileName(lpszName) != NULL )
266 {
267 //既に登録されている(二回同じインクルードファイル指定自体はエラーではない)。
268 TTRACE1( "[%s]は既に登録されています。\n", lpszName );
269 return Result_Nop;
270 }
271 // 情報構築
272 TFileInfo tFileInfo;
273 tFileInfo.strName = lpszName;
274 tFileInfo.abContents = lpszData;
275 //内容チェック
276 CTmlResult r = m_AnalyzeFile(tFileInfo);
277 if ( r.IsError() )
278 {
279 return r;
280 }
281 CFileInfoArray &A = m_aaFileInfo.Ref(l - 1);
282 A.Add(tFileInfo);
283 _tFuncInfo.strFileName = lpszName;
284 _tFuncInfo.lpszFuncAdds = tFileInfo.abContents;
285 _tFuncInfo.iFuncLine = 1;
286 _tFuncInfo.pastrParamNames = NULL;
287 return Result_Success;
288 }
289
290private:
291 typedef CVectorT<TFileInfo> CFileInfoArray;
292 typedef CVectorT<CFileInfoArray> CFileInfoArrays;
293 CFileInfoArrays m_aaFileInfo;
294
300 CTmlResult m_AnalyzeFile(TFileInfo& _tFileInfo)
301 {
302 CTmlResult res;
303 CTmlGrammar gram(_tFileInfo.abContents.begin(), _tFileInfo.abContents.end(), 1);
304 CStr strToken;
306 //
307 while(true)
308 {
309 parts = gram.GetNextParts();
310 if ( parts.GetKind() == CTmlGrammar::FINAL )
311 {
312 break;// 終わり
313 }
314 if ( parts.GetKind() == CTmlGrammar::ERROR_DEPTH )
315 {
316 res = Result_InvalidParenthesesPosition;// 括弧エラー
317 break;
318 }
319 if ( parts.GetKind() == CTmlGrammar::OPEN_CHAR )
320 {
321 if ( ! gram.SkipoutBlock() )
322 {
323 res = Result_NotCloseParentheses;//閉じてない
324 break;
325 }
326 continue;
327 }
328 if ( parts.GetKind() == CTmlGrammar::STRING )
329 {
330 continue;
331 }
332 if ( parts.GetKind() == CTmlGrammar::CLOSE_CHAR )
333 {
334 ASSERTLIB( false );
335 }
336 CAscii s = parts.GetString();
337 if ( s == ";" )
338 {
339 continue;
340 }
341 if ( s == "}" )
342 {
343 //突然閉じた
344 ASSERTLIB( false );
345 continue;
346 }
347 if ( s.Compare("func") != 0 )
348 {
349 continue;
350 }
351 //
352 parts = gram.GetNextParts();
353 if ( parts.GetKind() != CTmlGrammar::TOKEN )
354 {
355 res = Result_NotName;
356 break;
357 }
358 CAscii funcName = parts.GetString();
359 parts = gram.GetNextParts();
360 if ( parts.GetAt() != '(' )
361 {
362 res = Result_NotFoundParentheses;//関数名の後に ( がない
363 break;
364 }
365 //
366 TFileInfo::TFunc tFunc;
367 tFunc.strFuncName = funcName;
368 while(true)
369 {
370 parts = gram.PeekNextParts();
371 if ( parts.GetKind() != CTmlGrammar::TOKEN )
372 {
373 break;
374 }
375 gram.GetNextParts();
376 CAscii s = parts.GetString();
377 tFunc.strParamNames.Add(s);
378 parts = gram.PeekNextParts();
379 if ( parts.GetAt() != ',' )
380 {
381 break;
382 }
383 gram.GetNextParts();
384 }
385 if ( ! gram.SkipoutBlock() )
386 {
387 res = Result_NotCloseParentheses;//閉じてない
388 break;
389 }
390 parts = gram.GetNextParts();
391 if ( parts.GetAt() != '{' )
392 {
393 res = Result_NotFoundParentheses;// { がない
394 break;
395 }
396 tFunc.iOffset = gram.GetPos();
397 tFunc.iLine = gram.GetLine();
398 if ( ! gram.SkipoutBlock() )
399 {
400 res = Result_NotCloseParentheses;//閉じてない
401 break;
402 }
403 _tFileInfo.atFunc.Add(tFunc);
404 }
405 if ( res.IsError() )
406 {
408 r.SetLine(_tFileInfo.strName, parts.GetLine());
409 res = r;
410 }
411 return res;
412 }
413
414 friend class CTmlDocumentsTest;
415};
416
417
418
419}; // TNB
文字列情報配列管理関係のヘッダ
TinyMacroLang 計算関係のヘッダ
TinyMacroLang 結果関係のヘッダ
TinyMacroLang 値関係のヘッダ
[ETC] コピー不可能スーパークラス.
Definition: TnbDef.h:599
文法解析用パーツ管理クラス
TYP GetAt(INDEX index=0) const
[取得] 内容.
EPartsKind GetKind(void) const
[取得] 種類
INT_PTR GetLine(void) const
[取得] 行番号取得
const TYP * GetString(void) const
[取得] 内容
文法解析テンプレート
@ ERROR_DEPTH
深さエラー
@ OPEN_CHAR
ブロック開始文字
@ CLOSE_CHAR
ブロック終端文字
int Compare(const TYP *lpszSubject) const
[確認] 文字列比較
Definition: TnbStr.h:658
const_iterator begin(void) const
[反復] 先頭const_iterator.
Definition: TnbStr.h:89
TinyMacroLang ドキュメント管理
CTmlResult Add(TFuncInfoRes &_tFuncInfo, LPCSTR lpszName, LPCSTR lpszData)
[追加] ファイル情報追加.
CTmlDocuments(void)
コンストラクタ
bool DecLevel(void)
[操作] レベル−1
void IncLevel(void)
[操作] レベル+1
const TFileInfo * FindFileName(LPCSTR lpszFile) const
[検索] ファイル検索.
void Empty(void)
Empty
INT_PTR GetLevel(void) const
[取得] 現在レベル取得
bool DecLevels(INT_PTR level)
[設定] レベル指定.
TFuncInfoRes FindFunc(LPCSTR lpszFunc) const
[検索] 関数検索.
TinyMacroLang 結果状態管理
Definition: TnbTmlResult.h:133
EResult GetResult(void) const
[取得] リザルトコード取得.
Definition: TnbTmlResult.h:334
bool IsError(void) const
[確認] ERROR 確認.
Definition: TnbTmlResult.h:254
TinyMacroLang コード管理
Definition: TnbTmlResult.h:48
@ Operation_FindingFunc
関数検索中
Definition: TnbTmlResult.h:81
@ Operation_Non
未定義
Definition: TnbTmlResult.h:73
@ Scene_Func
func文処理中
Definition: TnbTmlResult.h:57
@ Result_Nop
処理なし
Definition: TnbTmlResult.h:89
@ Result_InvalidMacroContentsLevel
マクロコンテンツレベルが異常です
Definition: TnbTmlResult.h:106
@ Result_Success
成功
Definition: TnbTmlResult.h:88
@ Result_NotName
名前がありません
Definition: TnbTmlResult.h:100
@ Result_InvalidParenthesesPosition
括弧の位置がおかしい
Definition: TnbTmlResult.h:95
@ Result_NotFoundParentheses
括弧が必要なところにない
Definition: TnbTmlResult.h:93
@ Result_NotCloseParentheses
括弧が閉じていない
Definition: TnbTmlResult.h:94
virtual size_t GetSize(void) const
[取得] サイズ取得
Definition: TnbVector.h:368
virtual const TYP & At(INDEX index) const
[取得] 要素の参照取得.
Definition: TnbVector.h:233
virtual bool SetSize(size_t size)
[操作] サイズ指定
Definition: TnbVector.h:618
virtual TYP & Ref(INDEX index)
[取得] 要素の参照取得.
Definition: TnbVector.h:246
virtual bool RemoveAll(void)
[削除] 空化
Definition: TnbVector.h:565
virtual INDEX Add(const TYP &t)
[追加] 要素一つ追加.
Definition: TnbVector.h:383
TNB Library
Definition: TnbDoxyTitle.txt:2
INT_PTR iLine
関数開始のLine({の次の位置を指している)
INT_PTR iOffset
関数開始のOffset({の次の位置を指している)
TFunc(void)
コンストラクタ
TFunc(const TFunc &other)
コピーコンストラクタ
TFunc & operator=(const TFunc &other)
コピーオペレータ
CAscii abContents
ファイル内容+NULL終端
TFileInfo(void)
コンストラクタ
CVectorT< TFunc > atFunc
関数情報
TFileInfo(const TFileInfo &other)
コピーコンストラクタ
CAscii strName
includeしたファイル名
TFileInfo & operator=(const TFileInfo &other)
コピーオペレータ
TinyMacroLang 検索結果管理
LPCSTR lpszFuncAdds
関数のあるアドレス(関数の頭の { の直後)
INT_PTR iFuncLine
関数のあるファイ行
TFuncInfoRes(void)
コンストラクタ
CAscii strFileName
ファイル名
const CAsciiVector * pastrParamNames
関数の引数名(Arrayの参照)
bool HasData(void) const
[確認] データを持っているか?