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