در این مرحله تازه مشكل آغاز شده، زیرا متن به درستی تفكیك میشود و برمیگردد اما فكر نكنید كه شما متدی همانند : GetTables, GetColumns, GetJoins دارید، خیر. حال شما باید یك ساختار درختی را تبدیل به ساختار منطقی خود كنید. برای این منظور و درك بهتر میتوانید از ابزار Calitha كه درسایت gold parser لینك دریافت آن وجود دارد استفاده كنید.
درصورتی كه فایلی لازم داشتید و نیافتید لطفا در قیمت نظرات بنویسید تا در همین سایت قرارداده شود.
نمونه استفاده از GoldParser:
private static Grammar m_grammar;
private static void LoadGrammer()
{
using (Stream stream = File.OpenRead(@"C:\Sql 2000 tables.cgt"))
{
BinaryReader reader = new BinaryReader(stream);
m_grammar = new Grammar(reader);
}
}
private static void Log(string message)
{
Console.WriteLine(message);
}
private static bool DoParse()
{
LoadGrammer();
StringReader reader = new StringReader("select col1 , sum(col2) , 'col3' as col4 from Table1 join table2 on(table1.ID = table2.table1.ID)");
Parser parser = new Parser(reader, m_grammar);
parser.TrimReductions = true;
while (true)
{
switch (parser.Parse())
{
case ParseMessage.LexicalError:
Log("LEXICAL ERROR. Line " + parser.LineNumber + ". Cannot recognize token: " + parser.TokenText);
return false;
case ParseMessage.SyntaxError:
StringBuilder text = new StringBuilder();
foreach (Symbol tokenSymbol in parser.GetExpectedTokens())
{
text.Append(' ');
text.Append(tokenSymbol.ToString());
}
Log("SYNTAX ERROR. Line " + parser.LineNumber + ". Expecting:" + text.ToString());
return false;
case ParseMessage.Reduction:
//== Create a new customized object and replace the
//== CurrentReduction with it. This saves memory and allows
//== easier interpretation
//parser.TokenSyntaxNode = m_context.GetSimpleObject();
//parser.TokenSyntaxNode = parser.ReductionRule.Index;
break;
case ParseMessage.Accept:
//=== Success!
//m_program = (SimpleStatement)parser.TokenSyntaxNode;
Log("-- Program Accepted --");
return true;
case ParseMessage.TokenRead:
//=== Make sure that we store token string for needed tokens.
//parser.TokenSyntaxNode = m_context.GetTokenText();
// parser.ReadToken();
break;
case ParseMessage.InternalError:
Log("INTERNAL ERROR! Something is horribly wrong");
return false;
case ParseMessage.NotLoadedError:
//=== Due to the if-statement above, this case statement should never be true
Log("NOT LOADED ERROR! Compiled Grammar Table not loaded");
return false;
case ParseMessage.CommentError:
Log("COMMENT ERROR! Unexpected end of file");
return false;
case ParseMessage.CommentBlockRead:
//=== Do nothing
break;
case ParseMessage.CommentLineRead:
//=== Do nothing
break;
}
}
}