コード例 #1
0
 public virtual Grammar.LabelElementPair GetRuleListLabel(string name)
 {
     Grammar.LabelElementPair pair = null;
     if (ruleListLabels != null)
     {
         return((Grammar.LabelElementPair)ruleListLabels.get(name));
     }
     return(pair);
 }
コード例 #2
0
 public virtual Grammar.LabelElementPair GetTokenLabel(string name)
 {
     Grammar.LabelElementPair pair = null;
     if (tokenLabels != null)
     {
         return((Grammar.LabelElementPair)tokenLabels.get(name));
     }
     return(pair);
 }
コード例 #3
0
ファイル: Rule.cs プロジェクト: zhangzhouzhe/antlrcs
        public virtual Grammar.LabelElementPair GetRuleListLabel(string name)
        {
            Grammar.LabelElementPair pair = null;
            if (RuleListLabels != null)
            {
                RuleListLabels.TryGetValue(name, out pair);
            }

            return(pair);
        }
コード例 #4
0
ファイル: Rule.cs プロジェクト: zhangzhouzhe/antlrcs
        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");
            }
        }
コード例 #5
0
        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);
            }
        }
コード例 #6
0
 /** 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);
 }
コード例 #7
0
 private void HandleRuleLabelReference(string ruleLabel)
 {
     Grammar.LabelElementPair pair = enclosingRule.GetRuleLabel(ruleLabel);
     pair.actionReferencesLabel = true;
 }