163 lines
6.5 KiB
ObjectPascal
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.
|