如何添加" AS"对于MySQL的ANTLR Lex文件的别名支持?

时间:2017-05-28 19:48:42

标签: java mysql antlr

使用此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语句一起使用?关键字在哪?

2 个答案:

答案 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%完成。