ANTLR 4大小写不敏感词法

1 解决方案

  • 构建词法规则支持大小写不敏感

    易读,但是难写且效率低

  • 词法解析前全部转换为大写

    高效,但需要注意不要转换字符串和注释

讨论详见detail

2 大小写不敏感规则

详见SQLite grammar.

1
2
# 匹配update中任意字符大小写
K_UPDATE : U P D A T E;

可直接复用的片段:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
fragment A : [aA]; // match either an 'a' or 'A'
fragment B : [bB];
fragment C : [cC];
fragment D : [dD];
fragment E : [eE];
fragment F : [fF];
fragment G : [gG];
fragment H : [hH];
fragment I : [iI];
fragment J : [jJ];
fragment K : [kK];
fragment L : [lL];
fragment M : [mM];
fragment N : [nN];
fragment O : [oO];
fragment P : [pP];
fragment Q : [qQ];
fragment R : [rR];
fragment S : [sS];
fragment T : [tT];
fragment U : [uU];
fragment V : [vV];
fragment W : [wW];
fragment X : [xX];
fragment Y : [yY];
fragment Z : [zZ];

3 提前转换

以下示例需要提前转换为大写:

1
K_UPDATE : 'UPDATE';

Java语言使用示例:

1
2
3
CharStream s = CharStreams.fromPath(Paths.get('test.sql'));
CaseChangingCharStream upper = new CaseChangingCharStream(s, true);
Lexer lexer = new SomeSQLLexer(upper);

其中,各语言使用CaseChangingCharStream示例:

参考资料