Files
bds.mr.dpg/src.rtl/dpgrtl.tokenbuffer.pas
T
2026-01-03 18:32:50 +01:00

163 lines
6.5 KiB
ObjectPascal

unit dpgrtl.tokenbuffer;
interface
uses
dpgrtl.types,
dpgrtl.inputbuffer,
dpgrtl.tokenqueue;
type
TTokenBuffer = class( TInputBuffer, IInputBuffer, ITokenBuffer)
protected
fStream : ITokenStream;
fQueue : TTokenQueue;
// ------------------------------------------------------------
// Internals
// ------------------------------------------------------------
protected
function GetNext: IToken; inline;
procedure Fill( Amount: integer);
// ------------------------------------------------------------
// TInputBuffer override
// ------------------------------------------------------------
protected
procedure Remove( Num: integer); override;
// ------------------------------------------------------------
// ITokenBuffer
// ------------------------------------------------------------
protected
function LA(i: integer): integer;
function LT(i: integer): IToken;
public
constructor Create( AStream: ITokenStream);
procedure AfterConstruction; override;
procedure BeforeDestruction; override;
end;
implementation
{ TTokenBuffer }
// @@@: Construction/destruction ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//
// Construction/destruction
//
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// ================================================================================================
// Constructor
// ================================================================================================
constructor TTokenBuffer.Create(AStream: ITokenStream);
begin
inherited Create;
fStream := AStream;
end;
// ================================================================================================
// After Construction
// ================================================================================================
procedure TTokenBuffer.AfterConstruction;
begin
inherited;
fQueue := TTokenQueue.Create
end;
// ================================================================================================
// Before Destruction
// ================================================================================================
procedure TTokenBuffer.BeforeDestruction;
begin
fStream := nil;
fQueue.Free;
inherited
end;
// @@@: ITokenBuffer implementation +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//
// ITokenBuffer implementation
//
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// ================================================================================================
// LA
//
// Ensure that the 'fQueue' object hold sufficient tokens, and gets the 'i'th LookAhead token
// type from the 'fQueue'.
// ================================================================================================
function TTokenBuffer.LA(i: integer): integer;
begin
Fill(i);
result := fQueue.Items[ fMarkerOffset +i -1].TokenType
end;
// ================================================================================================
// LT
// ================================================================================================
function TTokenBuffer.LT(i: integer): IToken;
begin
Fill(i);
result := fQueue.Items[ fMarkerOffset +i -1]
end;
// @@@: Internals +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//
// Internals
//
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// ================================================================================================
// Get Next
// ================================================================================================
function TTokenBuffer.GetNext: IToken;
begin
result := fStream.NextToken
end;
// ================================================================================================
// Fill
// ================================================================================================
procedure TTokenBuffer.Fill(Amount: integer);
begin
SyncConsume;
while fQueue.Count < (Amount +fMarkerOffset) do
fQueue.Add( GetNext);
end;
// @@@: TInputBuffer overrides ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//
// TInputBuffer overrides
//
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// ================================================================================================
// Remove
// ================================================================================================
procedure TTokenBuffer.Remove(Num: integer);
begin
fQueue.Remove(Num)
end;
end.