public virtual Grammar.LabelElementPair GetRuleListLabel(string name) { Grammar.LabelElementPair pair = null; if (ruleListLabels != null) { return((Grammar.LabelElementPair)ruleListLabels.get(name)); } return(pair); }
public virtual Grammar.LabelElementPair GetTokenLabel(string name) { Grammar.LabelElementPair pair = null; if (tokenLabels != null) { return((Grammar.LabelElementPair)tokenLabels.get(name)); } return(pair); }
public virtual Grammar.LabelElementPair GetRuleListLabel(string name) { Grammar.LabelElementPair pair = null; if (RuleListLabels != null) { RuleListLabels.TryGetValue(name, out pair); } return(pair); }
public virtual void DefineLabel(IToken label, GrammarAST elementRef, LabelType type) { Grammar.LabelElementPair pair = new Grammar.LabelElementPair(Grammar, label, elementRef); pair.type = type; LabelNameSpace[label.Text] = pair; switch (type) { case LabelType.Token: TokenLabels = TokenLabels ?? new Dictionary <string, Grammar.LabelElementPair>(); TokenLabels[label.Text] = pair; break; case LabelType.WildcardTree: WildcardTreeLabels = WildcardTreeLabels ?? new Dictionary <string, Grammar.LabelElementPair>(); WildcardTreeLabels[label.Text] = pair; break; case LabelType.WildcardTreeList: WildcardTreeListLabels = WildcardTreeListLabels ?? new Dictionary <string, Grammar.LabelElementPair>(); WildcardTreeListLabels[label.Text] = pair; break; case LabelType.Rule: _ruleLabels = _ruleLabels ?? new Dictionary <string, Grammar.LabelElementPair>(); _ruleLabels[label.Text] = pair; break; case LabelType.TokenList: TokenListLabels = TokenListLabels ?? new Dictionary <string, Grammar.LabelElementPair>(); TokenListLabels[label.Text] = pair; break; case LabelType.RuleList: _ruleListLabels = _ruleListLabels ?? new Dictionary <string, Grammar.LabelElementPair>(); _ruleListLabels[label.Text] = pair; break; case LabelType.Char: CharLabels = CharLabels ?? new Dictionary <string, Grammar.LabelElementPair>(); CharLabels[label.Text] = pair; break; case LabelType.CharList: CharListLabels = CharListLabels ?? new Dictionary <string, Grammar.LabelElementPair>(); CharListLabels[label.Text] = pair; break; default: throw new ArgumentException(string.Format("Unexpected label type {0}.", type), "type"); } }
private void HandleAttributeMemberReference(string attribute, string member) { AttributeScope scope = null; string refdRuleName = null; if (attribute.Equals(enclosingRule.Name)) { // ref to enclosing rule. refdRuleName = attribute; scope = enclosingRule.GetLocalAttributeScope(member); } else if (enclosingRule.GetRuleLabel(attribute) != null) { // ref to rule label Grammar.LabelElementPair pair = enclosingRule.GetRuleLabel(attribute); pair.actionReferencesLabel = true; refdRuleName = pair.referencedRuleName; Rule refdRule = grammar.GetRule(refdRuleName); if (refdRule != null) { scope = refdRule.GetLocalAttributeScope(member); } } else if (enclosingRule.GetRuleRefsInAlt(attribute, outerAltNum) != null) { // ref to rule referenced in this alt refdRuleName = attribute; Rule refdRule = grammar.GetRule(refdRuleName); if (refdRule != null) { scope = refdRule.GetLocalAttributeScope(member); } } if (scope != null && (scope.IsPredefinedRuleScope || scope.IsPredefinedLexerRuleScope)) { grammar.ReferenceRuleLabelPredefinedAttribute(refdRuleName); //System.Console.WriteLine("referenceRuleLabelPredefinedAttribute for " + refdRuleName); } }
/** If type of previous label differs from new label's type, that's an error. */ public virtual bool CheckForLabelTypeMismatch(Rule r, IToken label, LabelType type) { Grammar.LabelElementPair prevLabelPair = (Grammar.LabelElementPair)r.labelNameSpace.get(label.Text); if (prevLabelPair != null) { // label already defined; if same type, no problem if (prevLabelPair.type != type) { string typeMismatchExpr = Grammar.LabelTypeToString[(int)type] + "!=" + Grammar.LabelTypeToString[(int)prevLabelPair.type]; ErrorManager.GrammarError( ErrorManager.MSG_LABEL_TYPE_CONFLICT, grammar, label, label.Text, typeMismatchExpr); return(true); } } return(false); }
private void HandleRuleLabelReference(string ruleLabel) { Grammar.LabelElementPair pair = enclosingRule.GetRuleLabel(ruleLabel); pair.actionReferencesLabel = true; }