/// <summary> /// Проверяет два синтаксических дерева на сходство, игнорируя вертикальные "цепочки" и скобки. /// </summary> public static bool Same(this IParseTree tree1, IParseTree tree2) { tree1 = tree1.Collapse(); tree2 = tree2.Collapse(); if (tree1.ChildCount == 0 || tree2.ChildCount == 0) return tree1.GetText() == tree2.GetText(); if (tree1.ChildCount != tree2.ChildCount) return false; for (int i = 0; i < tree1.ChildCount; i++) { if (!tree1.GetChild(i).Same(tree2.GetChild(i))) return false; } return true; }
private bool Match(IParseTree tree, IParseTree localTree) { tree = tree.Collapse(); localTree = localTree.Collapse(); if (localTree.ChildCount == 0) return CompareWrite(localTree.GetText(), tree); if (tree.ChildCount != localTree.ChildCount) return false; for (int i = 0; i < tree.ChildCount; i++) { if (!Match(tree.GetChild(i), localTree.GetChild(i))) return false; } return true; }