Exemple #1
0
        PrecedenceNode createPrecedenceNode(TTokenType type)
        {
            var pn = new PrecedenceNode(type);

            precedenceNodes.Add(type, pn);
            return(pn);
        }
Exemple #2
0
 public bool IsChild(PrecedenceNode pn)
 {
     foreach (PrecedenceNode child in Children)
     {
         if (child == pn || child.IsChild(pn))
         {
             return(true);
         }
     }
     return(false);
 }
Exemple #3
0
 public bool IsParent(PrecedenceNode pn)
 {
     foreach (PrecedenceNode parent in Parents)
     {
         if (parent == pn || parent.IsParent(pn))
         {
             return(true);
         }
     }
     return(false);
 }
Exemple #4
0
        public void AddPrecedenceRule(TTokenType firstType, TTokenType secondType)
        {
            var first  = precedenceNodes.ContainsKey(firstType) ? precedenceNodes[firstType] : null;
            var second = precedenceNodes.ContainsKey(secondType) ? precedenceNodes[secondType] : null;

            if (first == null || second == null)
            {
                first  = first ?? createPrecedenceNode(firstType);
                second = second ?? createPrecedenceNode(secondType);
            }
            else
            {
                if (first.IsParent(second))
                {
                    throw new Exception("Conflicting precedence rule detected");
                }
                if (first.IsChild(second))
                {
                    return;
                }
            }
            PrecedenceNode.Connect(first, second);
        }
Exemple #5
0
 public bool IsParentOrChild(PrecedenceNode pn)
 {
     return(IsParent(pn) || IsChild(pn));
 }
Exemple #6
0
 public static void Connect(PrecedenceNode parent, PrecedenceNode child)
 {
     parent.Children.Add(child);
     child.Parents.Add(parent);
 }