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.