¿Hay algún mecanismo en Antlr para permitir que el lexer haga coincidir un token solo durante ciertas reglas?

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

  •  06-07-2019
  •  | 
  •  

Pregunta

Me gustaría agregar una palabra clave a mi idioma.

Esta palabra clave solo tendría que coincidir durante una regla gramatical del analizador en particular.

Debido a la compatibilidad con versiones anteriores, me gustaría permitir que esta palabra clave continúe usándose como un nombre de variable, es decir, puede coincidir con la regla lexer que determina si un token es adecuado para un nombre de variable.

El Lexer coincide con la nueva regla siempre que se encuentre en el archivo.

¿Es la forma adecuada de solucionar esto para modificar la regla var_declaration para que coincida con un IDENT o con los nuevos tokens de KEYWORD?

protected
modified_var_declaration:
     VAR (IDENT|KEYWORD);
;

Las reglas relevantes son:

IDENT   // matches variable names
options { testLiterals=true; }
    : ( '_' | 'a'..'z' | 'A'..'Z' ) ( '_' | 'a'..'z' | 'A'..'Z' | DIGIT )*
;

KEYWORD: // my new keyword
  "key"
;

La regla del analizador para crear una variable es:

protected
var_declaration:
     VAR IDENT;
;
¿Fue útil?

Solución

Muchos idiomas tienen palabras clave sensibles al contexto. El primer paso para manejarlos es agregar una nueva regla de analizador ident que represente un nombre de variable. Use esa regla en su analizador en lugar de IDENT .

ident
    : IDENT
    | KEYWORD
    ;

Otros consejos

Visite http://www.antlr.org/wiki/display /ANTLR3/1.+Lexer que debería ayudarlo. Deberá establecer y anular un indicador cuando " KEYWORD " se permitirá, es decir,

KEYWORD : { keywordcontext }?=> "key";

El truco aquí sería cambiar de lugar donde se puede esperar una palabra clave, que podría ser menos trivial.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top