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

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

TokenReaderCase.pas


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

interface
uses
TokenReaderCommon, TextReader;

type
TTokenReaderCase = class(TTokenReaderCommon)

protected
function IsString(): Boolean; override;
function IsChar(): Boolean; override;
function IsDirective(): Boolean; override;
function getKeyWord(): WideString; override;
procedure getNextStateStr(); override;
procedure getNextStateCha(); override;
procedure getNextStateDir(); override;
public
constructor Create(reader:TTextReader; langType:string);override;
end;

implementation
//---------------------------------------------------------------------------------------------------
// 初期化
//---------------------------------------------------------------------------------------------------
constructor TTokenReaderCase.Create(reader:TTextReader; langType:string);
begin
inherited Create(reader, langType);
end;
//---------------------------------------------------------------------------------------------------
// 文字列か?
//---------------------------------------------------------------------------------------------------
function TTokenReaderCase.IsString():Boolean;
begin
result := (_context.currChar = '"');
end;
//---------------------------------------------------------------------------------------------------
// 文字か?
//---------------------------------------------------------------------------------------------------
function TTokenReaderCase.IsChar():Boolean;
begin
result := (_context.currChar = '''');
end;
//---------------------------------------------------------------------------------------------------
// ディレクティブか?
//---------------------------------------------------------------------------------------------------
function TTokenReaderCase.IsDirective():Boolean;
begin
result := (_context.currChar = '#');
end;
//---------------------------------------------------------------------------------------------------
// 予約語ではないか?
//---------------------------------------------------------------------------------------------------
function TTokenReaderCase.getKeyWord():WideString;
var
i:Integer;
begin
result := '';

//識別子が 予約語であれば、その文字列を返す
i := _keyWords.IndexOf(_context.currToken.tokenString);
if (i >= 0) then
result := _context.currToken.tokenString;
end;
//---------------------------------------------------------------------------------------------------
// 状態を更新 (文字列)
//---------------------------------------------------------------------------------------------------
procedure TTokenReaderCase.getNextStateStr();
begin
inherited getNextStateStr();

if (_context.currChar = '"') then
_context.State := 'その他'

else if (_context.currChar = '\') then
_context.State := '文字列中のエスケープシーケンス';
end;
//---------------------------------------------------------------------------------------------------
// 状態を更新 (文字)
//---------------------------------------------------------------------------------------------------
procedure TTokenReaderCase.getNextStateCha();
begin
inherited getNextStateCha();

if (_context.currChar = '''') then
_context.State := 'その他'

else if (_context.currChar = '\') then
_context.State := '文字中のエスケープシーケンス';
end;
//---------------------------------------------------------------------------------------------------
// 状態を更新 (ディレクティブ)
//---------------------------------------------------------------------------------------------------
procedure TTokenReaderCase.getNextStateDir();
begin
inherited getNextStateDir();

if (_context.currChar = #13) then
_context.State := 'その他'

else if (not IsLetter(_context.currChar)) then
_context.State := '不明';
end;

end.