¿Cómo se puede utilizar el metacaracter de negación, ~
, en las reglas de lexer y analizador de ANTLR?Negating inside lexer- and parser rules
Respuesta
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 ;
- 1. PHP Lexer and Parser Generator?
- 2. Generadores de Lexer y Parser para Common Lisp
- 3. Free Java HTML and JS parser
- 4. ¿Cuál sería un buen Delphi lexer/parser para el archivo de idioma de Javascript?
- 5. HTML5 data- * attribute rules?
- 6. Ruby & Rules Engines
- 7. PHP Heredoc String Rules
- 8. NMake Pattern Rules
- 9. Makefile, Pattern-Rules y Directories
- 10. ANTLR3 lexer precedencia
- 11. Herramientas Lexer/analizador
- 12. Lexer escrito en Javascript?
- 13. poniendo #warning inside # define's body
- 14. Imagen GridView Inside Fragment
- 15. PHP continue inside function
- 16. jsf repeat inside datatable
- 17. let inside cond
- 18. Git repo inside repo
- 19. ¿La palabra "lexer" es un sinónimo de la palabra "analizador"?
- 20. Lexer que reconoce bloques sangrados
- 21. Habilitando CoffeeScript lexer en SciTE?
- 22. C# /. NET Generadores de Lexer
- 23. Currying implícito en Scheme with syntax-rules?
- 24. ¿Excluyendo un subdominio de .htaccess mod_rewrite rules?
- 25. VertexCoordinate Rules y VertexList de GraphPlot Graphic
- 26. Eliminando el atributo rules de asp.net gridview
- 27. Swipe Gesture Recognition Inside UIWebView
- 28. _cmd value inside c functions
- 29. JSTL continue, break inside foreach
- 30. Doctrine 2, query inside entities
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
@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. –