using System; using System.Diagnostics; using System.Text; using System.Collections.Generic; using System.Linq; using glue.Extensions.String; using glue.Extensions.Enumerable; using agree; using agree.Parse; using glue.Tokenization; using glue.Collections.XSpinLock; /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// <summary> /// /// </summary> /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// public struct TestEdge : TestChart.IMotherDaughter, IEquatable<TestEdge> { static TestEdge[] rgte_empty = new TestEdge[0]; public TestEdge(TestGrammarRule tgr, String s) { this.tgr = tgr; this.s = s; } public String s; public TestGrammarRule tgr; public override string ToString() { return String.Format("{0}", s); } public IEnumerable<TestEdge> RuleDaughters() { return (tgr != null) ? tgr.RuleDaughters() : rgte_empty; } public TestEdge Self { get { return this; } } public void Dispose() { } public bool Equals(TestEdge other) { return s == other.s; } public bool SpinCompare(TestEdge other) { throw new NotImplementedException(); } }; public interface ICountAddCollection<T> : IEnumerable<T> { int Count { get; } void Add(T t); } /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// <summary> /// /// </summary> /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// [DebuggerDisplay("{ToString(),nq}")] public class TestGrammarRule : ICountAddCollection<TestEdge>, TestChart.IGrammarRule { TestEdge exp; public TestGrammarRule(String p, int i_key_dtr, params String[] _dx) { this.exp = new TestEdge(this, p); this.i_key_dtr = i_key_dtr; this.daughters = _dx.Select(s => new TestEdge(this, s)).ToArray(); } public int i_key_dtr; TestEdge[] daughters; public TestEdge Self { get { return exp; } } public IList<TestEdge> RuleDaughters() { return daughters; } IEnumerable<TestEdge> TestChart.IMotherDaughter.RuleDaughters() { throw new NotImplementedException(); } // FOR C# INITIALIZATION SYNTAX ONLY public void Add(TestEdge t) { daughters = daughters.AsEnumerable<TestEdge>().Append(t).ToArray(); } public int Count { get { return daughters.Length; } } public IEnumerator<TestEdge> GetEnumerator() { return (IEnumerator<TestEdge>)daughters.GetEnumerator(); } System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { return GetEnumerator(); } public override string ToString() { return String.Format("{1} -> {0}", Self, daughters.Select(d => d.ToString()).StringJoin(" ")); } public void Dispose() { } public int KeyDaughterIndex { get { return 0; } } public bool SpinCompare(TestEdge other) { throw new NotImplementedException(); } }; public class TestLexicalAnalysis : TestChart.IParseChartEdge { public Span cs; public TestEdge lex; public Span ChartSpan { get { return cs; } } public TestEdge Self { get { return lex; } } public bool SpinCompare(TestEdge other) { throw new NotImplementedException(); } public string Text { get { throw new NotImplementedException(); } } public void Dispose() { } Span ChartBase<TestEdge>.IParseChartEdge.ChartSpan { get { throw new NotImplementedException(); } } /////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// <summary> /// IAtomicallySequencable(ParseChart.IParseChartToken) implementation /// </summary> /////////////////////////////////////////////////////////////////////////////////////////////////////////////////// int i_seq = unchecked((int)uint.MaxValue); // fix fix public uint SequenceId { get { return (uint)i_seq; } } public void StampSequence(AtomicSequencer ast) { ast.StampLocation(ref i_seq); } public bool SetInert(AtomicSequencer ast) { return ast.SetInert(ref i_seq); } public bool IsInert(AtomicSequencer ast) { return (uint)i_seq == ast.InertValue; } }; public class TestLexicalEntry { String[] words; TestEdge fs; public TestLexicalEntry(String word, TestEdge fs) { this.words = new String[1] { word }; this.fs = fs; } public IList<string> Lemmata { get { return words; } } public TestEdge Self { get { return fs; } } public bool SpinCompare(TestEdge other) { throw new NotImplementedException(); } } partial class Program { static public Random rnd = new Random(); static void Main(string[] args) { new Program().ProgramMain(args); } static TestGrammarRule[] rules1 = new TestGrammarRule[] { new TestGrammarRule("S", -1, "NP", "VP"), new TestGrammarRule("NP", -1, "DET", "N"), new TestGrammarRule("VP", 0, "VT", "NP"), new TestGrammarRule("VP", -1, "VI"), new TestGrammarRule("NP", -1, "N"), new TestGrammarRule("NP-C-MID", -1, "NP","CONJ"), new TestGrammarRule("NP-CONJ", -1,"NP-C-MID","NP"), new TestGrammarRule("NP-CONJ", 1,"NP","NP-CONJ"), new TestGrammarRule("NP", -1,"NP-CONJ"), new TestGrammarRule("NP", -1,"NP","PP"), new TestGrammarRule("VP", 1,"VP","PP"), new TestGrammarRule("PP", -1,"P","NP"), }; static TestGrammarRule[] rules2 = new TestGrammarRule[] { new TestGrammarRule("S", -1,"NP","VP"), new TestGrammarRule("NP", -1,"DET","N"), new TestGrammarRule("VP", 0,"VT","NP"), new TestGrammarRule("VP", -1,"VI"), new TestGrammarRule("NP", -1,"N"), new TestGrammarRule("NP-CONJ", -1,"NP","CONJ","NP"), new TestGrammarRule("NP-CONJ", 1,"NP","NP-CONJ"), new TestGrammarRule("NP", -1,"NP-CONJ"), new TestGrammarRule("NP", -1,"NP","PP"), new TestGrammarRule("VP", 1,"VP","PP"), new TestGrammarRule("PP", -1,"P","NP"), }; static TestGrammarRule[] rules3 = new TestGrammarRule[] { new TestGrammarRule("S", -1,"NP","VP"), new TestGrammarRule("NP", -1,"DET","N"), new TestGrammarRule("VP", 0,"VT","NP"), new TestGrammarRule("VP", -1,"VI"), new TestGrammarRule("NP", -1,"N"), new TestGrammarRule("S", -1,"VP"), }; public static TestEdge[] start_sym = new TestEdge[] { new TestEdge(null, "S") }; static Dictionary<String, String[]> lex = new Dictionary<string, String[]> { { "i", new String[] { "N"} }, { "saw", new String[] { "N","VT"} }, { "that", new String[] { "DET","N"} }, { "man", new String[] { "N","VT","EXCL"} }, { "the", new String[] { "DET"} }, { "hatch", new String[] { "N", "VI"} }, { "and", new String[] { "CONJ"} }, { "pump", new String[] { "N","VI","VT"} }, { "with", new String[] { "P"} }, { "telescope", new String[] { "N"} }, }; public class TestItem { public TestItem(TestGrammarRule[] r, String input, int h) { this.rules = r; this.input = input; this.hash = h; } public TestGrammarRule[] rules; public String input; public int hash; public String[] warr; }; static TestItem[] tests = new TestItem[] { new TestItem(rules1, "I saw that man the hatch and pump with the telescope", 0xF1A75),//0xF19F1), new TestItem(rules2, "I saw that man the hatch and pump with the telescope", 0xE84D5),//0xF0ADD), new TestItem(rules3, "hatch", 0x07DFC), }; };