/// <summary>Tries to match a pattern against a tree.</summary> /// <remarks> /// Tries to match a pattern against a tree. If it succeeds, apply the surgical operations contained in a /// <see cref="TsurgeonPattern"/> /// . /// </remarks> /// <param name="matchPattern"> /// A /// <see cref="Edu.Stanford.Nlp.Trees.Tregex.TregexPattern"/> /// to be matched against a /// <see cref="Edu.Stanford.Nlp.Trees.Tree"/> /// . /// </param> /// <param name="p"> /// A /// <see cref="TsurgeonPattern"/> /// to apply. /// </param> /// <param name="t"> /// the /// <see cref="Edu.Stanford.Nlp.Trees.Tree"/> /// to match against and perform surgery on. /// </param> /// <returns>t, which has been surgically modified.</returns> public static Tree ProcessPattern(TregexPattern matchPattern, TsurgeonPattern p, Tree t) { TregexMatcher m = matchPattern.Matcher(t); TsurgeonMatcher tsm = p.Matcher(); while (m.Find()) { t = tsm.Evaluate(t, m); if (t == null) { break; } m = matchPattern.Matcher(t); } return(t); }
public virtual void TestAdjoinH() { TsurgeonPattern tsurgeon = Edu.Stanford.Nlp.Trees.Tregex.Tsurgeon.Tsurgeon.ParseOperation("adjoinH (FOO (BAR@)) foo"); TregexPattern tregex = TregexPattern.Compile("B=foo !< BAR"); RunTest(tregex, tsurgeon, "(A (B 1 2))", "(A (B (BAR 1 2)))"); RunTest(tregex, tsurgeon, "(A (C 1 2))", "(A (C 1 2))"); RunTest(tregex, tsurgeon, "(A (B (B 1 2)))", "(A (B (BAR (B (BAR 1 2)))))"); Tree tree = TreeFromString("(A (B 1 2))"); TregexMatcher matcher = tregex.Matcher(tree); NUnit.Framework.Assert.IsTrue(matcher.Find()); NUnit.Framework.Assert.AreEqual("(B 1 2)", matcher.GetNode("foo").ToString()); Tree updated = tsurgeon.Matcher().Evaluate(tree, matcher); NUnit.Framework.Assert.AreEqual("(A (B (BAR 1 2)))", updated.ToString()); NUnit.Framework.Assert.AreEqual("(B (BAR 1 2))", matcher.GetNode("foo").ToString()); NUnit.Framework.Assert.IsFalse(matcher.Find()); }
public virtual void TestAdjoin() { TsurgeonPattern tsurgeon = Edu.Stanford.Nlp.Trees.Tregex.Tsurgeon.Tsurgeon.ParseOperation("adjoin (FOO (BAR@)) foo"); TregexPattern tregex = TregexPattern.Compile("B=foo"); RunTest(tregex, tsurgeon, "(A (B 1 2))", "(A (FOO (BAR 1 2)))"); RunTest(tregex, tsurgeon, "(A (C 1 2))", "(A (C 1 2))"); RunTest(tregex, tsurgeon, "(A (B (B 1 2)))", "(A (FOO (BAR (FOO (BAR 1 2)))))"); Tree tree = TreeFromString("(A (B 1 2))"); TregexMatcher matcher = tregex.Matcher(tree); NUnit.Framework.Assert.IsTrue(matcher.Find()); NUnit.Framework.Assert.AreEqual("(B 1 2)", matcher.GetNode("foo").ToString()); Tree updated = tsurgeon.Matcher().Evaluate(tree, matcher); NUnit.Framework.Assert.AreEqual("(A (FOO (BAR 1 2)))", updated.ToString()); // TODO: do we want the tsurgeon to implicitly update the matched node? // System.err.println(matcher.getNode("foo")); NUnit.Framework.Assert.IsFalse(matcher.Find()); }