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

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

TokenReaderVB.pas


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

interface
uses
SysUtils, TokenReaderNoCase, TextReader;

type
TTokenReaderVB = class(TTokenReaderNoCase)

protected
function IsComSingle():Boolean;override;
function IsComMulti():Boolean;override;
function IsLiteral():Boolean;override;
function IsDate():Boolean;override;
function IsEscape():Boolean;override;
function IsNumber():Boolean;override;
function IsNotHex():Boolean;override;

procedure getNextStateStrLit();override;
procedure getNextStateIdwEsc();override;
procedure getNextStateDtm();override;

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

implementation
//---------------------------------------------------------------------------------------------------
// 初期化
//---------------------------------------------------------------------------------------------------
constructor TTokenReaderVB.Create(reader:TTextReader; langType:string);
begin
inherited Create(reader, langType);
end;
//---------------------------------------------------------------------------------------------------
// 単一行コメントか?
//---------------------------------------------------------------------------------------------------
function TTokenReaderVB.IsComSingle():Boolean;
begin
result := (_context.currChar = '''');
end;
//---------------------------------------------------------------------------------------------------
// 複数行コメントか?
//---------------------------------------------------------------------------------------------------
function TTokenReaderVB.IsComMulti():Boolean;
begin
result := false;
end;
//---------------------------------------------------------------------------------------------------
// 逐語的文字列か?
//---------------------------------------------------------------------------------------------------
function TTokenReaderVB.IsLiteral():Boolean;
begin
result := (_context.currChar = '"');
end;
//---------------------------------------------------------------------------------------------------
// 日付か?
//---------------------------------------------------------------------------------------------------
function TTokenReaderVB.IsDate():Boolean;
begin
result := false;

if (_context.currChar = '#') then
begin
if ((_context.prevToken <> nil) and (_context.prevToken.tokenKind = '演算子')) then
result := true;
end;
end;
//---------------------------------------------------------------------------------------------------
// エスケープされた識別子か?
//---------------------------------------------------------------------------------------------------
function TTokenReaderVB.IsEscape():Boolean;
begin
result := (_context.currChar = '[');
end;
//---------------------------------------------------------------------------------------------------
// 数字か?
//---------------------------------------------------------------------------------------------------
function TTokenReaderVB.IsNumber():Boolean;
begin
result := false;

if (_context.currChar = '&') then
begin
if (_context.State <> '不明') then
begin
if ((LowerCase(_context.nextChar) = 'o') or (LowerCase(_context.nextChar) = 'h')) then
result := true;
end;
end;

if (IsDigit(_context.currChar)) then result := true;
end;
//---------------------------------------------------------------------------------------------------
// 状態を更新 (逐語的文字列)
//---------------------------------------------------------------------------------------------------
procedure TTokenReaderVB.getNextStateStrLit();
begin
_context.State := '逐語的文字列';
_context.nextToken.tokenKind := '文字列';

if (_context.currChar = '"') then
_context.State := 'その他';
end;
//---------------------------------------------------------------------------------------------------
// 16進表記か?
//---------------------------------------------------------------------------------------------------
function TTokenReaderVB.IsNotHex():Boolean;
begin
result := true;

// &h で始まっていたら、16進
if (Length(_context.currToken.tokenString) > 1) then
if (_context.currToken.tokenString[1] = '&') then
if ((_context.currToken.tokenString[2] = 'h') or (_context.currToken.tokenString[2] = 'H')) then
result := false;
end;
//---------------------------------------------------------------------------------------------------
// 状態を更新 (エスケープされた識別子)
//---------------------------------------------------------------------------------------------------
procedure TTokenReaderVB.getNextStateIdwEsc();
begin
inherited getNextStateIdwEsc();

if (Length(_context.currToken.tokenString) > 1) then
begin
if ((_context.currToken.tokenString[1] = '[') and (_context.currChar = ']')) then
_context.State := 'その他';
end;
end;
//---------------------------------------------------------------------------------------------------
// 状態を更新 (日付)
//---------------------------------------------------------------------------------------------------
procedure TTokenReaderVB.getNextStateDtm();
begin
inherited getNextStateDtm();

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

end.