164 lines
5.8 KiB
ObjectPascal
164 lines
5.8 KiB
ObjectPascal
unit dpglib.CharRangeElem;
|
|
|
|
interface
|
|
uses
|
|
dpgrtl.types,
|
|
dpglib.types,
|
|
dpglib.AlternativeElem;
|
|
|
|
type
|
|
// =========================================================================
|
|
// Class TCharRangeElem declaration
|
|
// =========================================================================
|
|
TCharRangeElem = class( TAlternativeElem,
|
|
ICharRangeElem,
|
|
IAlternativeElem,
|
|
IGrammarElem)
|
|
|
|
// ---------------------------------------------------------------
|
|
// Members
|
|
// ---------------------------------------------------------------
|
|
protected
|
|
fLabel : AnsiString;
|
|
fBegin : AnsiChar;
|
|
fEnd : AnsiChar;
|
|
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);
|
|
|
|
// ---------------------------------------------------------------
|
|
// ICharRangeElem methods
|
|
// ---------------------------------------------------------------
|
|
protected
|
|
function GetBeginChar : AnsiChar;
|
|
function GetEndChar : AnsiChar;
|
|
end;
|
|
|
|
implementation
|
|
|
|
// ****************************************************************************
|
|
// Constructor/destructor
|
|
// ****************************************************************************
|
|
// ============================================================================
|
|
// Constructor
|
|
// ============================================================================
|
|
constructor TCharRangeElem.Create( pGrammar : IGrammar;
|
|
pToken1 : IToken;
|
|
pToken2 : IToken;
|
|
pAutoGenType: integer);
|
|
var
|
|
i: integer;
|
|
|
|
begin
|
|
inherited Create( pGrammar, pToken1);
|
|
|
|
fBegin := pToken1.TokenText[1];
|
|
fEnd := pToken2.TokenText[1];
|
|
|
|
fBeginText := pToken1.TokenText;
|
|
fEndText := pToken2.TokenText;
|
|
|
|
fAutoGenType:= pAutoGenType;
|
|
|
|
// ---------------------------------------------------------------
|
|
// Track which AnsiCharacters are referenced in the grammar.
|
|
// ---------------------------------------------------------------
|
|
for i:=ord( fBegin) to ord( fEnd) do
|
|
; // fGrammar.charVocabulary.add(i)
|
|
end;
|
|
|
|
// ****************************************************************************
|
|
// IGrammarElem ovrrides
|
|
// ****************************************************************************
|
|
// ============================================================================
|
|
// Generate
|
|
// ============================================================================
|
|
procedure TCharRangeElem.Generate;
|
|
begin
|
|
fGrammar.Generator.gen( self);
|
|
end;
|
|
|
|
// ============================================================================
|
|
// Look
|
|
// ============================================================================
|
|
function TCharRangeElem.Look(pK: integer): ILookahead;
|
|
begin
|
|
result := fGrammar.LLkAnalyzer.Look( pK, self);
|
|
end;
|
|
|
|
// ============================================================================
|
|
// AsString
|
|
// ============================================================================
|
|
function TCharRangeElem.AsString: AnsiString;
|
|
begin
|
|
if fLabel <> '' then
|
|
result := ' ' + fLabel + ':' + fBeginText + '..' + fEndText
|
|
else
|
|
result := ' ' + fBeginText + '..' + fEndText;
|
|
end;
|
|
|
|
// ****************************************************************************
|
|
// IAlternativeElem overrides
|
|
// ****************************************************************************
|
|
// ============================================================================
|
|
// GetLabel
|
|
// ============================================================================
|
|
function TCharRangeElem.GetLabel: AnsiString;
|
|
begin
|
|
result := fLabel;
|
|
end;
|
|
|
|
// ============================================================================
|
|
// SetLabel
|
|
// ============================================================================
|
|
procedure TCharRangeElem.SetLabel(pLabel: AnsiString);
|
|
begin
|
|
fLabel := pLabel;
|
|
end;
|
|
|
|
// ****************************************************************************
|
|
// ICharRangeElem implementation
|
|
// ****************************************************************************
|
|
// ============================================================================
|
|
// GetBeginChar
|
|
// ============================================================================
|
|
function TCharRangeElem.GetBeginChar: AnsiChar;
|
|
begin
|
|
result := fBegin;
|
|
end;
|
|
|
|
// ============================================================================
|
|
// GetEndChar
|
|
// ============================================================================
|
|
function TCharRangeElem.GetEndChar: AnsiChar;
|
|
begin
|
|
result := fEnd;
|
|
end;
|
|
|
|
|
|
|
|
end.
|