私は、引用された識別子 (テーブル名、フィールド名など) と引用されたリテラル文字列を許可する ANTLR の SQL 文法に取り組んでいます。
問題は、この文法が引用符で囲まれた入力を常に "QUOTED_LITERAL" として一致させ、ID を引用符で囲んだものとして一致させないように見えることです。
ここに私の結果があります:
- 入力: 'blahblah' 結果: 期待どおりの string_literal。
- 入力: フィールド 1 の結果: 期待どおりの 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;} ;