2011-06-17 11 views
5

He oído que los "escritores de compiladores reales" hacen su propio analizador hecho a mano en lugar de usar generadores de analizadores sintácticos. También he escuchado que los generadores de analizadores no lo cortan para los idiomas del mundo real. Supuestamente, hay muchos casos especiales que son difíciles de implementar usando un generador de analizadores. Tengo mis dudas sobre esto:¿Los compiladores de producción usan generadores de analizadores?

  1. En teoría, un generador de analizadores GLR debe ser capaz de manejar la mayoría de los diseños de lenguaje de programación (excepto tal vez en C++ ...)
  2. Sé de al menos una lengua de producción que utiliza una generador de analizador sintáctico: Ruby [1].
  3. Cuando tomé mi clase de compiladores en la escuela, utilizamos un generador de analizadores.

Así que mi pregunta: ¿Es razonable escribir un compilador de producción usando un generador de analizador sintáctico, o está usando un generador de analizador considerado como una decisión de diseño deficiente por la comunidad de compiladores?

[1] https://github.com/ruby/ruby/blob/trunk/parse.y

+3

programadores reales utilizan tablas de pan. – Woot4Moo

+1

Pensé que usaban mariposas http://xkcd.com/378/ –

+0

@Fichman touche mi amigo – Woot4Moo

Respuesta

4

Por lo que vale la pena, GCC utiliza un generador de filtros pre-4.0 Creo, luego cambió a un lado por escrito recursivo descenso analizador porque era más fácil de mantener y extender.

Generadores de analizadores HAGA "cortar" para idiomas "reales", pero la cantidad de trabajo para transformar su gramática en algo viable crece exponencialmente.

Editar: enlace al documento de GCC que detalla el cambio con razones y beneficios frente a análisis de costos: http://gcc.gnu.org/wiki/New_C_Parser.

+1

Me gusta especialmente su comentario "La recuperación de errores podría entrar en bucles infinitos" ... – Blindy

0

A veces se usa una combinación de ambos métodos, como la generación de código con un analizador, y más tarde, la modificación "a mano" de ese código.

Otra forma es que algunas herramientas de escáner (lexer) y analizador les permiten agregar código personalizado, adicional a las reglas de gramática, llamado "acciones semánticas". Un buen ejemplo de este caso es que un analizador detecta identificadores genéricos y algunos códigos personalizados transforman algunos identificadores específicos en palabras clave.

EDIT: añadir "acciones semánticas"

1

que trabajé para una empresa durante unos años en los que eran más o menos los compiladores de escritura. No nos preocupamos mucho por el rendimiento; solo reduciendo la cantidad de trabajo/mantenimiento. Usamos una combinación de analizadores generados + código escrito a mano para lograr esto. El equilibrio ideal es automatizar las partes fáciles y repetitivas con el generador de analizadores y luego abordar las cosas difíciles en funciones personalizadas.

Cuestiones relacionadas