18#pragma comment(user,"T-Coverage Disable")
43template<
typename TYP = TCHAR,
typename ITE = const TYP*>
74 return (c ==
' ' || c ==
'\t');
89 case 0:
case '=':
case ' ':
case '\t':
90 case ',':
case 0x0D:
case 0x0A:
case '/':
91 case '*':
case '(':
case ')':
case ']':
92 case '[':
case ':':
case '{':
case '}':
93 case '!':
case '+':
case '-':
case '<':
94 case '>':
case ';':
case '\"':
case '.':
127 case '(': r =
')';
break;
128 case '[': r =
']';
break;
129 case '{': r =
'}';
break;
166 return (c ==
'\"' || c ==
'\"');
278 : m_kind(kind), m_str(s), m_line(l), m_raw(r)
290 : m_kind(kind), m_str(), m_line(l), m_raw(r)
301 : m_kind(other.m_kind), m_str(other.m_str), m_line(other.m_line), m_raw(other.m_raw)
312 m_kind = other.m_kind;
314 m_line = other.m_line;
336 return m_str.IsEqual(lpsz);
355 return (m_str.GetLength() > index) ? m_str[index] :
static_cast<TYP
>(0);
386 case TOKEN: str = _T(
"トークン");
break;
388 case STRING: str = _T(
"文字列");
break;
390 case OPEN_CHAR: str = _T(
"ブロック開始文字");
break;
392 case FINAL: str = _T(
"終わり");
break;
393 default: str = _T(
"エラー");
break;
395 return CStr::Fmt(_T(
"%s : [%s] (%d,%d)"), str,
CStr(m_str), m_line, m_raw);
412 : m_param(is, ie, line), m_pFormat(&m_defaultFormat)
421 : m_param(other.m_param), m_pFormat(other.m_pFormat), m_strName(other.m_strName)
423 if ( other.m_pFormat == &other.m_defaultFormat )
425 m_pFormat = &m_defaultFormat;
436 m_param = other.m_param;
437 m_pFormat = other.m_pFormat;
438 m_strName = other.m_strName;
439 if ( other.m_pFormat == &other.m_defaultFormat )
441 m_pFormat = &m_defaultFormat;
452 m_pFormat = (P == NULL) ? &m_defaultFormat : P;
519 return m_param.strDepth.GetLength();
529 int l = m_param.strDepth.GetLength();
530 return (l > 0) ? m_param.strDepth.GetAt(l - 1) : 0;
554 m_param.strDepth += c;
559 if ( m_param.strDepth.IsEmpty() )
567 m_param.strDepth.DeleteLast();
574 if ( m_GetString(str) < 0 )
590 else if ( boIsToken )
620 if ( m_param.strDepth.IsEmpty() )
624 INT_PTR l = m_param.strDepth.GetLength();
626 if ( m_SkipToNextChar(lc) < 0 )
631 m_param.strDepth.DeleteLast();
658 INT_PTR top = m_param.pos;
659 while ( (m_param.pos - top) < step )
663 return m_param.pos - top;
678 TParam(ITE is = ITE(), ITE ie = ITE(), INT_PTR l = 1) : iteNow(is), iteEnd(ie), pos(0), line(l), raw(0), strDepth()
682 TParam(
const TParam& other)
683 : iteNow(other.iteNow), iteEnd(other.iteEnd), pos(other.pos)
684 , line(other.line), raw(other.raw), strDepth(other.strDepth)
690 iteNow = other.iteNow;
691 iteEnd = other.iteEnd;
695 strDepth = other.strDepth;
701 IFormat m_defaultFormat;
702 const IFormat* m_pFormat;
706 ITE ite(
void){
return m_param.iteNow; }
707 void inc(
void) { m_param.iteNow++; m_param.pos++; m_param.raw++;}
708 void inc(INT_PTR i) { m_param.iteNow += i; m_param.pos += i; m_param.raw += i; }
715 CStepCnt(
const TParam& t) : m_bak(t.pos) {}
716 UINT_PTR rst(
const TParam& t){
return t.pos - m_bak; }
727 if ( ite() != m_param.iteEnd && ! m_pFormat->IsEndChar(*ite()) )
739 INT_PTR m_SkipCr(
void)
741 CStepCnt cnt(m_param);
742 ASSERTLIB( ! m_IsEnd() );
748 if ( *ite() == 0x0A )
754 else if ( c == 0x0A )
760 return cnt.rst(m_param);
790 void m_SkipBlankCharSub(INT_PTR r,
const CStrT<TYP>& str)
799 if ( r > 0 && m_IsEqual(str) )
805 if ( m_SkipCr() > 0 )
812 else if ( m_IsEnd() )
829 INT_PTR m_SkipBlankChar(
void)
831 CStepCnt cnt(m_param);
839 INT_PTR r = m_pFormat->CheckComment(str, ite());
842 m_SkipBlankCharSub(r, str);
844 else if ( m_SkipCr() > 0 )
848 else if ( m_pFormat->IsBlankChar(*ite()) )
857 return cnt.rst(m_param);
868 CStepCnt cnt(m_param);
869 ASSERTLIB( ! m_IsEnd() );
882 if ( m_pFormat->IsTokenPeriodChar(c) )
884 if ( cnt.rst(m_param) == 0 )
896 ASSERT( cnt.rst(m_param) != 0 );
897 return cnt.rst(m_param);
905 INT_PTR m_SkipToken(
void)
908 return m_GetToken(s);
917 INT_PTR m_SkipBlock(
void)
919 CStepCnt cnt(m_param);
920 if ( m_pFormat->IsStringMarkChar(*ite()) )
926 TYP c = m_pFormat->CheckBlockStartChar(*ite());
937 return cnt.rst(m_param);
946 INT_PTR m_SkipToNextChar(TYP cCloseChar)
948 CStepCnt cnt(m_param);
955 TRACE0(
"`('が綴じてません\n");
964 else if ( c == cCloseChar )
968 else if ( m_SkipBlock() > 0 )
977 return cnt.rst(m_param);
990 CStepCnt cnt(m_param);
991 ASSERTLIB( ! m_IsEnd() );
995 if ( ! m_pFormat->IsStringMarkChar(c) )
1020 INT_PTR l = m_pFormat->CheckStringSpecialWord(s, ite());
1032 return r ? cnt.rst(m_param) : -1;
1042 INT_PTR m_SkipString(
void)
1045 return m_GetString(s);
1048 friend class CGrammarAnalyzerTest;
1070#pragma comment(user,"T-Coverage Enable")
#define loop(VAR, CNT)
loop構文.
CParts & operator=(const CParts &other)
コピーコンストラクタ
CParts(const CParts &other)
コピーコンストラクタ
CParts(EPartsKind kind, const CStrT< TYP > &s, INT_PTR l, INT_PTR r)
コンストラクタ
bool IsEqualString(LPCSTR lpsz) const
[比較] 内容比較
CParts(EPartsKind kind, TYP c, INT_PTR l, INT_PTR r)
コンストラクタ
TYP GetAt(INDEX index=0) const
[取得] 内容.
EPartsKind GetKind(void) const
[取得] 種類
INT_PTR GetLine(void) const
[取得] 行番号取得
INT_PTR GetRaw(void) const
[取得] 列番号取得
CStr ToString(void) const
[取得] 文字列化.
const TYP * GetString(void) const
[取得] 内容
CGrammarAnalyzerT & operator=(const CGrammarAnalyzerT &other)
コピーオペレータ
UINT_PTR GetLine(void) const
[取得] 行番号取得
CGrammarAnalyzerT(ITE is=ITE(), ITE ie=ITE(), INT_PTR line=1)
コンストラクタ
INT_PTR GetDepth(void) const
[取得] 深さ取得
ITE GetPointer(void)
[取得] 現在のイテレータ
INT_PTR StepPointer(INT_PTR step)
[処理] ステップ.
UINT_PTR GetRaw(void) const
[取得] 列番号取得
TYP GetBlockChar(void) const
[取得] ブロック文字
CParts GetNextParts(bool boIsToken=true)
[取得] 次のパーツ取得
bool SkipoutBlock(void)
[処理] ブロックからステップアウト.
UINT_PTR GetPos(void) const
[取得] ポジション取得
CStr GetName(void) const
[取得] 名前取得
void SetName(LPCTSTR name)
[設定] 名前設定
CParts PeekNextParts(bool boIsToken=true)
[確認] 次のパーツ確認
CGrammarAnalyzerT(const CGrammarAnalyzerT &other)
コピーコンストラクタ
void SetFormat(const IFormat *P)
[設定] フォーマッタ設定.
size_t GetLength(void) const
[取得] 文字列長
static CStrT Fmt(const TCHAR *lpszFormat,...)
[作成] 書式付き文字列作成
CGrammarAnalyzerT CGrammarAnalyzer
文法解析クラス(ASCII/SJIS)
int GetCharSize(char c)
[取得] 文字のサイズ(ASCII/SJIS用)
TNB::CStrT< TCHAR > CStr
文字列クラス