我正在研究 ANTLR 中的 SQL 语法,它允许带引号的标识符(表名、字段名等)以及带引号的文字字符串。
问题是这个语法似乎总是将引用的输入匹配为“QUOTED_LITERAL”,而不是作为包含在引号中的 ID。
这是我的结果:
- 输入:'blahblah' 结果:string_literal 符合预期。
- 输入:field1 restul:column_name 符合预期
- 输入:table.field1 结果:column_spec 符合预期
- 输入:'table'.'field1' 结果:string_literal,MissingTokenException
下面是我对 SQL 语法的表达式部分的简化语法,如果有人可以帮助确定匹配引用规则而不是引用文字所需的内容,谢谢。
grammar test;
expression
:
simpleExpression EOF!
;
simpleExpression
:
column_spec
| literal_value
;
column_spec
:
(table_name '.')? column_name
| ('\''table_name '\'''.')? '\'' column_name '\''
| ('\"'table_name '\"' '.')? '\"' column_name '\"'
;
string_literal: QUOTED_LITERAL ;
boolean_literal: 'TRUE' | 'FALSE' ;
literal_value :
(
string_literal
| boolean_literal
)
;
table_name :ID;
column_name :ID;
QUOTED_LITERAL:
( '\''
( ('\\' '\\') | ('\'' '\'') | ('\\' '\'') | ~('\'') )*
'\'' )
|
( '\"'
( ('\\' '\\') | ('\"' '\"') | ('\\' '\"') | ~('\"') )*
'\"' )
;
ID
:
( 'A'..'Z' | 'a'..'z' ) ( 'A'..'Z' | 'a'..'z' | '_' | '0'..'9'| '::' )*
;
WHITE_SPACE : ( ' '|'\r'|'\t'|'\n' ) {$channel=HIDDEN;} ;