Files
bds.mr.dpg/src.lib/dpglib.StringLiteralElem.pas
T
2026-01-03 18:33:48 +01:00

121 lines
4.6 KiB
ObjectPascal

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.