Nunca

Páginas: 12 (2824 palabras) Publicado: 4 de diciembre de 2012
Análisis léxico con ANTLR
En esta práctica trabajaremos con ANTLR a nivel léxico, estudiaremos los elementos que esta herramienta proporciona para especificar analizadores léxicos y los aplicaremos a la resolución de distintos aspectos como la identificación de tokens, el tratamiento de palabras reservadas y comentarios o la sensibilidad a mayúsculas y minúsculas. Un ejemplo simple En ANTLR nose utilizan expresiones regulares y autómatas finitos para especificar e implementar, respectivamente, analizadores léxicos. En su lugar se aprovechan la misma notación y el mismo tipo de reconocedores utilizados en la generación de analizadores sintácticos, o sea gramáticas EBNF y reconocedores recursivos descendentes. Con esta decisión se gana en homogeneidad a nivel de notación, aunque enalgunas ocasiones se echan de menos algunas facilidades propias de las expresiones regulares, fundamentalmente el hecho de no tener que preocuparse de que los patrones léxicos tengan prefijos comunes, problema que en los reconocedores descendentes está siempre presente. El siguiente analizador léxico detecta números, paréntesis, separadores y operadores aritméticos, además de ignorar blancos,tabuladores y saltos de línea: /////////////////////////////// // Analizador léxico /////////////////////////////// class Analex extends Lexer; protected NUEVA_LINEA: "\r\n" {newline();}; BLANCO: (' '|'\t'|NUEVA_LINEA) {$setType(Token.SKIP);}; protected DIGITO: '0'..'9'; NUMERO: (DIGITO)+('.'(DIGITO)+)?; OPERADOR: '+'|'-'|'/'|'*'; PARENTESIS: '('|')'; SEPARADOR: ';'; Como se puede observar laespecificación es bastante intuitiva y se comprende a simple vista, tan solo merece la pena comentar algunos detalles: Las reglas se especifican en notación EBNF, por lo que se podrán utilizar los operadores de cierre (*), cierre positivo (+), opción (|) y opcional (?). Es aconsejable encerrar entre paréntesis todos aquellos elementos sujetos a los operadores unarios *, + y ?. Los caracteres se especificancon comillas simples (p.e. '0','\t' y '+'). Las secuencias de caracteres se especifican con comillas dobles como por ejemplo "\r\n", en este caso concreto cabe reseñar que la combinación se corresponde con la manera en la que en Windows se codifica la nueva línea (si solamente pusiésemos '\n' no funcionaría

en esta plataforma). Comprueba qué ocurre en Linux y cámbialo si es necesario. Con laacción {$setType(Token.SKIP);} se establece que los tokens reconocidos en la regla correspondiente deben ser ignorados y no serán, por tanto, visibles para el analizador sintáctico. Los rangos de caracteres se especifican con el operador ".." (p.e.'0'..'9'). Con la acción {newline();} se establece que los tokens correspondientes provocan un cambio de línea, por lo que los contadores de fila ycolumna son actualizados convenientemente. Con el modificador protected se indica que la regla correspondiente no describe un token, sino que sirve de apoyo en la definición de una regla más compleja. Así, en el ejemplo, la regla BLANCO se apoya en la regla protegida NUEVA_LINEA. Como todos los analizadores en ANTLR, el analizador léxico se implementa a través de una clase. En nuestro caso estaclase se llamará Analex y siempre será una subclase de CharScanner, que es la clase que implementa el comportamiento genérico de los analizadores léxicos. La clase Analex tiene varios métodos que permiten lanzar el reconocimiento de tokens y consultar o modificar atributos propios del analizador. De ellos los dos más destacados son: nextToken: cada vez que se ejecuta devuelve el siguiente tokenidentificado en el flujo de entrada. makeToken: es heredado de la clase CharScanner y es el utilizado por el analizador para construir los objetos de la clase Token y actualizar sus atributos. Como veremos más adelante tendremos que redefinirlo si queremos añadir más atributos a los ya implementados en ANTLR por defecto. Probando el analizador léxico Gracias al método nextToken podremos probar el...
Leer documento completo

Regístrate para leer el documento completo.

Estos documentos también te pueden resultar útiles

  • Nunca
  • nunca
  • nunca
  • Nunca
  • los nunca
  • NUNCA
  • nunca
  • nunca

Conviértase en miembro formal de Buenas Tareas

INSCRÍBETE - ES GRATIS