大文字と小文字を区別せずに文字列を照合するにはどうすればよいですか?
質問
「ビール」と一致させたいとしますが、大文字と小文字の区別は気にしません。
現在、トークンを ('b'|'B' 'e'|'E' 'e'|'E' 'r'|'R') と定義していますが、そのようなものがたくさんあり、実際には定義していません「本当にこれは本当に長いトークンです」を処理したいと思っています。
Antlr ウィキ それはできないことを示唆しているようです (アントラーで) ...でも、誰かが何か巧妙なトリックを持っているのではないかと思ったのですが...
解決
については、各許容識別子文字のレクサー・トークンを定義する方法、それらの一連のパーサトークンを構築する?
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];
新しいドキュメント ページが ANTLR GitHub リポジトリに表示されました。 大文字と小文字を区別しないレクシング. 。次の 2 つのアプローチを使用できます。
- @javadbaの回答で説明されているもの
- または、コードに文字ストリームを追加すると、入力ストリームが小文字または大文字に変換されます。主要な言語の例は、同じドキュメント ページで見つけることができます。
私の意見では、最初のアプローチを使用し、すべてのルールを説明する文法を用意する方が良いです。しかし、よく知られた文法を使用する場合、たとえば ANTLR v4 用に書かれた文法, の場合は、2 番目のアプローチの方が適切である可能性があります。
私は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;
}
}
所属していません StackOverflow