Initial check in lib
This commit is contained in:
@@ -0,0 +1,130 @@
|
||||
// ----------------------------------------------------------------------------
|
||||
// All alternative blocks are "terminated" by BlockEndElements unless theye are
|
||||
// rule blocks (in which case they use RuleEndElement).
|
||||
// ----------------------------------------------------------------------------
|
||||
unit dpglib.BlockEndElem;
|
||||
|
||||
interface
|
||||
uses
|
||||
dpglib.types,
|
||||
dpglib.AlternativeElem;
|
||||
|
||||
type
|
||||
// =========================================================================
|
||||
// Class TBlockEndElem declaration
|
||||
// =========================================================================
|
||||
TBlockEndElem = class( TAlternativeElem,
|
||||
IBlockEndElem,
|
||||
IAlternativeElem,
|
||||
IGrammarElem)
|
||||
|
||||
// ---------------------------------------------------------------
|
||||
// Members
|
||||
// ---------------------------------------------------------------
|
||||
protected
|
||||
fLock : array of boolean;
|
||||
fBlock : IAlternativeBlock;
|
||||
|
||||
// ---------------------------------------------------------------
|
||||
// Constructor/destructor
|
||||
// ---------------------------------------------------------------
|
||||
public
|
||||
constructor Create( pGrammar: IGrammar);
|
||||
destructor Destroy; override;
|
||||
|
||||
// ---------------------------------------------------------------
|
||||
// IGrammarElem overrides
|
||||
// ---------------------------------------------------------------
|
||||
public
|
||||
function Look( pK: integer): ILookahead;
|
||||
function AsString: AnsiString;
|
||||
|
||||
// ---------------------------------------------------------------
|
||||
// IBlockEndElem methods
|
||||
// ---------------------------------------------------------------
|
||||
protected
|
||||
function GetBlock: IAlternativeBlock;
|
||||
function GetLock( i: integer): boolean;
|
||||
|
||||
procedure SetBlock( pBlock: IAlternativeBlock);
|
||||
procedure SetLock( i: integer; pLock: boolean);
|
||||
end;
|
||||
|
||||
|
||||
implementation
|
||||
// ****************************************************************************
|
||||
// Constructor/destructor
|
||||
// ****************************************************************************
|
||||
// ============================================================================
|
||||
// Constructor
|
||||
// ============================================================================
|
||||
constructor TBlockEndElem.Create(pGrammar: IGrammar);
|
||||
begin
|
||||
inherited Create( pGrammar);
|
||||
SetLength( fLock, pGrammar.MaxK + 1);
|
||||
end;
|
||||
|
||||
// ============================================================================
|
||||
// Destructor
|
||||
// ============================================================================
|
||||
destructor TBlockEndElem.Destroy;
|
||||
begin
|
||||
fLock := nil;
|
||||
inherited;
|
||||
end;
|
||||
|
||||
// ****************************************************************************
|
||||
// IGrammarElem overrides
|
||||
// ****************************************************************************
|
||||
// ============================================================================
|
||||
// Look
|
||||
// ============================================================================
|
||||
function TBlockEndElem.Look(pK: integer): ILookahead;
|
||||
begin
|
||||
result := fGrammar.LLkAnalyzer.Look( pK, self);
|
||||
end;
|
||||
|
||||
// ============================================================================
|
||||
// AsString
|
||||
// ============================================================================
|
||||
function TBlockEndElem.AsString: AnsiString;
|
||||
begin
|
||||
result := ' [BlkEnd]';
|
||||
end;
|
||||
|
||||
// ****************************************************************************
|
||||
// IBlockEndElem overrides
|
||||
// ****************************************************************************
|
||||
// ============================================================================
|
||||
// GetBlock
|
||||
// ============================================================================
|
||||
function TBlockEndElem.GetBlock: IAlternativeBlock;
|
||||
begin
|
||||
result := fBlock;
|
||||
end;
|
||||
|
||||
// ============================================================================
|
||||
// GetLock
|
||||
// ============================================================================
|
||||
function TBlockEndElem.GetLock(i: integer): boolean;
|
||||
begin
|
||||
Result := fLock[i];
|
||||
end;
|
||||
|
||||
// ============================================================================
|
||||
// SetBlock
|
||||
// ============================================================================
|
||||
procedure TBlockEndElem.SetBlock(pBlock: IAlternativeBlock);
|
||||
begin
|
||||
fBlock := pBlock;
|
||||
end;
|
||||
|
||||
// ============================================================================
|
||||
// SetLock
|
||||
// ============================================================================
|
||||
procedure TBlockEndElem.SetLock(i: integer; pLock: boolean);
|
||||
begin
|
||||
fLock[i] := pLock;
|
||||
end;
|
||||
|
||||
end.
|
||||
Reference in New Issue
Block a user