Antlr4 不一致的标记化

  • 本文关键字:不一致 Antlr4 antlr4
  • 更新时间 :
  • 英文 :


我正在使用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 查询相同。 我对你的语言不够了解,无法理解你所追求的是什么。

相关内容

  • 没有找到相关文章

最新更新