ANTLR

Concepto

  • ANTLR  es  capaz  de  generar  un analizador léxico, sintáctico o semánticoen varios lenguajes,   a partir  de unosficheros escritos en un lenguaje propio.Dicho  lenguaje  es  básicamente  unaserie  de  reglas  de  gramática  y  unconjunto  de  construcciones  auxiliares.
  • Herramienta de generación de compiladores, es multiplataforma por estar desarrollado en Java, y es multilenguaje por tener la capacidad de generar código para la mayoría de lenguajes orientados a objetos populares actualmente, incluyendo, pero no limitándose a Java, C#, C++, Python, Ruby, Javascript, entre otros. Su método de análisis se basa en el LL(k) por lo que soporta el uso de atributos heredados. Otra característica es la facilidad para generar AST, es decir representaciones intermedias que permiten crear compiladores o intérpretes de más de una pasada. y la integración con StringTemplates para transformaciones complejas.
  • ANTLR proporciona un excelente soporte para la construcción del árbol, recorrido por el árbol, la traducción, la recuperación de errores, y los informes de errores.

Además, ANTLR proporciona facilidades para la creación de estructuras intermedias de análisis (como ser ASTs – Abstract Sintax Tree), para recorrer dichas estructuras, y provee mecanismos para recuperarse automáticamente de errores y realizar reportes de los mismos.

Versiones:

La versión 1 de ANTLR siguió su curso, y fue incorporando nuevas características, así como nuevas capacidades y facilidades para el programador (siendo una de las más destacadas SORCERER, la cual facilitaba el parseo de los subárboles hijos de un nodo mediante la especificación de una gramática, en vez de realizar una recorrida recursiva sobre ambos).

En mayo de 1997, Parr unido principalmente con John Lilley, se plantean escribir ANTLR desde cero, enfocándose en mejorar su rendimiento, reducir el uso de memoria, y agregar más características al lexer (como ser la posibilidad ingorar si los simbolos se encuentran en mayúscula o minúscula). Esto da lugar al surgimiento de ANTLR 2.0.

En diciembre del mismo año, surge el sitio web http://www.antlr.org, el cual fue acompañado de la publicación de la versión 2.2.0, englobando varias mejoras, como ser tratamiento de AST extendido, herencia de gramáticas, etc.

El 17 de Mayo del 2007 publican la versión actual de ANTLR, 3.0. Dicha versión llevó 4 años de investigación y desarrollo. La misma esta re-escrita en Java, y su principal objetivo fue el de proveer un código fuente limpio y claro de entender, presentando la sintaxis y semántica de la gramática del meta-lenguaje de ANTLR de una manera más sencilla. Además se mejoró nuevamente el rendimiento del software, así como también se añadieron algunas funciones nuevas (modo automático de recorrida en reversa, mecanismo de reescritura de reglas del AST, extensión al algoritmo LL(k), llamada LL(*), la cual permite que no se especifique el parámetro k de búsqueda en la cadena de entrada, sino que ANTLR busca automáticamente tantos caracteres como sea necesario, hasta que se logre evitar la ambigüedad, etc.).

A esto se le añadió que Jean Bovet creó el entorno de desarrollo para la creación y edición de gramáticas para ANTLR llamado “ANTLRWorks”.

ANTLR es un proyecto bajo licencia BSD, viniendo con todo el código fuente disponible, y preparado para su instalación bajo plataformas LinuxWindows yMac OS X.

Evaluador de expresiones aritméticas en AntLR

Esta gramática en ANTLR y escrita utilizando el paquete AntLRWorks.jar permite evaluar expresiones aritméticas que incluyan operaciones de suma, resta, multiplicación, división y exponenciación de número enteros y reales. Se permiten igualmente las expresiones anidadas entre paréntesis.

Desde el punto de vista léxico se define el componente NUMERO formado a partir del componente DIGITO para reconocer solamente números positivos enteros o reales; se ignoran los espacios con la regla ESPACIO, y los demás caracteres no permitidos generarán un error de ejecución con el componente RESTO ya que éste no aparece en ninguna regla gramatical.

Desde el punto de vista gramatical y semántico, se define una regla principal (s) que direcciona a una expresion y muestra al final el resultado de la misma. Las demás reglas se encargan de definir los diferentes componentes gramaticales: expresión, término, factor y valor. Las reglas semánticas se encargan de ir haciendo las operaciones a medida que se van traduciendo.

Para correr la gramática, se puede hacer desde un programa en java que cargue adecuadamente las librerías de antlr. Este ejemplo muestra un programa muy simple que lee por consola una expresión aritmética y devuelve el resultado:

ANTLR Y LOS TOKENS

  • ‘x’..’y’ cualquier cosa en este rango.
  • (‘x’j’y’) una de las dos opciones.
  •  ‘x’ cualquier cosa menos ‘x’
  • los operadores + y * como siempre

VER MÁS INFORMACIÓN AQUI:

 JAVA CC

JavaCC (Java Compiler Compiler) es un generador de analizadores sntacticos de código abierto para el lenguaje de programación Java. JavaCC es similar a Yacc en que genera un parser para una gramática presentada en notación BNF, con la diferencia de que la salida es en código Java. A diferencia de Yacc, JavaCC genera analizadores descendentes (top-down), lo que lo limita a la clase de gramáticas LL(K) (en particular, la recursión desde izquierda no se puede usar). El constructor de árboles que lo acompaña, JJTree, construye árboles de abajo hacia arriba (bottom-up).

JavaCC está licenciado bajo una licencia BSD.

En 1996, SunMicrosystems liberó un parser llamado Jack. Los desarrolladores responsables de Jack crearon su propia compañía llamada Metamata y cambiaron el nombre Jack a JavaCC. Metamata se convirtió en WebGain. Después de que WebGain finalizara sus operaciones, JavaCC se traslado a su ubicación actual.

Características:

  •  JavaCC  herramienta, obteniendo a la salida código java –a diferencia de lex/yacc cuya salida es código C-.  Antes que nada veamos un ejemplo sobre el cual se va a ir haciendo un seguimiento de cada uno de los distintos puntos que vayamos comentando. En él se muestra una gramática reconocedora de una calculadora. Más adelante, en este mismo capítulo, lo modificaremos con el objetivo de mostrar mayores funcionalidades que aporta JavaCC, integra las funciones de análisis léxico y análisis sintáctico en una sola.

  •  Incorpora distintos tipos de tokens: normales (TOKEN), especiales(SPECIAL_TOKEN), espaciadores (SKIP) y de continuación (MORE). Ellopermite trabajar con especificaciones más claras, a la vez que permite unamejor gestión de los mensajes de error y advertencia por parte de JavaCC entiempo de meta-compilación.
  • La especificación léxica puede definir tokens de manera tal que no sediferencien las mayúsculas de las minúsculas bien a nivel global, bien en unpatrón concreto.
  • De entre los generadores de analizadores sintácticos descendentes, JavaCC es uno de los que poseen mejor gestión de errores. Los analizadores generadospor JavaCC son capaces de localizar exactamente la ubicación de los errores,proporcionando información diagnóstica completa.
  • Permite depurar tanto el analizador sintáctico generado como el lexicográfico,mediante las opciones DEBUG_PARSER, DEBUG_LOOKAHEAD, yDEBUG_TOKEN_MANAGER.
  • Incluye la herramienta JJTree, un preprocesador para el desarrollo de árbolescon características muy potentes.

Ver más información aquí:javacc

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s