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

103 lines
3.5 KiB
ObjectPascal

unit dpglib.TokenRefElem;
interface
uses
dpgrtl.types,
dpglib.Types,
dpglib.GrammarAtom;
type
// =========================================================================
// Class TTokenRefElem declaration
// =========================================================================
TTokenRefElem = class( TGrammarAtom,
ITokenRefElem,
IGrammarAtom,
IAlternativeElem,
IGrammarElem)
// ---------------------------------------------------------------
// Constructor/destructor
// ---------------------------------------------------------------
public
constructor Create( pGrammar : IGrammar;
pToken : IToken;
pInverted : boolean;
pAutoGenType: integer);
// ---------------------------------------------------------------
// IGrammarElem overrides
// ---------------------------------------------------------------
public
procedure Generate;
function Look( pK: integer): ILookahead;
end;
implementation
// ****************************************************************************
// Constructor/destructor
// ****************************************************************************
// ============================================================================
// Constructor
// ============================================================================
constructor TTokenRefElem.Create( pGrammar : IGrammar;
pToken : IToken;
pInverted : boolean;
pAutoGenType: integer);
var
ts: ITokenSymbol;
begin
inherited Create( pGrammar, pToken, pAutoGenType);
fNot := pInverted;
ts := fGrammar.TokenManager.TokenSymbol[fAtomText];
if ts <> nil then
begin
fTokenType := ts.TokenType;
// ------------------------------------------------------------
// Set the AST node type to whatever was set in tokens {...}
// section (if anything).
// After this is create, the element option can set this.
// ------------------------------------------------------------
SetASTNodeType( ts.ASTNodeType);
end
else
begin
fGrammar.Tool.Error( 'Undefined token symbol: ' + String(fAtomText),
fGrammar.GrammarFile,
pToken.TokenLine,
pToken.TokenColumn);
end;
end;
// ****************************************************************************
// IGrammarElem overrides
// ****************************************************************************
// ============================================================================
// Generate
// ============================================================================
procedure TTokenRefElem.Generate;
var
_self: ITokenRefElem;
begin
_self := self;
fGrammar.Generator.Gen(_self);
// fGrammar.Generator.Gen(self as ITokenRefElem);
end;
// ============================================================================
// Look
// ============================================================================
function TTokenRefElem.Look(pK: integer): ILookahead;
begin
result := fGrammar.LLkAnalyzer.Look( pK, self);
end;
end.