示例#1
0
        /// <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());
        }