让我们说,我想要匹配"啤酒",但是不关心的情况的敏感性。

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

在这些代码wiki 似乎表明,它不能做 (在这些代码)...但我只是想知道,如果任何人有一些聪明的技巧...

有帮助吗?

解决方案

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

beer: B E E R;

A : 'A'|'a';
B: 'B'|'b';

其他提示

我想添加到接受的答案:一个现成订做一套可以在找到不区分大小写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');

因此,一个例子是

   HELLOWORLD : H E L L O W O R L D;

与定义不区分大小写的令牌

BEER: [Bb] [Ee] [Ee] [Rr];

新的文件的页面已经出现在这些代码。repo: 情况不敏感的各处.你可以用两种方法:

  1. 中描述的一种@javadba的答案
  2. 或者添加一个字符流到你的代码,这将改变输入流,以降低或上层情况。例为主要语言,你可以找到同样的医生页。

我看,最好使用第一种方法和语法,它描述了所有的规则。但是如果您使用的知名语法,例如从 法编写这些代码v4, 然后第二种办法可能更合适。

我在C#中使用的溶液:使用ASCII代码字符转换到更小的情况下

class CaseInsensitiveStream : Antlr4.Runtime.AntlrInputStream {
  public CaseInsensitiveStream(string sExpr)
     : base(sExpr) {
  }
  public override int La(int index) {
     if(index == 0) return 0;
     if(index < 0) index++;
     int pdx = p + index - 1;
     if(pdx < 0 || pdx >= n) return TokenConstants.Eof;
     var x1 = data[pdx];
     return (x1 >= 65 && x1 <= 90) ? (97 + x1 - 65) : x1;
  }
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top