121 lines
4.6 KiB
ObjectPascal
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.
|