トークン読み込み用クラス (Delphi用)

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

TokenReaderDelphi.pas


//*******************************************************************************************************
// トークンごとに 文字列と その種類を返す (Delphi 用)
//*******************************************************************************************************
unit TokenReaderDelphi;

interface
uses
TokenReaderNoCase, TextReader;

type
TTokenReaderDelphi = class(TTokenReaderNoCase)

protected
function IsComMulti():Boolean;override;
function IsChar():Boolean;override;
function IsDirective():Boolean;override;
function IsNumber():Boolean;override;
function IsNotHex():Boolean;override;

procedure getNextStateComMul();override;
procedure getNextStateCha();override;
procedure getNextStateDir();override;

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

implementation
//---------------------------------------------------------------------------------------------------
// 初期化
//---------------------------------------------------------------------------------------------------
constructor TTokenReaderDelphi.Create(reader:TTextReader; langType:string);
begin
inherited Create(reader, langType);
end;
//---------------------------------------------------------------------------------------------------
// 複数行コメントか?
//---------------------------------------------------------------------------------------------------
function TTokenReaderDelphi.IsComMulti():Boolean;
begin
result := false;

if ((_context.currChar = '(') and (_context.nextChar = '*')) then result := true;
if (_context.currChar = '{') then result := true;
end;
//---------------------------------------------------------------------------------------------------
// 文字か?
//---------------------------------------------------------------------------------------------------
function TTokenReaderDelphi.IsChar():Boolean;
begin
result := (_context.currChar = '#');
end;
//---------------------------------------------------------------------------------------------------
// ディレクティブか?
//---------------------------------------------------------------------------------------------------
function TTokenReaderDelphi.IsDirective():Boolean;
begin
result := ((_context.currChar = '{') and (_context.nextChar = '$'));
end;
//---------------------------------------------------------------------------------------------------
// 数字か?
//---------------------------------------------------------------------------------------------------
function TTokenReaderDelphi.IsNumber():Boolean;
begin
result := false;

if (_context.currChar = '$') then result := true;
if (IsDigit(_context.currChar)) then result := true;
end;
//---------------------------------------------------------------------------------------------------
// 状態を更新 (複数行コメント)
//---------------------------------------------------------------------------------------------------
procedure TTokenReaderDelphi.getNextStateComMul();
begin
inherited getNextStateComMul();

if (Length(_context.currToken.tokenString) > 3) then
if ((_context.currToken.tokenString[1] = '(') and (_context.currToken.tokenString[2] = '*')) then
if ((_context.prevChar = '*') and (_context.currChar = ')')) then
_context.State := 'その他';

if (Length(_context.currToken.tokenString) > 1) then
if ((_context.currToken.tokenString[1] = '{') and (_context.currChar = '}')) then
_context.State := 'その他';
end;
//---------------------------------------------------------------------------------------------------
// 状態を更新 (文字)
//---------------------------------------------------------------------------------------------------
procedure TTokenReaderDelphi.getNextStateCha();
begin
inherited getNextStateCha();

if (not IsDigit(_context.currChar)) then
_context.State := '不明';
end;
//---------------------------------------------------------------------------------------------------
// 16進表記か?
//---------------------------------------------------------------------------------------------------
function TTokenReaderDelphi.IsNotHex():Boolean;
begin
result := true;

// $ で始まっていたら、16進
if (Length(_context.currToken.tokenString) > 1) then
if (_context.currToken.tokenString[1] = '$') then
result := false;
end;
//---------------------------------------------------------------------------------------------------
// 状態を更新 (ディレクティブ)
//---------------------------------------------------------------------------------------------------
procedure TTokenReaderDelphi.getNextStateDir();
begin
inherited getNextStateDir();

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

end;

end.