Initial check in rtl
This commit is contained in:
@@ -0,0 +1,162 @@
|
||||
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.
|
||||
Reference in New Issue
Block a user