const string sqlStatement = @"select * from MyTable where MyColumn = hello";
string gr = Encoding.UTF8.GetString(Resources.grammar);
var ebnfGrammar = new Eto.Parse.Grammars.EbnfGrammar(EbnfStyle.W3c | EbnfStyle.SquareBracketAsOptional | EbnfStyle.WhitespaceSeparator);
var Grammar = ebnfGrammar.Build(gr, "command");
var match = Grammar.Match(sqlStatement);update_command ::=
(""UPDATE""|""update"")
(character_set)+
(""SET""|""set"")
(character_set)+
""=""
(character_set)+
[(""WHERE""|""where"") condition]table_name ::= (character_set)+
column_name ::= (character_set)+
update_value ::= (character_set)+
update_command ::=
(""UPDATE""|""update"")
table_name
(""SET""|""set"")
column_name
""=""
update_value
[(""WHERE""|""where"") condition]
using System;
using System.Reflection;
using Eto.Parse;
namespace etosql
{
public class SyntaxTree
{
public static object Build(Match m)
{
foreach (var mm in m.Matches)
{
foreach (var mmm in mm.Matches)
{
foreach (var type in Assembly.GetEntryAssembly().GetTypes())
{
if (type.BaseType != null) {
if (type.BaseType.Name == typeof(IAst).Name)
{
var obj = (IAst)Activator.CreateInstance(type);
if (obj.Name == mm.Name)
{
var props = type.GetProperties();
for (int i = 0; i < props.Length; i++)
{
if (props[i].PropertyType.BaseType.Name == typeof(IAst).Name)
{
props[i].SetValue(obj, SyntaxTree.Build(mm), null);
continue;
}
else if (props[i].Name == mmm.Name)
{
props[i].SetValue(obj, mmm.StringValue, null);
}
}
return obj;
}
}
}
}
}
}
return null;
}
}
}Code hier eingeben...