如何匹配字符串,但不区分大小写?

Maw*_*awg 19 antlr antlr3

假设我想匹配"啤酒",但不关心区分大小写.

目前我正在定义一个令牌('b'|'B''e'|'E''e'|'E''r'|'R')但我有很多这样的但不是真的想要处理'verilythisisaverylongtokenindeedomyyesitis'.

antlr wiki 似乎暗示它无法完成(在antlr中)...但我只是想知道是否有人有一些聪明的技巧......

jav*_*dba 28

我想补充一下接受的答案:在不区分大小写的antlr构建块中可以找到现成的集合,为方便起见,下面包含相关部分

fragment A:('a'|'A');
fragment B:('b'|'B');
fragment C:('c'|'C');
fragment D:('d'|'D');
fragment E:('e'|'E');
fragment F:('f'|'F');
fragment G:('g'|'G');
fragment H:('h'|'H');
fragment I:('i'|'I');
fragment J:('j'|'J');
fragment K:('k'|'K');
fragment L:('l'|'L');
fragment M:('m'|'M');
fragment N:('n'|'N');
fragment O:('o'|'O');
fragment P:('p'|'P');
fragment Q:('q'|'Q');
fragment R:('r'|'R');
fragment S:('s'|'S');
fragment T:('t'|'T');
fragment U:('u'|'U');
fragment V:('v'|'V');
fragment W:('w'|'W');
fragment X:('x'|'X');
fragment Y:('y'|'Y');
fragment Z:('z'|'Z');
Run Code Online (Sandbox Code Playgroud)

所以一个例子是

   HELLOWORLD : H E L L O W O R L D;
Run Code Online (Sandbox Code Playgroud)


Jon*_*erg 16

如何为每个允许的标识符字符定义词法分析器标记,然后将解析器标记构造为一系列那些?

beer: B E E R;

A : 'A'|'a';
B: 'B'|'b';
Run Code Online (Sandbox Code Playgroud)

等等

  • 如果采用这种方法,我认为"啤酒"规则应该是所有大写字母中的词法分析器名称(`BEER:BEER;`),并且每个字母规则应该以`fragment`关键字作为前缀.通过这种方式,您可以将"BEER"作为单个令牌,而不是单独表示任何内容的四个令牌. (12认同)

R. *_*ell 10

ANTLR 刚刚添加了不区分大小写的选项

options { caseInsensitive = true; }
Run Code Online (Sandbox Code Playgroud)

https://github.com/antlr/antlr4/blob/master/doc/options.md#caseinsensitive

旧的链接现在已损坏,这些应该可以继续工作。


idr*_*sid 5

定义不区分大小写的标记

BEER: [Bb] [Ee] [Ee] [Rr];
Run Code Online (Sandbox Code Playgroud)