トークン読み込み用クラス (大文字・小文字を意識しない 言語用)

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

TokenReaderNoCase.h


#pragma once

#include ".\TokenReaderCommon.h"

namespace SourceToHtml
{
using namespace System;
//*******************************************************************************************************
// トークンごとに 文字列と その種類を返す ( 大文字・小文字を意識しない 言語用 )
//*******************************************************************************************************
public __gc class TokenReaderNoCase : public TokenReaderCommon
{
private:
// 予約語 コレクションを設定
void initKeyWordNoCase(String* langType);

protected:
//予約語 コレクション (全て小文字にしたもの)
System::Collections::Specialized::StringCollection* _keyWordsNoCase;
// 逐語的文字列か?
bool IsLiteral();
// 状態を更新 (逐語的文字列)
void getNextStateStrLit();
// 予約語ではないか?
String* getKeyWord();

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

TokenReaderNoCase.cpp


#include "StdAfx.h"
#include ".\TokenReaderNoCase.h"

namespace SourceToHtml
{
//*******************************************************************************************************
// トークンごとに 文字列と その種類を返す ( 大文字・小文字を意識しない 言語用 )
//*******************************************************************************************************
//-------------------------------------------------------------------------------------------------------
// 初期化
//-------------------------------------------------------------------------------------------------------
TokenReaderNoCase::TokenReaderNoCase(Reader* reader, String* langType):TokenReaderCommon(reader, langType)
{
//予約語 コレクションを設定
initKeyWordNoCase(langType);
}
//-------------------------------------------------------------------------------------------------------
// 終了
//-------------------------------------------------------------------------------------------------------
TokenReaderNoCase::~TokenReaderNoCase()
{
}
//-------------------------------------------------------------------------------------------------------
// 予約語 コレクションを設定
//-------------------------------------------------------------------------------------------------------
void TokenReaderNoCase::initKeyWordNoCase(String* langType)
{
//予約語 コレクションを設定 (".\cs7\key.txt")
_keyWordsNoCase = new System::Collections::Specialized::StringCollection();

//予約語ファイルがなければ、予約語コレクションは空っぽ
if (System::IO::File::Exists(String::Concat(System::Windows::Forms::Application::StartupPath, "\\", langType, "\\key.txt")))
{
System::IO::StreamReader* keyReader = new System::IO::StreamReader(String::Concat(System::Windows::Forms::Application::StartupPath, "\\", langType, "\\key.txt"), System::Text::Encoding::GetEncoding("Shift_JIS"));
String* s;
while ((s = keyReader->ReadLine()) != NULL)
{
_keyWordsNoCase->Add(s->ToLower());
}
keyReader->Close();
keyReader = NULL;
}
}
//-------------------------------------------------------------------------------------------------------
// 逐語的文字列か?
//-------------------------------------------------------------------------------------------------------
bool TokenReaderNoCase::IsLiteral()
{
return (_context->currChar == '\'');
}
//-------------------------------------------------------------------------------------------------------
// 状態を更新 (逐語的文字列)
//-------------------------------------------------------------------------------------------------------
void TokenReaderNoCase::getNextStateStrLit()
{
TokenReaderCommon::getNextStateStrLit();

if (_context->currChar == '\'')
_context->State = S"その他";
}
//-------------------------------------------------------------------------------------------------------
// 予約語ではないか?
//-------------------------------------------------------------------------------------------------------
String* TokenReaderNoCase::getKeyWord()
{
//識別子が 予約語であれば、その文字列を返す
int idxKeyWord = _keyWordsNoCase->IndexOf(_context->currToken->tokenString->ToLower());
if (idxKeyWord >= 0)
return _keyWords->Item[idxKeyWord];

return S"";
}
}