2011-11-27 10 views

Respuesta

23

Negating puede ocurrir dentro de lexer and parser rules.

Dentro de las reglas de lexer puede negar caracteres, y dentro de las reglas del analizador puede negar tokens (reglas lexer). Pero tanto las reglas lexer como las del analizador solo pueden negar los caracteres individuales o los tokens individuales, respectivamente.

Un par de ejemplos:

reglas lexer

para que coincida con uno o más caracteres excepto letras ASCII en minúscula, que puede hacer:

NO_LOWERCASE : ~('a'..'z')+ ; 

(la negación-meta-char, ~, tiene una precedencia mayor que +, por lo que la regla anterior es igual a (~('a'..'z'))+)

Tenga en cuenta que 'a'..'z' coincide con un solo carácter (y para ello puede ser negado), pero la regla siguiente es válido:

ANY_EXCEPT_AB : ~('ab') ; 

Debido 'ab' (obviamente) coincide con 2 caracteres, no puede ser negado. Para que coincida con una ficha que consta de 2 caracteres, pero no 'ab', que tendría que hacer lo siguiente:

ANY_EXCEPT_AB 
    : 'a' ~'b' // any two chars starting with 'a' followed by any other than 'b' 
    | ~'a' . // other than 'a' followed by any char 
    ; 

reglas del analizador

reglas del analizador dentro, ~ niega una cierta manera, o más de uno simbólico. Por ejemplo, puede tener las siguientes fichas definida:

A : 'A'; 
B : 'B'; 
C : 'C'; 
D : 'D'; 
E : 'E'; 

Si ahora desea para adaptarse a cualquier símbolo excepto el A, que hace:

p : ~A ; 

Y si desea hacer coincidir cualquier símbolo excepto B y D, que puede hacer:

p : ~(B | D) ; 

Sin embargo, si desea hacer coincidir las dos fichas que no sean A seguido por B, que no puede hacer:

p : ~(A B) ; 

Al igual que con las reglas analizadoras, no puede negar más que como un símbolo. Para lograr lo anterior, es necesario hacer:

P 
    : A ~B 
    | ~A . 
    ; 

Tenga en cuenta que la . (DOT) de carbón en un analizador de reglas hace no partido de cualquier carácter como lo hace dentro de las reglas analizadoras. Dentro de las reglas del analizador, coincide con cualquier token (A, B, C, D o E, en este caso).

Tenga en cuenta que no puede negar las reglas del analizador. Lo siguiente es ilegal:

p : ~a ; 
a : A ; 
+0

Gracias por la aclaración. No sabía que el operador '~' se aplicaría a los tokens cuando ocurren en una regla de analizador. – Gunther

+0

@Gunther, no hay problema. A menudo lo menciono brevemente en mis respuestas, así que a partir de ahora puedo vincular a este Q & A. W.r.t. su convertidor, quizás ya lo está usando, pero quizás no: la clase 'org.antlr.tool.Strip' elimina todo el código personalizado de los archivos de gramática ANTLR que pueden hacer su vida más fácil al analizar gramáticas ANTLR. –