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.