using System; using System.IO; using Antlr4.Runtime; using Antlr4.Runtime.Misc; namespace tsql1 { class Program { static void Main(string[] args) { //try //{ string text = System.IO.File.ReadAllText(@"c:\dev\antlr4\grammars-v4-master\tsql\examples\dml_select.sql"); StringReader reader = new StringReader(text); // В качестве входного потока символов устанавливаем ... AntlrInputStream input = new AntlrInputStream(reader); // Настраиваем лексер на этот поток tsqlLexer lexer = new tsqlLexer(input); // Создаем поток токенов на основе лексера CommonTokenStream tokens = new CommonTokenStream(lexer); // Создаем парсер tsqlParser parser = new tsqlParser(tokens); // Specify our entry point //tsqlParser.Query_specificationContext tsqlParser.Tsql_fileContext Tsql_fileContext1 = parser.tsql_file(); Console.WriteLine("Tsql_fileContext1.ChildCount = " + Tsql_fileContext1.ChildCount.ToString()); // Walk it and attach our listener Antlr4.Runtime.Tree.ParseTreeWalker walker = new Antlr4.Runtime.Tree.ParseTreeWalker(); AntlrTsqListener listener = new AntlrTsqListener(); walker.Walk(listener, Tsql_fileContext1); //} // catch (Exception e) //{ // Console.WriteLine(e.Message); //} Console.ReadKey(); } } public class AntlrTsqListener : tsqlBaseListener { private enum JoinMode { Undefined, Where, Join }; private JoinMode mode; private enum BranchType { Select, Table_sources, Search_condition //Join }; private BranchType branch; private string alias = ""; public override void EnterQuery_specification(tsqlParser.Query_specificationContext ctx) { mode = JoinMode.Undefined; } public override void EnterTable_sources(tsqlParser.Table_sourcesContext ctx) { if (ctx.ChildCount > 1) mode = JoinMode.Where; branch = BranchType.Table_sources; } public override void EnterTable_source_item_joined([NotNull] tsqlParser.Table_source_item_joinedContext ctx) { if ((mode == JoinMode.Undefined & ctx.ChildCount == 1) || (mode == JoinMode.Where)) return; mode = JoinMode.Join; branch = BranchType.Table_sources; } public override void EnterTable_name_with_hint([NotNull] tsqlParser.Table_name_with_hintContext ctx) { if (mode == JoinMode.Undefined) return; if (branch == BranchType.Table_sources) Console.WriteLine(branch.ToString()); alias = ""; } public override void EnterTable_name([NotNull] tsqlParser.Table_nameContext ctx) { if (branch == BranchType.Search_condition || branch == BranchType.Select || mode == JoinMode.Undefined) return; Console.WriteLine(ctx.GetText()); } public override void EnterTable_alias([NotNull] tsqlParser.Table_aliasContext ctx) { if (branch == BranchType.Search_condition || branch == BranchType.Select | mode == JoinMode.Undefined) return; alias = ctx.GetChild(0).GetText(); Console.WriteLine("alias=" + alias); } public override void EnterSearch_condition([NotNull] tsqlParser.Search_conditionContext ctx) { if (mode == JoinMode.Undefined) return; branch = BranchType.Search_condition; Console.WriteLine("Search_condition"); Console.WriteLine(ctx.GetText()); return; } public override void EnterSelect_statement([NotNull] tsqlParser.Select_statementContext ctx) { Console.WriteLine("Select_statement"); branch = BranchType.Select; return; }
---
--input
---
select * from t1, t2 where t1.id = t2.id SELECT p.* FROM Production.Product AS p ORDER BY Name ASC; GO select * from zxc as t1 inner join qwe t2 on t1.id = t2.id inner join asd t3 on t3.id = t2.id ...
Tsql_fileContext1.ChildCount = 105
Select_statement
Table_sources
t1
Table_sources
t2
Search_condition
t1.id=t2.id
Select_statement
Select_statement
Table_sources
zxc
alias=t1
Table_sources
qwe
alias=t2
Search_condition
t1.id=t2.id
Table_sources
asd
alias=t3
Search_condition
t3.id=t2.id
...
WBR, alex;
good luck
using System;
using System.IO;
using Antlr4.Runtime;
using Antlr4.Runtime.Misc;
namespace tsql1
{
class Program
{
static void Main(string[] args)
{
try
{
//string text = System.IO.File.ReadAllText(@"c:\dev\antlr4\grammars-v4-master\tsql\examples\dml_select.sql");
//StringReader reader = new StringReader(text);
//// В качестве входного потока символов устанавливаем ...
//AntlrInputStream input = new AntlrInputStream(reader);
// Настраиваем лексер на этот поток
TSqlLexer lexer = new TSqlLexer(new CaseChangingCharStream(new AntlrFileStream(@"c:\dev\antlr4\grammars-v4-master\tsql\examples\dml_select1.sql"), true));//(input);
// Создаем поток токенов на основе лексера
CommonTokenStream tokens = new CommonTokenStream(lexer);
// Создаем парсер
TSqlParser parser = new TSqlParser(tokens);
// Specify our entry point
//TSqlParser.Query_specificationContext
TSqlParser.Tsql_fileContext Tsql_fileContext1 = parser.tsql_file();
Console.WriteLine("Tsql_fileContext1.ChildCount = " + Tsql_fileContext1.ChildCount.ToString());
// Walk it and attach our listener
Antlr4.Runtime.Tree.ParseTreeWalker walker = new Antlr4.Runtime.Tree.ParseTreeWalker();
AntlrTsqListener listener = new AntlrTsqListener();
walker.Walk(listener, Tsql_fileContext1);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
Console.ReadKey();
}
Console.ReadKey();
}
}
public class AntlrTsqListener : TSqlParserBaseListener
{
private enum JoinMode {
Undefined,
Where,
Join
};
private JoinMode mode;
private enum BranchType
{
Select,
Table_sources,
Search_condition
//Join
};
private BranchType branch;
private string alias = "";
public override void EnterQuery_expression(TSqlParser.Query_expressionContext ctx)
{
mode = JoinMode.Undefined;
}
public override void EnterTable_sources(TSqlParser.Table_sourcesContext ctx)
{
if (ctx.ChildCount > 1)
mode = JoinMode.Where;
branch = BranchType.Table_sources;
}
public override void EnterTable_source_item_joined([NotNull] TSqlParser.Table_source_item_joinedContext ctx)
{
//int ii;
//for (ii = 0; ii < ctx.ChildCount; ++ii)
//{
// Console.WriteLine("ii=" + ii.ToString());
// Console.WriteLine(ctx.GetChild(ii).GetType().ToString());
// Console.WriteLine(ctx.GetChild(ii).GetText());
//}
if ((mode == JoinMode.Undefined & ctx.ChildCount == 1) || (mode == JoinMode.Where))
return;
mode = JoinMode.Join;
branch = BranchType.Table_sources;
}
public override void EnterTable_name_with_hint([NotNull] TSqlParser.Table_name_with_hintContext ctx)
{
if (mode == JoinMode.Undefined)
return;
if (branch == BranchType.Table_sources)
Console.WriteLine(branch.ToString());
alias = "";
}
public override void EnterTable_name([NotNull] TSqlParser.Table_nameContext ctx)
{
if (branch == BranchType.Search_condition || branch == BranchType.Select || mode == JoinMode.Undefined)
return;
Console.WriteLine(ctx.GetText());
}
public override void EnterTable_alias([NotNull] TSqlParser.Table_aliasContext ctx)
{
if (branch == BranchType.Search_condition || branch == BranchType.Select || mode == JoinMode.Undefined)
return;
alias = ctx.GetChild(0).GetText();
Console.WriteLine("alias=" + alias);
}
public override void EnterSearch_condition([NotNull] TSqlParser.Search_conditionContext ctx)
{
if (mode == JoinMode.Undefined)
return;
branch = BranchType.Search_condition;
Console.WriteLine("Search_condition");
Console.WriteLine(ctx.GetText());
return;
}
public override void EnterSelect_statement([NotNull] TSqlParser.Select_statementContext ctx)
Hi, I need to parse SQL queries and get information about conditions assign them to a specific columns in specific tables and keep it in some structured way.
Could you give me some example?
Hi, Lukas.
y
error(126): TSqlParser.g4:4026:58: cannot create implicit token for string literal in non-combined grammar: '='
error(126): TSqlParser.g4:4026:64: cannot create implicit token for string literal in non-combined grammar: '!'
error(126): TSqlParser.g4:4026:68: cannot create implicit token for string literal in non-combined grammar: '>'
error(126): TSqlParser.g4:4026:74: cannot create implicit token for string literal in non-combined grammar: '!'
error(126): TSqlParser.g4:4026:78: cannot create implicit token for string literal in non-combined grammar: '<'
error(126): TSqlParser.g4:4030:6: cannot create implicit token for string literal in non-combined grammar: '+='
error(126): TSqlParser.g4:4030:13: cannot create implicit token for string literal in non-combined grammar: '-='
error(126): TSqlParser.g4:4030:20: cannot create implicit token for string literal in non-combined grammar: '*='
error(126): TSqlParser.g4:4030:27: cannot create implicit token for string literal in non-combined grammar: '/='
error(126): TSqlParser.g4:4030:34: cannot create implicit token for string literal in non-combined grammar: '%='
error(126): TSqlParser.g4:4030:41: cannot create implicit token for string literal in non-combined grammar: '&='
error(126): TSqlParser.g4:4030:48: cannot create implicit token for string literal in non-combined grammar: '^='
error(126): TSqlParser.g4:4030:55: cannot create implicit token for string literal in non-combined grammar: '|='
error(126): TSqlParser.g4:4034:35: cannot create implicit token for string literal in non-combined grammar: '%'
...
using System;
using System.IO;
using Antlr4.Runtime;
using Antlr4.Runtime.Misc;
...
I have compiled the TSqlLexer.g4 ok, but when I compile the TSqlParser.g4 I receive the errors like these:error(126): TSqlParser.g4:4026:58: cannot create implicit token for string literal in non-combined grammar: '='
What is wrong?