我正在使用antlr 4解析类似SQL的语言。
普通SQL工作正常。
我还必须支持一种特殊情况,该情况将此查询定义为外部处理,因此我只需要复制东西。
例如:从 EX.database.TABLE 中选择 a,b,c 其中 A> 5
这里唯一重要的部分是EX.database.table - 其他所有内容都只是复制的。
问题在于像选择AS这样的东西。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;
谢谢
假设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 查询相同。 我对你的语言不够了解,无法理解你所追求的是什么。