PrecedenceNode createPrecedenceNode(TTokenType type) { var pn = new PrecedenceNode(type); precedenceNodes.Add(type, pn); return(pn); }
public bool IsChild(PrecedenceNode pn) { foreach (PrecedenceNode child in Children) { if (child == pn || child.IsChild(pn)) { return(true); } } return(false); }
public bool IsParent(PrecedenceNode pn) { foreach (PrecedenceNode parent in Parents) { if (parent == pn || parent.IsParent(pn)) { return(true); } } return(false); }
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); }
public bool IsParentOrChild(PrecedenceNode pn) { return(IsParent(pn) || IsChild(pn)); }
public static void Connect(PrecedenceNode parent, PrecedenceNode child) { parent.Children.Add(child); child.Parents.Add(parent); }