Java 使用ANTLR4解析mysql的简单示例

Java 使用ANTLR4解析mysql的简单示例,java,mysql,parsing,grammar,antlr4,Java,Mysql,Parsing,Grammar,Antlr4,我在这里使用mysql语法:并使用Maven生成了java文件。现在,我试图解析一个查询,但不知道如何解析 我基本上希望“获取”查询的所有不同组件,如所选列表列、where条件、子查询、表名等,但我不知道如何继续。到目前为止,我已经编写了以下代码。有人能给我举个简单的例子吗?这样我就可以理解它的用法并承担更复杂的任务?这是我的密码: public static void main( String[] args ) { String sql="select cust_name from d

我在这里使用mysql语法:并使用Maven生成了java文件。现在,我试图解析一个查询,但不知道如何解析

我基本上希望“获取”查询的所有不同组件,如所选列表列、where条件、子查询、表名等,但我不知道如何继续。到目前为止,我已经编写了以下代码。有人能给我举个简单的例子吗?这样我就可以理解它的用法并承担更复杂的任务?这是我的密码:

public static void main( String[] args )
{
    String sql="select cust_name from database..table where cust_name like 'Kash%'";
    ANTLRInputStream input = new ANTLRInputStream(sql);
    MySqlLexer mySqlLexer = new MySqlLexer(input);
    CommonTokenStream tokens = new CommonTokenStream(mySqlLexer);
    MySqlParser mySqlParser = new MySqlParser(tokens);

    ParseTree tree = mySqlParser.dmlStatement();
    ParseTreeWalker walker = new ParseTreeWalker();
    MySqlParserBaseListener listener=new MySqlParserBaseListener();
    ParseTreeWalker.DEFAULT.walk(listener, tree);


    System.out.println(?);
}  
使用上述代码,我得到以下输出:

line 1:11 no viable alternative at input '_'
(dmlStatement _ . . _ 'Kash%')
谢谢你的帮助:)

我基本上希望“获取”查询的所有不同组件,如所选列表列、where条件、子查询、表名等

您的
tree
变量保存所有数据:
ParseTree-tree=mySqlParser.dmlStatement()

第1行:11在输入“\u1”处没有可行的替代方案

如果您查看lexer规则:

SELECT:'SELECT';
ID:ID_LITERAL;
片段ID_LITERAL:[A-Z_u$0-9]*?[A-Z_$]+?[A-Z_$0-9]*;
关键字和标识符似乎不能包含小写字母

如果您这样运行它:

String sql=“从客户中选择客户名称,客户名称如‘Kash%””;
MySqlLexer lexer=newmysqllexer(CharStreams.fromString(sql));
MySqlParser=newmysqlparser(newcommontokenstream(lexer));
ParseTree root=parser.dmlStatement();
System.out.println(root.toString树(解析器));
您将看到以下输出(缩进以便于阅读):

(dmlStatement
(选择语句)
(查询规格选择
(选择元素)
(选择元素
(全名)
(uid)
(simpleId CUST_NAME(()()))
从句从句从句从句从句从句从句从句从句从句从句从句从句从句从句从句从句从句从句从句从句从句从句从句从句从句从句
(表资源)
(表源)
(表资源项目
(表名)
(完整)
(uid)
(simpleId客户(()()())())))在哪里
(表情
(谓语)
(谓语)
(表情汤姆
(全名)
(uid)
(simpleId CUST_NAME((())))像
(谓语)
(表情汤姆
(常数
(stringLiteral'Kash%'()()()()())()()

上面的代码给出了这个输出:第1:11行在输入“u”(dmlStatement....“Kash%”处没有可行的替代方案。您为什么不将其包括在原始问题中?对不起。编辑了问题我正在使用javascript实现,您的代码为我提供了未定义的“我没有在代码中使用任何
replace
”的“无法读取属性”replace”。如果您的代码有问题,我建议您创建一个新问题@AlexeySh。该语法非常有缺陷。不要期望它解析所有可能的MySQL输入。