2009-02-20 12 views

Respuesta

10

serie de consejos:

  • conocer su gramática - escribirlo en una forma adecuada
  • Elegir la herramienta adecuada. Hágalo desde dentro de C++ con Spirit2x, o elija herramientas analíticas externas como antlr, yacc, o lo que sea que le convenga
  • ¿Necesita un analizador sintáctico? ¿Tal vez la expresión regular será suficiente? ¿O tal vez hackear un script de perl para hacer el truco? Escribir analizadores complejos lleva tiempo.
5

Yep. Intenta generarlo, no escribir Considere usar yacc, ANTLR, Flex/Bison, Coco/R, generador de analizadores GOLD, etc. Recurra a la escritura manual de un analizador solo si ninguno de los generadores de analizadores existentes se ajustan a sus necesidades.

7

No abuse de las expresiones regulares: mientras tienen su lugar, simplemente no tienen la capacidad de manejar ningún tipo de análisis real. Puedes empujarlos, pero eventualmente vas a golpear una pared o terminar con un desastre imposible de mantener. Es mejor que encuentre un generador de analizadores que pueda manejar un conjunto de idiomas más amplio. Si realmente no quieres entrar en las herramientas, puedes mirar los analizadores de descenso recursivos: es un patrón realmente simple para escribir a mano un pequeño analizador. No son tan flexibles ni tan potentes como los generadores de analizadores grandes, pero tienen una curva de aprendizaje mucho más corta.

A menos que tenga requisitos de rendimiento muy estrictos, intente mantener sus capas separadas: el lexer lee en tokens individuales, el analizador las ordena en un árbol y luego el análisis semántico analiza todo y enlaza referencias, y luego fase para producir lo que se está produciendo. Mantener separadas las diferentes partes de la lógica facilitará el mantenimiento posterior.

3
  • elegir el tipo de analizador, a veces un recursiva Descendiente será suficiente, a veces se debe utilizar un analizador sintáctico LR (también, hay muchos tipos de análisis de LR).
  • Si tiene una gramática compleja, cree un Árbol de sintaxis abstracto.
  • Trate de identificar muy bien lo que entra en el lexer, lo que es parte de la sintaxis y lo que es una cuestión de semántica.
  • Intenta hacer que el analizador sea el menos acoplado a la implementación de lexer como sea posible.
  • Proporcionan una buena interfaz para el usuario por lo que es independiente de la implementación del analizador.
18

La sabiduría recibida es usar generadores de análisis sintáctico + gramáticas y parece un buen consejo, porque está utilizando una herramienta rigurosa y, presumiblemente, reduciendo el esfuerzo y el potencial de errores al hacerlo.

Para utilizar un generador de analizador, la gramática debe estar libre de contexto. Si está diseñando el idioma para analizar, entonces puede controlar esto. Si no está seguro, puede costarle mucho esfuerzo si comienza la ruta de la gramática. Aunque en la práctica no exista contexto, a menos que la gramática sea enorme, puede ser más simple codificar manualmente un analizador decente recursivo.

Ser libre de contexto no solo hace posible el generador de analizadores, sino que también hace que los analizadores codificados a mano sean mucho más simples. Lo que terminas con es una (o dos) funciones por frase. Lo cual es si usted organiza y nombra el código limpiamente no es mucho más difícil de ver que una gramática (si su IDE puede mostrarle que tiene jerarquías de llamadas, entonces puede ver qué es la gramática).

Las ventajas: -

  • más simple de construcción
  • Mejor rendimiento
  • Un mejor control de la producción
  • puede hacer frente a pequeñas desviaciones, por ejemplo, trabajar con una gramática que no es 100% libre de contexto

No estoy diciendo que las gramáticas son siempre inadecuadas, pero a menudo los beneficios son mínimos y están a menudo fuera pesado por los costes y los riesgos.

(creo que los argumentos a favor de ellos son atractivos especiosamente y que hay un sesgo general para ellos, ya que es una manera de señalar que uno es más leer y escribir-informática.)

2

En primer lugar, no trate aplicar las mismas técnicas para analizar todo. Existen numerosos casos de uso posibles, desde direcciones IP (un poco de código ad hoc) hasta programas C++ (que necesitan un analizador de fuerza industrial con comentarios de la tabla de símbolos) y desde la entrada del usuario (que necesita procesarse muy rápido) a los compiladores (que normalmente pueden darse el lujo de pasar un poco de tiempo analizando). Es posible que desee especificar lo que está haciendo si quiere respuestas útiles.

En segundo lugar, tenga en cuenta una gramática para analizar. Cuanto más complicado es, más formal debe ser la especificación. Intenta equivocarte por ser demasiado formal.

Tercero, bueno, eso depende de lo que estés haciendo.

7

Lea la mayor parte de Dragon book primero.

Los analizadores de imágenes no son complicados si usted sabe cómo construirlos, pero NO son el tipo de cosas que si se dedican a tiempo suficiente, eventualmente llegarán allí. Es mucho mejor construir sobre la base de conocimiento existente. (De lo contrario, espera escribirlo y tíralo un par de docenas de veces).

Cuestiones relacionadas