使用此lex文件: https://github.com/antlr/grammars-v4/blob/master/mysql/MySQLLexer.g4
当我处理这个陈述时:
String sql = "select x as gorp from FOO ";
我明白了: 第1:12行无关输入' gorp'期待{,'来自','其中','}'}
我查看了上面列出的lex文件,没有AS的定义。
如何使ANTLR lex和语法定义文件与具有" AS"的MySQL SELECT语句一起使用?关键字在哪?
答案 0 :(得分:2)
解析器不知道as
关键字。在mysql中,这可以省略。
该列的解析器定义是:
列名 :((schema_name DOT)?ID DOT)? ID (column_name_alias)? | (table_alias DOT)? ID | USER_VAR(column_name_alias)? ;
所以只需删除“as”关键字。
修复尝试:或者,更改g4文件
在 MySQLLexer.g4 中,追加
AS
: 'as'
;
在 MySQLParser.g4 中,更新列名定义
column_name : ( ( schema_name DOT )? ID DOT )? ID ( ( AS )? column_name_alias )? | ( table_alias DOT )? ID | USER_VAR ( ( AS )? column_name_alias )? ;
理想情况下,表定义也可以有别名
table_atom : ( table_name ( partition_clause )? ( ( AS )? table_alias )? ( index_hint_list )? ) | ( subquery subquery_alias ) | ( LPAREN table_references RPAREN ) | ( OJ table_reference LEFT OUTER JOIN table_reference ON expression ) ;
答案 1 :(得分:2)
语法存储库中的MySQL只是一个非常简单的变体,缺少该语言的许多东西。而是尝试我的ANTLR3语法:https://github.com/mysql/mysql-workbench/tree/master/library/parsers/grammars并将其调整为ANTLR4。这个是100%完成。