unit dpglib.StringLiteralElem; interface uses dpgrtl.types, dpglib.types, dpglib.GrammarAtom; type // ========================================================================= // Class TStringLiteralElem declaration // ========================================================================= TStringLiteralElem = class(TGrammarAtom, IStringLiteralElem, IGrammarAtom, IAlternativeElem, IGrammarElem) // --------------------------------------------------------------- // Members // --------------------------------------------------------------- protected fProcessedAtomText : AnsiString; // --------------------------------------------------------------- // Constructor/destructor // --------------------------------------------------------------- public constructor Create( pGrammar : IGrammar; pToken : IToken; pAutoGenType: integer); // --------------------------------------------------------------- // IGrammarElem overrides // --------------------------------------------------------------- public procedure Generate; function Look( pK: integer): ILookahead; // --------------------------------------------------------------- // IStringLiteralElem methods // --------------------------------------------------------------- protected function GetProcessedAtomText: AnsiString; end; implementation // **************************************************************************** // Constructor/destructor // **************************************************************************** // ============================================================================ // Constructor // ============================================================================ constructor TStringLiteralElem.Create( pGrammar : IGrammar; pToken : IToken; pAutoGenType: integer); var lg: ILexerGrammar; ts: ITokenSymbol; begin inherited Create( pGrammar, pToken, pAutoGenType); // --------------------------------------------------------------- // Lexer does not have token types for AnsiString literals // --------------------------------------------------------------- if pGrammar.QueryInterface( ILexerGrammar, lg) <> S_OK then begin ts := fGrammar.TokenManager.TokenSymbol[ fAtomText]; if ts = nil then fGrammar.Tool.Error( 'Undefined literal: ' + String(fAtomText), fGrammar.GrammarFile, pToken.TokenLine, pToken.TokenColumn) else fTokenType := ts.TokenType; end; // --------------------------------------------------------------- // Process the AnsiString literal text by removing quotes and escaping // characters. If a lexical grammar, add the characters to the // char vocabulary. // (Later if I really need it....) // --------------------------------------------------------------- fProcessedAtomText := Copy(fAtomText,2,Length(fAtomText)-2); end; // **************************************************************************** // IGrammarElem overrides // **************************************************************************** // ============================================================================ // Generate // ============================================================================ procedure TStringLiteralElem.Generate; begin fGrammar.Generator.Gen( self); end; // ============================================================================ // Look // ============================================================================ function TStringLiteralElem.Look(pK: integer): ILookahead; begin result := fGrammar.LLkAnalyzer.Look(pK, self); end; // **************************************************************************** // IStringLiteralElem implementation // **************************************************************************** // ============================================================================ // GetProcessedAtomText // ============================================================================ function TStringLiteralElem.GetProcessedAtomText: AnsiString; begin result := fProcessedAtomText; end; end.