103 lines
3.5 KiB
ObjectPascal
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.
|