Pregunta

¿Cuál es la mejor manera de crear un analizador en C++ de un archivo con la gramática?

¿Fue útil?

Solución

También puede ser que desee echar un vistazo a estos enlaces:

Otros consejos

Que depende mucho de la gramática.Me suelen gustar recursiva descenso de los analizadores, que generalmente se escriben con la mano (aunque es posible generar a partir de una descripción de la gramática).

Si vas a usar un parser generator, realmente hay dos buenas opciones:Byacc y Antlr.Si usted quiere algo que es (razonablemente) compatible con yacc, Byacc es (por ahora) su mejor opción.Si vas a empezar desde el principio, ni el código existente, ni la experiencia que favorece el uso de algo compatible con yacc, entonces Antlr es casi sin duda, su mejor apuesta.

Ya se ha mencionado, también voy a hablar un poco acerca de Bisonte.Me gustaría evitar el Bisonte como de la peste de que se trata.Brooks consejo del "Plan para lanzar una distancia" se aplica aquí.Robert Corbett (el autor de Byacc) escribió Bisonte como su primer intento de un parser generator.Por desgracia, él se la dio a GNU en lugar de tirarlo a la basura.En un caso clásico de marketing superando la excelencia técnica, el Bisonte es ampliamente utilizado (e incluso recomendable, por aquellos que no saben mejor), mientras que Byacc sigue siendo relativamente oscuro.

Editar:Odio hacerlo, pero ya que también se han mencionado, yo también voy a comentar sobre Impulso.espíritu.Mientras que esto puede ser el mejor ejemplo de plantilla de meta de la programación de todo, tiene un par de problemas que me llevan a recomendar contra el intento de poner un uso serio.

  1. Los tiempos de compilación puede obtener insoportable -- 10 minutos es común, y una más grande/más complejos de la gramática puede tomar aún más tiempo (suponiendo que no se desplome el compilador).
  2. Si comete algún error, puede y con frecuencia se producen increíblemente largo mensajes de error que son prácticamente imposibles de descifrar.Los mensajes de Error de plantilla-pesado de código son muy malos de todos modos, y el Espíritu subraya que el sistema sea más que casi cualquier otra cosa.

Me creen:el hecho de que usted puede escribir algo como Espíritu en todo es justo en la frontera entre impresionante y sorprendente, pero yo todavía iba a utilizarlo sólo si estaba seguro de la gramática que se ocupan de la era (y estaría siempre) bastante pequeño y simple.

Hay flex y bisontes . Lex y Yacc primos que hacen toman c ++ existencia en cuenta.

¿Ha mirado Lex y Yacc ? Para citar de la sección 5 del documento vinculado:

  

Mi forma preferida para hacer un analizador de C ++   es tener Lex generar una llanura C   archivo y dejar que YACC generar C ++   código. Cuando a continuación, vincular su   aplicación, es posible que encuentre alguna   problemas debido a que el código C ++ por   por defecto no será capaz de encontrar C   funciones, a menos que te han dicho que esa   esas funciones son extern "C".

He usado bisontes , que se encuentran los ejemplos justo para mi nivel. Fue capaz de crear una calculadora sencilla con ella, por supuesto que puede hacer mucho más.

La calculadora tomó 1 + 2 * 3, por ejemplo, y construyó un árbol sintáctico. La documentación no describió cómo construir el árbol y que sin embargo me tomó un poco de tiempo para hacer ejercicio.

Si fuera otra vez me vería en 'antlr', ya que se veía bien y bien apoyado.

Martin.

La mejor manera de crear un programa de análisis es el uso de la lex y yacc.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top