Wie kann eine Zeichenfolge abgeglichen werden, ohne dass die Groß-/Kleinschreibung beachtet wird?

StackOverflow https://stackoverflow.com/questions/1844562

  •  12-09-2019
  •  | 
  •  

Frage

Nehmen wir an, ich möchte „Beer“ finden, aber die Groß-/Kleinschreibung ist mir egal.

Derzeit definiere ich ein Token als ('b'|'B' 'e'|'E' 'e'|'E' 'r'|'R'), aber ich habe viele davon und nicht wirklich Ich möchte mit „Wahrlich, das ist wirklich eine sehr lange Zeit, in der Tat eine Mysitis“ umgehen.

Das Antlr-Wiki scheint darauf hinzudeuten, dass dies nicht möglich ist (im Antlr) ...Aber ich habe mich nur gefragt, ob jemand ein paar clevere Tricks hat ...

War es hilfreich?

Lösung

Wie wäre es eine Lexer-Token für jedes zulässiges Bezeichnerzeichen zu definieren, dann baut die Parser-Token als eine Reihe von denen?

beer: B E E R;

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

etc.

Andere Tipps

Ich möchte der akzeptierten Antwort Folgendes hinzufügen:Ein fertiges Set finden Sie unter AntLR-Bausteine ​​ohne Berücksichtigung der Groß- und Kleinschreibung, und der entsprechende Teil ist der Einfachheit halber unten aufgeführt

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');

Ein Beispiel ist also

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

Definieren Sie Groß- und Kleinschreibung Token mit

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

Neue Dokumentation Seite wird in ANTLR GitHub Repo erschienen: Case-Insensitive Lexing . Sie können zwei Ansätze verwenden:

  1. Die beschriebene in @ javadba Antwort
  2. oder fügen Sie Ihren Code ein Zeichenstrom, der einen Eingangsstrom verwandeln oder Großbuchstaben zu senken. Beispiele für die wichtigsten Sprachen, die Sie auf der gleichen doc Seite finden können.

Meine Meinung nach, ist es besser, den ersten Ansatz zu verwenden und die Grammatik, die alle Regeln beschreibt. Aber wenn Sie verwenden bekannte Grammatik, zum Beispiel von Grammatiken geschrieben für ANTLR v4 , dann die zweite Ansatz kann besser geeignet sein.

Eine Lösung, die ich in C # verwendet: Code Verwendung ASCII zu verschieben Zeichen kleinen Fall

.
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;
  }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top