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.