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

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

TokenReaderCase.h


#pragma once

#include ".\TokenReaderCommon.h"

namespace SourceToHtml
{
using namespace System;
//*******************************************************************************************************
// トークンごとに 文字列と その種類を返す ( 大文字・小文字を意識する 言語用 )
//*******************************************************************************************************
public __gc class TokenReaderCase : public TokenReaderCommon
{
protected:
// 文字列か?
bool IsString();
// 文字か?
bool IsChar();
// ディレクティブか?
bool IsDirective();
// 予約語ではないか?
String* getKeyWord();
// 状態を更新 (文字列)
void getNextStateStr();
// 状態を更新 (文字)
void getNextStateCha();
// 状態を更新 (ディレクティブ)
void getNextStateDir();

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

TokenReaderCase.cpp


#include "StdAfx.h"
#include ".\TokenReaderCase.h"

namespace SourceToHtml
{
//*******************************************************************************************************
// トークンごとに 文字列と その種類を返す ( 大文字・小文字を意識する 言語用 )
//*******************************************************************************************************
//-------------------------------------------------------------------------------------------------------
// 初期化
//-------------------------------------------------------------------------------------------------------
TokenReaderCase::TokenReaderCase(Reader* reader, String* langType):TokenReaderCommon(reader, langType)
{
}
//-------------------------------------------------------------------------------------------------------
// 終了
//-------------------------------------------------------------------------------------------------------
TokenReaderCase::~TokenReaderCase()
{
}
//-------------------------------------------------------------------------------------------------------
// 文字列か?
//-------------------------------------------------------------------------------------------------------
bool TokenReaderCase::IsString()
{
return (_context->currChar == '\"');
}
//-------------------------------------------------------------------------------------------------------
// 文字か?
//-------------------------------------------------------------------------------------------------------
bool TokenReaderCase::IsChar()
{
return (_context->currChar == '\'');
}
//-------------------------------------------------------------------------------------------------------
// ディレクティブか?
//-------------------------------------------------------------------------------------------------------
bool TokenReaderCase::IsDirective()
{
return (_context->currChar == '#');
}
//-------------------------------------------------------------------------------------------------------
// 予約語ではないか?
//-------------------------------------------------------------------------------------------------------
String* TokenReaderCase::getKeyWord()
{
//識別子が 予約語であれば、その文字列を返す
if (_keyWords->Contains(_context->currToken->tokenString))
return _context->currToken->tokenString;

return S"";
}
//-------------------------------------------------------------------------------------------------------
// 状態を更新 (文字列)
//-------------------------------------------------------------------------------------------------------
void TokenReaderCase::getNextStateStr()
{
TokenReaderCommon::getNextStateStr();

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

else if (_context->currChar == '\\')
_context->State = S"文字列中のエスケープシーケンス";
}
//-------------------------------------------------------------------------------------------------------
// 状態を更新 (文字)
//-------------------------------------------------------------------------------------------------------
void TokenReaderCase::getNextStateCha()
{
TokenReaderCommon::getNextStateCha();

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

else if (_context->currChar == '\\')
_context->State = S"文字中のエスケープシーケンス";
}
//-------------------------------------------------------------------------------------------------------
// 状態を更新 (ディレクティブ)
//-------------------------------------------------------------------------------------------------------
void TokenReaderCase::getNextStateDir()
{
TokenReaderCommon::getNextStateDir();

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

else if (!Char::IsLetter(_context->currChar))
_context->State = S"不明";
}
}