トークン読み込み用クラス (Delphi用)

これまでC# で作成してきた「SourceToHTML」を、C++Builder に焼きなおしてみます。

TokenReaderDelphi.h


//*******************************************************************************************************
// トークンごとに 文字列と その種類を返す ( Delphi用 )
//*******************************************************************************************************
#ifndef TokenReaderDelphiH
#define TokenReaderDelphiH
//---------------------------------------------------------------------------
#include "TokenReaderNoCase.h"
//---------------------------------------------------------------------------
class TTokenReaderDelphi : public TTokenReaderNoCase
{
protected:
// 複数行コメントか?
bool __fastcall IsComMulti();
// 文字か?
bool __fastcall IsChar();
// ディレクティブか?
bool __fastcall IsDirective();
// 数字か?
bool __fastcall IsNumber();
// 状態を更新 (複数行コメント)
void __fastcall getNextStateComMul();
// 状態を更新 (文字)
void __fastcall getNextStateCha();
// 16進表記か?
bool __fastcall IsNotHex();
// 状態を更新 (ディレクティブ)
void __fastcall getNextStateDir();

public:
// 初期化
__fastcall TTokenReaderDelphi(TTextReader* reader, AnsiString langType);
};
#endif

TokenReaderDelphi.cpp


//*******************************************************************************************************
// トークンごとに 文字列と その種類を返す ( Delphi用 )
//*******************************************************************************************************
#pragma hdrstop
#include <vcl.h>
#include "TokenReaderDelphi.h"
//-------------------------------------------------------------------------------------------------------
#pragma package(smart_init)
//-------------------------------------------------------------------------------------------------------
// 初期化
//-------------------------------------------------------------------------------------------------------
__fastcall TTokenReaderDelphi::TTokenReaderDelphi(TTextReader* reader, AnsiString langType):TTokenReaderNoCase(reader, langType)
{
}
//-------------------------------------------------------------------------------------------------------
// 複数行コメントか?
//-------------------------------------------------------------------------------------------------------
bool __fastcall TTokenReaderDelphi::IsComMulti()
{
if ((_context->currChar == '(') && (_context->nextChar == '*')) return true;
if (_context->currChar == '{') return true;

return false;
}
//-------------------------------------------------------------------------------------------------------
// 文字か?
//-------------------------------------------------------------------------------------------------------
bool __fastcall TTokenReaderDelphi::IsChar()
{
return (_context->currChar == '#');
}
//-------------------------------------------------------------------------------------------------------
// ディレクティブか?
//-------------------------------------------------------------------------------------------------------
bool __fastcall TTokenReaderDelphi::IsDirective()
{
return ((_context->currChar == '{') && (_context->nextChar == '$'));
}
//-------------------------------------------------------------------------------------------------------
// 数字か?
//-------------------------------------------------------------------------------------------------------
bool __fastcall TTokenReaderDelphi::IsNumber()
{
if (_context->currChar == '$') return true;
if (IsDigit(_context->currChar)) return true;

return false;
}
//-------------------------------------------------------------------------------------------------------
// 状態を更新 (複数行コメント)
//-------------------------------------------------------------------------------------------------------
void __fastcall TTokenReaderDelphi::getNextStateComMul()
{
TTokenReaderNoCase::getNextStateComMul();

if (wcslen(_context->currToken->tokenString) > 3)
if ((_context->currToken->tokenString[1] == '(') && (_context->currToken->tokenString[2] == '*'))
if ((_context->prevChar == '*') && (_context->currChar == ')'))
_context->State = "その他";

if (wcslen(_context->currToken->tokenString) > 1)
if ((_context->currToken->tokenString[1] == '{') && (_context->currChar == '}'))
_context->State = "その他";
}
//-------------------------------------------------------------------------------------------------------
// 状態を更新 (文字)
//-------------------------------------------------------------------------------------------------------
void __fastcall TTokenReaderDelphi::getNextStateCha()
{
TTokenReaderNoCase::getNextStateCha();

if (!IsDigit(_context->currChar))
_context->State = "不明";
}
//-------------------------------------------------------------------------------------------------------
// 16進表記か?
//-------------------------------------------------------------------------------------------------------
bool __fastcall TTokenReaderDelphi::IsNotHex()
{
// $ で始まっていたら、16進
if (wcslen(_context->currToken->tokenString) > 1)
if (_context->currToken->tokenString[1] == '$')
return false;

return true;
}
//-------------------------------------------------------------------------------------------------------
// 状態を更新 (ディレクティブ)
//-------------------------------------------------------------------------------------------------------
void __fastcall TTokenReaderDelphi::getNextStateDir()
{
TTokenReaderNoCase::getNextStateDir();

if (_context->currChar == '}')
_context->State = "その他";

}