Files
bds.mr.dpg/src.lib/dpglib.TokenRangeElem.pas
T
2026-01-03 18:33:48 +01:00

169 lines
6.2 KiB
ObjectPascal

unit dpglib.TokenRangeElem;
interface
uses
dpgrtl.types,
dpglib.Types,
dpglib.AlternativeElem;
type
// =========================================================================
// Class TTokenRangeElem declaration
// =========================================================================
TTokenRangeElem = class( TAlternativeElem,
ITokenRangeElem,
IAlternativeElem,
IGrammarElem)
// ---------------------------------------------------------------
// Members
// ---------------------------------------------------------------
protected
fLabel : AnsiString;
fBegin : integer;
fEnd : integer;
fBeginText : AnsiString;
fEndText : AnsiString;
// ---------------------------------------------------------------
// Constructor/destructor
// ---------------------------------------------------------------
public
constructor Create( pGrammar : IGrammar;
pToken1 : IToken;
pToken2 : IToken;
pAutoGenType: integer);
// ---------------------------------------------------------------
// IGrammarElem overrides
// ---------------------------------------------------------------
public
procedure Generate;
function Look( pK: integer): ILookahead;
function AsString : AnsiString;
// ---------------------------------------------------------------
// IAlternativeElem overrides
// ---------------------------------------------------------------
protected
function GetLabel : AnsiString;
procedure SetLabel( pLabel: AnsiString);
// ---------------------------------------------------------------
// ITokenRangeElem methods
// ---------------------------------------------------------------
protected
function GetBeginToken : integer;
function GetEndToken : integer;
function GetBeginText : AnsiString;
function GetEndText : AnsiString;
end;
implementation
// ****************************************************************************
// Constructor/destructor
// ****************************************************************************
// ============================================================================
// Constructor
// ============================================================================
constructor TTokenRangeElem.Create( pGrammar : IGrammar;
pToken1 : IToken;
pToken2 : IToken;
pAutoGenType: integer);
begin
inherited Create( pGrammar, pToken1, pAutoGenType);
fBegin := fGrammar.TokenManager.TokenSymbol[pToken1.TokenText].TokenType;
fEnd := fGrammar.TokenManager.TokenSymbol[pToken2.TokenText].TokenType;
fBeginText := pToken1.TokenText;
fEndText := pToken2.TokenText;
end;
// ****************************************************************************
// IGrammarElem overrides
// ****************************************************************************
// ============================================================================
// Generate
// ============================================================================
procedure TTokenRangeElem.Generate;
begin
fGrammar.Generator.Gen( self);
end;
// ============================================================================
// Look
// ============================================================================
function TTokenRangeElem.Look(pK: integer): ILookahead;
begin
result := fGrammar.LLkAnalyzer.Look( pK, self);
end;
// ============================================================================
// AsString
// ============================================================================
function TTokenRangeElem.AsString: AnsiString;
begin
if fLabel <> '' then
result := ' ' + fLabel + ':' + fBeginText + '..' + fEndText
else
result := ' ' + fBeginText + '..' + fEndText;
end;
// ****************************************************************************
// IAlternativeElem overrides
// ****************************************************************************
// ============================================================================
// GetLabel
// ============================================================================
function TTokenRangeElem.GetLabel: AnsiString;
begin
result := fLabel;
end;
// ============================================================================
// SetLabel
// ============================================================================
procedure TTokenRangeElem.SetLabel(pLabel: AnsiString);
begin
fLabel := pLabel;
end;
// ****************************************************************************
// ITokenRangeElem implementation
// ****************************************************************************
// ============================================================================
// GetBeginToken
// ============================================================================
function TTokenRangeElem.GetBeginToken: integer;
begin
result := fBegin;
end;
// ============================================================================
// GetEndToken
// ============================================================================
function TTokenRangeElem.GetEndToken: integer;
begin
result := fEnd;
end;
// ============================================================================
// GetBeginText
// ============================================================================
function TTokenRangeElem.GetBeginText: AnsiString;
begin
result := fBeginText;
end;
// ============================================================================
// GetEndText
// ============================================================================
function TTokenRangeElem.GetEndText: AnsiString;
begin
result := fEndText;
end;
end.