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

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

TokenReaderVB.h


#pragma once

#include ".\TokenReaderNoCase.h"

namespace SourceToHtml
{
using namespace System;
//*******************************************************************************************************
// トークンごとに 文字列と その種類を返す ( VisualBasic用 )
//*******************************************************************************************************
public __gc class TokenReaderVB : public TokenReaderNoCase
{
protected:
// 単一行コメントか?
bool IsComSingle();
// 複数行コメントか?
bool IsComMulti();
// 逐語的文字列か?
bool IsLiteral();
// 日付か?
bool IsDate();
// エスケープされた識別子か?
bool IsEscape();
// 数字か?
bool IsNumber();
// 状態を更新 (逐語的文字列)
void getNextStateStrLit();
// 16進表記か?
bool IsNotHex();
// 状態を更新 (エスケープされた識別子)
void getNextStateIdwEsc();
// 状態を更新 (日付)
void getNextStateDtm();

public:
// 初期化
TokenReaderVB(Reader* reader, String* langType);
// 終了
~TokenReaderVB();
};
}

TokenReaderVB.cpp


#include "StdAfx.h"
#include ".\TokenReaderVB.h"

namespace SourceToHtml
{
//*******************************************************************************************************
// トークンごとに 文字列と その種類を返す ( VisualBasic用 )
//*******************************************************************************************************
//-------------------------------------------------------------------------------------------------------
// 初期化
//-------------------------------------------------------------------------------------------------------
TokenReaderVB::TokenReaderVB(Reader* reader, String* langType):TokenReaderNoCase(reader, langType)
{
}
//-------------------------------------------------------------------------------------------------------
// 終了
//-------------------------------------------------------------------------------------------------------
TokenReaderVB::~TokenReaderVB()
{
}
//-------------------------------------------------------------------------------------------------------
// 単一行コメントか?
//-------------------------------------------------------------------------------------------------------
bool TokenReaderVB::IsComSingle()
{
return (_context->currChar == '\'');
}
//-------------------------------------------------------------------------------------------------------
// 複数行コメントか?
//-------------------------------------------------------------------------------------------------------
bool TokenReaderVB::IsComMulti()
{
return false;
}
//-------------------------------------------------------------------------------------------------------
// 逐語的文字列か?
//-------------------------------------------------------------------------------------------------------
bool TokenReaderVB::IsLiteral()
{
return (_context->currChar == '\"');
}
//-------------------------------------------------------------------------------------------------------
// 日付か?
//-------------------------------------------------------------------------------------------------------
bool TokenReaderVB::IsDate()
{
if (_context->currChar == '#')
{
if ((_context->prevToken != NULL) && (_context->prevToken->tokenKind->Equals(S"演算子")))
return true;
}

return false;
}
//-------------------------------------------------------------------------------------------------------
// エスケープされた識別子か?
//-------------------------------------------------------------------------------------------------------
bool TokenReaderVB::IsEscape()
{
return (_context->currChar == '[');
}
//-------------------------------------------------------------------------------------------------------
// 数字か?
//-------------------------------------------------------------------------------------------------------
bool TokenReaderVB::IsNumber()
{
if (_context->currChar == '&')
{
if (!_context->State->Equals(S"不明"))
{
if ((Char::ToLower(_context->nextChar) == 'o') || (Char::ToLower(_context->nextChar) == 'h'))
return true;
}
}

if (Char::IsDigit(_context->currChar)) return true;

return false;
}
//-------------------------------------------------------------------------------------------------------
// 状態を更新 (逐語的文字列)
//-------------------------------------------------------------------------------------------------------
void TokenReaderVB::getNextStateStrLit()
{
TokenReaderCommon::getNextStateStrLit();

if (_context->currChar == '\"')
_context->State = S"その他";
}
//-------------------------------------------------------------------------------------------------------
// 16進表記か?
//-------------------------------------------------------------------------------------------------------
bool TokenReaderVB::IsNotHex()
{
// &h で始まっていたら、16進
if (_context->currToken->tokenString->Length > 1)
if (_context->currToken->tokenString->Chars[0] == '&')
if ((_context->currToken->tokenString->Chars[1] == 'h') || (_context->currToken->tokenString->Chars[1] == 'H'))
return false;

return true;
}
//-------------------------------------------------------------------------------------------------------
// 状態を更新 (エスケープされた識別子)
//-------------------------------------------------------------------------------------------------------
void TokenReaderVB::getNextStateIdwEsc()
{
TokenReaderNoCase::getNextStateIdwEsc();

if (_context->currToken->tokenString->Length > 1)
{
if ((_context->currToken->tokenString->Chars[0] == '[') && (_context->currChar == ']'))
_context->State = S"その他";
}
}
//-------------------------------------------------------------------------------------------------------
// 状態を更新 (日付)
//-------------------------------------------------------------------------------------------------------
void TokenReaderVB::getNextStateDtm()
{
TokenReaderNoCase::getNextStateDtm();

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