Antlr problema de espacio en blanco canal oculto
-
18-09-2019 - |
Pregunta
Tengo la siguiente gramática Antlr:
grammar MyGrammar;
doc : intro planet;
intro : 'hi';
planet : 'world';
MLCOMMENT
: '/*' ( options {greedy=false;} : . )* '*/' { $channel = HIDDEN; };
WHITESPACE : (
(' ' | '\t' | '\f')+
|
// handle newlines
( '\r\n' // DOS/Windows
| '\r' // Macintosh
| '\n' // Unix
)
)
{ $channel = HIDDEN; };
En los ANTLRWorks 1.2.3 intérprete, las entradas hi world
, hi/**/world
y hi /*A*/ world
trabajo, como se esperaba.
Sin embargo, el hiworld
de entrada, que no debe de trabajo, también se acepta.
¿Cómo hago hiworld
fallar? ¿Cómo fuerzo al menos un espacio en blanco (o comentario) entre "hola" y "mundo"?
Tenga en cuenta que he utilizado solamente MLCOMMENT y espacios en blanco en este ejemplo para simplificar, pero otros tipos de comentarios serían compatibles.
Solución
Es necesario crear una ficha de identificación general. Dado que el analizador léxico construye el token más larga que puede, que vería la entrada "hiworld" como una sola palabra, ya que es más largo que "hola" o "mundo" por sí mismos. Tal regla podría ser:
ID : ('a'..'z' | 'A'..'Z')+;
A modo de ejemplo, así es exactamente como analizadores de lenguajes de programación separan la palabra clave "hacer" de "doble" (tipo de palabra clave, comienza con 'hacer') o (nombre de la variable) "hecho".
Otros consejos
Una forma de hacer que la cadena de hiworld
fall es utilizar un predicado semántico validar que está garantizado para fallar, de la siguiente manera:
doc: intro planet;
failure : 'hiworld' { false }?;
intro : 'hi';
planet : 'world';
// rest of grammar omitted