Domanda

Diciamo che voglio abbinare "birra", ma non mi interessa la distinzione tra maiuscole e minuscole.

Attualmente sto definendo un token come ('b'|'B' 'e'|'E' 'e'|'E' 'r'|'R') ma ne ho molti e in realtà non lo faccio voglio gestire "in verità questo è un segno molto lungo, anzi, l'omiyesite".

Il wiki di antlr sembra suggerire che non è possibile farlo (in antlr) ...ma mi chiedevo solo se qualcuno avesse qualche trucchetto intelligente...

È stato utile?

Soluzione

Che ne dite di definire un gettone lexer per ogni personaggio identificatore ammissibile, quindi costruire il token parser come una serie di quelli?

beer: B E E R;

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

ecc.

Altri suggerimenti

Vorrei aggiungere alla risposta accettata: un insieme -made pronto è disponibile all'indirizzo blocchi di costruzione case insensitive ANTLR , e la quota di competenza trovano più sotto, per comodità

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

Quindi, un esempio è

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

Definisci gettoni case-insensitive con

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

Una nuova pagina di documentazione è apparsa nel repository GitHub ANTLR: Lexing senza distinzione tra maiuscole e minuscole.Puoi utilizzare due approcci:

  1. Quello descritto nella risposta di @ javadba
  2. Oppure aggiungi un flusso di caratteri al tuo codice, che trasformerà un flusso di input in lettere minuscole o maiuscole.Esempi per le lingue principali che puoi trovare nella stessa pagina del documento.

Secondo me è meglio usare il primo approccio e avere la grammatica che descrive tutte le regole.Ma se usi una grammatica ben nota, ad esempio from Grammatiche scritte per ANTLR v4, allora il secondo approccio potrebbe essere più appropriato.

Una soluzione che ho usato in C #: utilizzare il codice ASCII per spostare carattere a caso più piccolo

.
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;
  }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top