son prácticas programación programacion principiantes para lenguaje las ingenieros ejemplos cuáles curso comandos caracteristicas buenas c++ parsing programming-languages conventions

prácticas - programacion c++ para principiantes



Mejores prácticas para escribir un analizador de lenguaje de programación (7)

¿Hay alguna de las mejores prácticas que debo seguir al escribir un analizador?


Algunos consejos:

  • Conozca su gramática - escríbala en una forma adecuada
  • Elige la herramienta correcta. Hazlo desde dentro de C ++ con Spirit2x, o elige herramientas de analizador externo como antlr, yacc o lo que más te convenga
  • ¿Necesitas un analizador? ¿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.

La sabiduría que se recibe es usar generadores y gramáticas sintácticas y parece un buen consejo, porque estás usando 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.

Al estar libre de contexto no solo hace posible el generador de analizador, 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:-

  • Construcción simple
  • Mejor interpretación
  • Mejor control de la producción
  • Puede hacer frente a pequeñas desviaciones, por ejemplo, trabajar con una gramática que no está 100% libre de contexto

No digo que las gramáticas siempre sean inadecuadas, pero a menudo los beneficios son mínimos y, a menudo, los costos y riesgos los sopesan.

(Creo que los argumentos para ellos son atractivamente atractivos y que hay un sesgo general para ellos, ya que es una forma de señalar que uno es más alfabetizado en ciencias de la computación).


Lee la mayor parte del libro de Dragon primero.

Los analizadores no son complicados si sabes cómo construirlos, pero NO son el tipo de cosas que si le dedicas suficiente tiempo, eventualmente llegarás 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).


No abuse de las expresiones regulares: mientras tienen su lugar, simplemente no tienen el poder 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 ajustados, intente mantener sus capas separadas: el lexer lee en tokens individuales, el analizador los coloca en un árbol y luego el análisis semántico verifica todo y vincula las referencias, y luego una fase final para producir lo que sea está siendo producido. Mantener separadas las diferentes partes de la lógica facilitará el mantenimiento posterior.


Primero, no intente 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.

Segundo, tenga una gramática en mente 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.


Sí. 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.


  • Elija el tipo de analizador correcto, a veces un Descendiente recursivo será suficiente, a veces debe usar un analizador LR (también, hay muchos tipos de analizadores LR).
  • Si tiene una gramática compleja, cree un Árbol de sintaxis abstracta.
  • 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 más flexible posible.
  • Proporcione una buena interfaz para el usuario, por lo que es independiente de la implementación del analizador.