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

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

TokenReaderNoCase.pas


//*******************************************************************************************************
// トークンごとに 文字列と その種類を返す ( 大文字・小文字を意識しない 言語用 )
//*******************************************************************************************************
unit TokenReaderNoCase;

interface
uses
SysUtils, Forms, Classes, TokenReaderCommon, TextReader;

type
TTokenReaderNoCase = class(TTokenReaderCommon)
private
procedure initKeyWordNoCase(langType:string);

protected
function IsLiteral(): Boolean; override;
procedure getNextStateStrLit(); override;
function getKeyWord(): WideString; override;

public
constructor Create(reader:TTextReader; langType:string);override;
end;

implementation
//---------------------------------------------------------------------------------------------------
// 初期化
//---------------------------------------------------------------------------------------------------
constructor TTokenReaderNoCase.Create(reader:TTextReader; langType:string);
begin
inherited Create(reader, langType);

//予約語 コレクションを設定
initKeyWordNoCase(langType);
end;
//---------------------------------------------------------------------------------------------------
// 予約語 コレクションを設定
//---------------------------------------------------------------------------------------------------
procedure TTokenReaderNoCase.initKeyWordNoCase(langType:string);
begin
_keyWords.CaseSensitive := false;
end;
//---------------------------------------------------------------------------------------------------
// 逐語的文字列か?
//---------------------------------------------------------------------------------------------------
function TTokenReaderNoCase.IsLiteral():Boolean;
begin
result := (_context.currChar = '''');
end;
//---------------------------------------------------------------------------------------------------
// 状態を更新 (逐語的文字列)
//---------------------------------------------------------------------------------------------------
procedure TTokenReaderNoCase.getNextStateStrLit();
begin
inherited getNextStateStrLit();

if (_context.currChar = '''') then
_context.State := 'その他';
end;
//---------------------------------------------------------------------------------------------------
// 予約語ではないか?
//---------------------------------------------------------------------------------------------------
function TTokenReaderNoCase.getKeyWord():WideString;
var
idxKeyWord:Integer;
begin
result := '';

//識別子が 予約語であれば、その文字列を返す
idxKeyWord := _keyWords.IndexOf(LowerCase(_context.currToken.tokenString));
if (idxKeyWord >= 0) then
result := _keyWords[idxKeyWord];
end;

end.