トークン読み込み用クラス (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"その他";
}
}