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.

¿Fue útil?

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