【发布时间】:2016-02-09 23:14:12
【问题描述】:
我试图让一些 sql 关键字在用作标识符时被接受为标识符。 Antlr book p210 提出了这个技巧:
id : 'if' | 'call' | 'then' | ID ;
我有类似的东西,但它不起作用,我认为这是我的误解。
regular_ident 是标识符的解析规则,因此:
regular_ident : // (1)
KEYWORD_AS_IDENT
|
REGULAR_IDENT
;
REGULAR_IDENT 是 idents 的主要 lex 规则。大致是这样的(这里简化了),并且有效:
REGULAR_IDENT :
[a-zA-Z] ( [a-zA-Z0-9] * )
;
KEYWORD_AS_IDENT 是特殊词列表,摘录如下:
KEYWORD_AS_IDENT : // (2)
[...snip...]
| FILESTREAM
| SPARSE
| NO
| ACTION
| PERSISTED
| FILETABLE_DIRECTORY
| FILETABLE_COLLATE_FILENAME
| FILETABLE_PRIMARY_KEY_CONSTRAINT_NAME
| FILETABLE_STREAMID_UNIQUE_CONSTRAINT_NAME
| FILETABLE_FULLPATH_UNIQUE_CONSTRAINT_NAME
| COLUMN_SET
| ALL_SPARSE_COLUMNS
;
组件在别处定义:
SPARSE : 'sparse' ;
NO : 'no'
(etc)
如果我给它fetch aaa 作为输入('aaa' 不是关键字),它会解析:
但如果我给它fetch sparse 它会失败 - 'sparse' 是一个关键字:
也许我很笨,但我不明白为什么,因为SPARSE 是KEYWORD_AS_IDENT 的成员。
如果我将 (2) 中的一些剪切并粘贴到 (1) 中以获得此:
regular_ident :
FILESTREAM
| SPARSE
| NO
| ACTION
| PERSISTED
| FILETABLE_DIRECTORY
|
REGULAR_IDENT
;
fetch sparse 突然没问题,因为它现在将“稀疏”视为常规标识符:
但为什么 (1) 不起作用?
我可以通过内联所有 KEYWORD_AS_IDENT 来轻松修复它,但我需要知道我缺少什么。
感谢所有建议。
【问题讨论】:
标签: antlr4