我正在使用antlr 4解析类似SQL的语言。
普通SQL工作正常。
我还必须支持一个特殊情况,它将此查询定义为外部处理,因此我只需要复制内容。
例如: SELECT a,b,c FROM EX.database.table WHERE A> 5
这里唯一重要的部分是EX.database.table - 其他所有内容都被复制。
问题在于像SELECT a AS Afield这样的东西。 Antlr将AS识别为令牌并将线路分成几个部分。我希望它作为一个完整的线。我希望antlr在这里将AS视为字符串的一部分而不是令牌。
可以这样做,还是应该创建另一种语法?
这是语法:
select_from_external_statement :
SELECT external_data_source_Expression
FROM exteranl_data_source_definition
(external_data_source_Expression)?
;
external_data_source_Expression: expr;
exteranl_data_source_definition: EX '.' expr '.' expr;
感谢
答案 0 :(得分:1)
假设external_data_source_Expression包含关键字AS,我会对external_data_source_Expression的真正含义做出更具体的规则。下面的解析器规则应该为您提供任意数量的列,并且应该正确处理别名。下面的大写规则是词法分析器规则。我没有定义它们的意思,但我想你可以将它们全部匹配到一个字符串。
select_from_external_statement:
SELECT_KEYWORD external_data_source_Expression FROM_KEYWORD external_data_source_definition ;
external_data_source_definition:
EXTERNAL_SERVER '.' SCHEMA '.' TABLE ;
external_data_source_Expression:
column_with_alias (',' column_with_alias)* ;
column_with_alias:
COLUMN AS_KEYWORD ALIAS ;
SELECT_KEYWORD:
'SELECT' ;
FROM_KEYWORD:
'FROM' ;
AS_KEYWORD:
'AS' ;
我实际上是以不同方式处理它并使用左递归来嵌套查询(假设外部查询是嵌套查询),因此解析器规则调用自身。在这种情况下,如果SQL查询共享相同的语法,则它们看起来与外部SQL查询相同。我对你的语言知之甚少,无法理解你所追求的是什么。