using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using miew.Debugging;
using miew.Enumerable;
using miew.Tokenization;
namespace agree
{
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// <summary>
///
/// </summary>
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public sealed class Submitter
{
readonly Grammar g;
ITokenizer tokenizer;
public Submitter(Config config, Grammar g)
{
this.g = g;
this.tokenizer = null;
ConfigureTokenizer(g.lex);
config.parser.PropertyChanged += new PropertyChangedEventHandler(OnParserConfigChanged);
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public ITokenizer Tokenizer
{
get { return tokenizer; }
set { tokenizer = value; }
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// <summary>
/// </summary>
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public Task<ParseControl> Parse(String s)
{
return Parse(new TokenizedString(s, tokenizer));
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// <summary>
/// In order to use the 'attached to child task' functionality, we start a root task to wrap all parse tasks
/// </summary>
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public Task<ParseControl> Parse(TokenSet tok_set)
{
return new ParseControl(g).Parse(tok_set);
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// <summary>
///
/// </summary>
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void OnParserConfigChanged(object sender, PropertyChangedEventArgs e)
{
switch (e.PropertyName)
{
case "TokenizerType":
ConfigureTokenizer(g.lex);
break;
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// <summary>
///
/// </summary>
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void ConfigureTokenizer(Lexicon lex)
{
System.Type T_tok = this.g.config.parser.TokenizerType;
ConstructorInfo ci;
if (T_tok == null)
{
tokenizer = new SpaceCharTokenizer();
}
else if (T_tok.GetConstructor(new System.Type[0]) != null)
{
tokenizer = (ITokenizer)Activator.CreateInstance(T_tok);
}
else if ((ci = T_tok.GetConstructor(new System.Type[] { typeof(Func<String, bool>) })) != null)
{
Func<String, bool> af = w => lex[w].Any(q => q.Lemmata.Count == 1);
tokenizer = (ITokenizer)ci.Invoke(new Object[] { af });
}
else
{
throw new Exception(String.Format("Could not determine how to construct the tokenizer '{0}'", T_tok.Name));
}
}
};
}