Antlr4不一致的标记化

时间:2014-12-30 13:12:41

标签: antlr4

我正在使用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;

感谢

1 个答案:

答案 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查询相同。我对你的语言知之甚少,无法理解你所追求的是什么。