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.