antlr antlr3 parser-generator

antlr - Negando dentro de las reglas de lexer y parser



antlr3 parser-generator (1)

La negación puede ocurrir dentro de las reglas de léxer y analizador .

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

Un par de ejemplos:

reglas lexer

Para hacer coincidir uno o más caracteres, excepto las letras ASCII en minúsculas, puede hacer:

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

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

Tenga en cuenta que ''a''..''z'' coincide con un solo carácter (y, por lo tanto, se puede negar), pero la siguiente regla no es válida:

ANY_EXCEPT_AB : ~(''ab'') ;

Debido a que ''ab'' (obviamente) coincide con 2 caracteres, no se puede negar. Para hacer coincidir un token que consta de 2 caracteres, pero no ''ab'' , deberías 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

Dentro de las reglas del analizador, ~ niega un token determinado, o más de un token. Por ejemplo, tienes los siguientes tokens definidos:

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

Si ahora quieres hacer coincidir cualquier token excepto la A , lo haces:

p : ~A ;

Y si quieres hacer coincidir cualquier token excepto B y D , puedes hacer:

p : ~(B | D) ;

Sin embargo, si desea hacer coincidir dos tokens distintos a A seguidos de B , no puede hacerlo:

p : ~(A B) ;

Al igual que con las reglas de lexer, no puede negar más de un solo token. Para lograr lo anterior, necesita hacer:

P : A ~B | ~A . ;

Tenga en cuenta que el . (DOT) char en las reglas de un analizador no coincide con ningún carácter como lo hace dentro de las reglas de lexer. 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 ;

¿Cómo se puede usar el meta-carácter de negación, ~ , en las reglas de analizador y analizador de ANTLR?