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

190 lines
6.7 KiB
ObjectPascal

unit dpglib.RuleRefElem;
interface
uses
dpgrtl.types,
dpglib.Types,
dpglib.AlternativeElem;
type
// =========================================================================
// TRuleRefElem class declaration
// =========================================================================
TRuleRefElem = class( TAlternativeElem,
IRuleRefElem,
IAlternativeElem,
IGrammarElem)
// ---------------------------------------------------------------
// Members
// ---------------------------------------------------------------
protected
fTargetRule : AnsiString;
fIdAssign : AnsiString;
fArgs : AnsiString;
fLabel : AnsiString;
// ---------------------------------------------------------------
// Constructor/destructor
// ---------------------------------------------------------------
public
constructor Create( pGrammar : IGrammar;
pToken : IToken;
pAutoGenType: integer);
// ---------------------------------------------------------------
// IGrammarElem overrides
// ---------------------------------------------------------------
public
procedure Generate;
function Look( pK: integer): ILookahead;
function AsString : AnsiString;
// ---------------------------------------------------------------
// IAlternativeElem overrides
// ---------------------------------------------------------------
protected
function GetLabel : AnsiString;
procedure SetLabel( pLabel: AnsiString);
// ---------------------------------------------------------------
// IRuleRefElem methods
// ---------------------------------------------------------------
protected
function GetTargetRule : AnsiString;
function GetIdAssign : AnsiString;
function GetArgs : AnsiString;
procedure SetTargetRule( pTargetRule : AnsiString);
procedure SetIdAssign( pIdAssign : AnsiString);
procedure SetArgs( pArgs : AnsiString);
end;
implementation
uses
dpglib.CodeGenerator,
dpglib.DpgParserTokens;
// ****************************************************************************
// Constructor/destructor
// ****************************************************************************
// ============================================================================
// Constructor
// ============================================================================
constructor TRuleRefElem.Create( pGrammar : IGrammar;
pToken : IToken;
pAutoGenType: integer);
begin
inherited Create( pGrammar, pToken, pAutoGenType);
fTargetRule := pToken.TokenText;
if pToken.TokenType = TT_TOKENREF then
fTargetRule := TCodeGenerator.encodeLexerRuleName( pToken.TokenText)
else
fTargetRule := pToken.TokenText;
end;
// ****************************************************************************
// IGrammarElem overrides
// ****************************************************************************
// ============================================================================
// Generate
// ============================================================================
procedure TRuleRefElem.Generate;
begin
fGrammar.Generator.Gen(self);
end;
// ============================================================================
// Look
// ============================================================================
function TRuleRefElem.Look(pK: integer): ILookahead;
begin
result := fGrammar.LLkAnalyzer.Look( pK, self);
end;
// ============================================================================
// AsString
// ============================================================================
function TRuleRefElem.AsString: AnsiString;
begin
if fArgs <> '' then
result := ' ' + fTargetRule + fArgs
else
result := ' ' + fTargetRule;
end;
// ****************************************************************************
// IAlternativeElem overrides
// ****************************************************************************
// ============================================================================
// GetLabel
// ============================================================================
function TRuleRefElem.GetLabel: AnsiString;
begin
result := fLabel;
end;
// ============================================================================
// SetLabel
// ============================================================================
procedure TRuleRefElem.SetLabel(pLabel: AnsiString);
begin
fLabel := pLabel;
end;
// ****************************************************************************
// IRuleRefElem implementation
// ****************************************************************************
// ============================================================================
// GetTargetRule
// ============================================================================
function TRuleRefElem.GetTargetRule: AnsiString;
begin
result := fTargetRule;
end;
// ============================================================================
// GetIdAssign
// ============================================================================
function TRuleRefElem.GetIdAssign: AnsiString;
begin
result := fIdAssign;
end;
// ============================================================================
// GetArgs
// ============================================================================
function TRuleRefElem.GetArgs: AnsiString;
begin
result := fArgs;
end;
// ============================================================================
// SetTargetRule
// ============================================================================
procedure TRuleRefElem.SetTargetRule(pTargetRule: AnsiString);
begin
fTargetRule := pTargetRule;
end;
// ============================================================================
// SetIdAssign
// ============================================================================
procedure TRuleRefElem.SetIdAssign(pIdAssign: AnsiString);
begin
fIdAssign := pIdAssign;
end;
// ============================================================================
// SetArgs
// ============================================================================
procedure TRuleRefElem.SetArgs(pArgs: AnsiString);
begin
fArgs := pArgs;
end;
end.