169 lines
6.2 KiB
ObjectPascal
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.
|