Pregunta

Digamos que quiero para que coincida con "cerveza", pero no se preocupan por mayúsculas y minúsculas.

Actualmente estoy definiendo un símbolo para ser ( 'b' | 'B' 'e' | 'E' 'e' | 'E' 'r' | 'R'), pero tengo un montón de tales y don 't realmente quieren manejar 'verilythisisaverylongtokenindeedomyyesitis'.

El antlr wiki parece sugerir que no se puede hacer (en antlr) ... pero me preguntaba si alguien tenía algunos trucos inteligentes ...

¿Fue útil?

Solución

¿Qué hay de definir un símbolo de léxico para cada carácter identificador permisible, luego construir el token analizador como una serie de esos?

beer: B E E R;

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

etc.

Otros consejos

Me gustaría añadir a la respuesta aceptada: un conjunto -hecha lista se puede encontrar en bloques de construcción caso insensible antlr , y la porción relevante incluyen a continuación para mayor comodidad

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

Así que es un ejemplo

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

Definir tokens mayúsculas y minúsculas con

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

Nueva página de documentación ha aparecido en antlr GitHub repo: entre mayúsculas y minúsculas Lexing . Se pueden utilizar dos enfoques:

  1. El que se describe en la respuesta de @ javadba
  2. O añadir un flujo de caracteres de su código, que va a transformar un flujo de entrada para bajar o mayúsculas. Ejemplos de los principales idiomas se pueden encontrar en la misma página doc.

Mi opinión, es mejor utilizar el primer enfoque y tener la gramática que describe todas las reglas. Pero si se utiliza la gramática conocida, por ejemplo, de gramáticas escritas para antlr v4 , luego la segunda enfoque puede ser más apropiado.

Una solución que he usado en C #: utilice el código ASCII para cambiar el carácter de caja más pequeña

.
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;
  }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top