Antlr4不一致标记化

Antlr4不一致标记化,antlr4,Antlr4,我正在使用antlr 4解析一种类似SQL的语言 普通的SQL很好用 我还必须支持一个特例,它将这个查询定义为外部处理,因此我只需要复制一些东西 例如: 从a>5的EX.database.table中选择a、b、c 这里唯一重要的部分是EX.database.table-其他所有内容都只是复制 问题在于像SelectaAsAfield这样的东西。Antlr识别为一个标记,并将该行分成几个部分。我想把它列成一整行。我希望ANTLR把这里看作是字符串的一部分,而不是令牌。 这是可以做到的,还是我应该

我正在使用antlr 4解析一种类似SQL的语言

普通的SQL很好用

我还必须支持一个特例,它将这个查询定义为外部处理,因此我只需要复制一些东西

例如: 从a>5的EX.database.table中选择a、b、c

这里唯一重要的部分是EX.database.table-其他所有内容都只是复制

问题在于像SelectaAsAfield这样的东西。Antlr识别为一个标记,并将该行分成几个部分。我想把它列成一整行。我希望ANTLR把这里看作是字符串的一部分,而不是令牌。

这是可以做到的,还是我应该创建另一个语法

这是语法:

    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;

谢谢

假设外部数据源表达式包含关键字AS,我将对外部数据源表达式的真正含义制定更具体的规则。下面的解析器规则应该可以得到任意数量的列,并且可以很好地处理别名。下面大写的规则是lexer规则。我没有定义它们都是什么意思,但我想您可以将它们全部匹配到一个字符串

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查询共享相同的语法,则它们看起来会完全相同。我对你的语言了解不够,无法理解你想要的是什么