public RuleFunction(OutputModelFactory factory, Rule r) : base(factory) { this.name = r.name; this.rule = r; if (r.modifiers != null && r.modifiers.Count > 0) { this.modifiers = new List<string>(); foreach (GrammarAST t in r.modifiers) modifiers.Add(t.Text); } modifiers = Utils.NodesToStrings(r.modifiers); index = r.index; int lfIndex = name.IndexOf(ATNSimulator.RuleVariantDelimiter); if (lfIndex >= 0) { variantOf = name.Substring(0, lfIndex); } if (r.name.Equals(r.GetBaseContext())) { ruleCtx = new StructDecl(factory, r); AddContextGetters(factory, r.g.contextASTs[r.name]); if (r.args != null) { ICollection<Attribute> decls = r.args.attributes.Values; if (decls.Count > 0) { args = new List<AttributeDecl>(); ruleCtx.AddDecls(decls); foreach (Attribute a in decls) { args.Add(new AttributeDecl(factory, a)); } ruleCtx.ctorAttrs = args; } } if (r.retvals != null) { ruleCtx.AddDecls(r.retvals.attributes.Values); } if (r.locals != null) { ruleCtx.AddDecls(r.locals.attributes.Values); } } else { if (r.args != null || r.retvals != null || r.locals != null) { throw new System.NotSupportedException("customized fields are not yet supported for customized context objects"); } } ruleLabels = r.GetElementLabelNames(); tokenLabels = r.GetTokenRefs(); if (r.exceptions != null) { exceptions = new List<ExceptionClause>(); foreach (GrammarAST e in r.exceptions) { ActionAST catchArg = (ActionAST)e.GetChild(0); ActionAST catchAction = (ActionAST)e.GetChild(1); exceptions.Add(new ExceptionClause(factory, catchArg, catchAction)); } } startState = factory.GetGrammar().atn.ruleToStartState[r.index]; }
public virtual string GetRuleFunctionContextStructName(Rule r) { if (r.g.IsLexer()) { return GetTemplates().GetInstanceOf("LexerRuleContext").Render(); } string baseName = r.GetBaseContext(); return Utils.Capitalize(baseName) + GetTemplates().GetInstanceOf("RuleContextNameSuffix").Render(); }