2008-11-01 15 views
15

Estoy enseñando (con otros) un curso relativamente introductorio en ciencias de la computación para profesionales de TI sin experiencia en CS. Desde que desarrollé los materiales del curso sobre autómatas y gramáticas, también soy responsable de enseñar sobre compiladores y construcción de compiladores.¿Qué generador de analizador para enseñar a mis alumnos?

Hace años, cuando estudiaba compilación en la universidad, todos nuestros ejemplos provenían de Lex y Yacc. ¿Todavía se usan ampliamente? ¿Hay algo que se use más comúnmente para Java? Los estudiantes son competentes en C y Java, pero nunca han usado generadores de analizadores.

Algún consejo sobre qué enseñar sería apreciada

+1

¡Buena suerte en sus enseñanzas! –

+0

Esto estaría en el tema en http://cseducators.stackexchange.com (aunque como todavía está en versión beta privada, es más fácil ingresar aquí https://area51.stackexchange.com/proposals/92460/computer-science- educadores) –

Respuesta

29

Antlr es ampliamente utilizado, bien documentada, y libre. Es compatible con Ant, y puede apuntar a Java entre muchos otros idiomas.

+0

Eso es correcto. Si ya conocen java, antlr es el camino a seguir. – tunaranch

1

Recuerdo haber usado CUP y me gustó. Eche un vistazo al CUP Parser Generator for Java.

CUP se mantiene en la Universidad Técnica de Munich. Creo que su objetivo principal es enseñar a los estudiantes.

También tiene un modelo de licencia libre.

... permiso para usar, copiar, modificar y distribuir este software y su documentación para cualquier propósito y sin Gastos de la presente se otorga, siempre que el anterior aviso de derechos de autor aparezca en todas las copias y que tanto el aviso de copyright y este aviso de permiso y garantía descargo de responsabilidad aparezcan en la documentación ...

+0

Si enseña CS, puede que le interese el nuevo [CS Educator's Stack Exchange] (http://cseducators.stackexchange.com) (aunque como todavía está en versión beta privada, es más fácil ingresar [aquí] (https: //area51.stackexchange.com/proposals/92460/computer-science-educators)) –

5

Lex y Yacc todavía están en uso . Uno de los idiomas más nuevos, F #, tiene sus propias versiones (fslex, fsyacc, ver here para ver un ejemplo). Por lo tanto, creo que enseñarlos sigue siendo relevante.

1

Puede omitir la parte del generador y echar un vistazo a los combinadores de analizadores Scalas.

3

Los sistemas de análisis PEG como RATS son más simples que el combo lex/yacc. Esto puede o no ser una ventaja para su clase: ¿su objetivo es enseñar sobre expresiones regulares y autómatas finitos, y gramáticas LR y autómatas pushdown, etc.? ¿O quieres las herramientas de frontend de compilador más simples?

(Ya que no programar en Java en estos días no he probado ratas en particular.)

0

Actualmente estoy tomando un curso de compiladores que utiliza Lex y Yacc. Realmente no sé de ningún otro tipo, pero la teoría que estamos aprendiendo parece corresponderse bastante bien con estas herramientas.

10

Es una lástima que sus alumnos no estén bien versados ​​en C++. Una vez que encontré la biblioteca Spirit con su concepto de una DSL rica en estilo EBNF, ¡dejé atrás Antlr, Lex y Yacc! Es mucho más flexible teniendo la gramática descrita junto con el código.

Biblioteca brillante, aunque con una curva de aprendizaje ciertamente no trivial.

Sin embargo, sin C++, Antlr es probablemente su mejor opción.

+0

Incluso utilicé spirit para analizar los argumentos de línea de comandos ... :) – xtofl

+1

No me gusta la biblioteca program_options, ¿eh? :) – MattyT

+2

en nuestra universidad (todavía estoy estudiando), usamos Boost :: Spririt como base para enseñar tanto el análisis sintáctico como el avanzado C++. Funciona muy bien para aquellos que están motivados para aprender, pero por supuesto, parece demasiado en profundidad para los estudiantes de cruisy –

14

No uso generadores lexer y analizador. Son lo suficientemente simples como para generarlos a mano, y son las partes más fáciles de compilar para escribir. Además, cuando los construyes a mano, puedes hacerlos realmente rápidos.

+4

Aparentemente nunca has escrito analizadores/lexers complicados ... realmente no quieres mantenerlos a mano si complicarse – Jorn

+13

Sí, he hecho analizadores sintácticos y lexers a mano que hacen búsquedas arbitrarias y retrocesos, e incluso uno para C++. (El C++ es un poco más difícil debido a sus interacciones con el preprocesador, los tokens que existen o no se basan en los modificadores del compilador, etc.) –

+3

Más nigromancia ... Me encanta la arrogancia de la juventud. Jorn, si todavía le queda algo de atención ... www.digitalmars.com – JimR

0

recuerdo usando bisonte en una de mis clases de compiladores. También usamos flex y YACC.

1

Si planea trabajar con Java, JavaCC o ANTLR deberían ser suficientes. Este último también es compatible con C y Python. Pero si planeas trabajar con C++, tal vez deberías echarle un vistazo a Boost :: Spirit.

1

No lo he intentado todavía, pero encontré jparsec hace unos días. No es un generador de analizadores sintácticos, sino que el analizador sintáctico está construido en Java mediante combinators en un estilo EBNF.

5

Yacc y todos los demás analizadores LALR (1) datan de una época en la que los recursos de la máquina eran escasos y era necesario dedicar mucho tiempo a la gramática para poder ejecutar un analizador en un PDP-11 con 64K de RAM. Hoy no tiene sentido enseñar una herramienta como yacc con una terrible interfaz humana y un conjunto muy limitado de gramáticas que puede usar.

Recomendaría cualquiera de los analizadores basados ​​en PEG, como Rats !, o el analizador GLR Elkhound desarrollado por George Necula y Scott McPeak (quark de agradecimientos). Lo siento, no puedo recomendar una herramienta específica para Java, ¡pero Ratas! es bueno para C.

ANTLR está bien pero es demasiado complejo para mi gusto.

+0

Analizador de GLR de código abierto: Elkhound. http://www.scottmcpeak.com/elkhound. Incluso se ha usado para generar un analizador de C++. – quark

0

OCaml tiene un fantástico conjunto de generadores de analizadores. Here son algunos ejemplos simples.

JavaCC también es bastante bueno.

Recomiendo encarecidamente evitar C (y C++) para este propósito porque son extraordinariamente dolorosos en este contexto.

1

Me gusta mucho el GOLD Parsing System, porque básicamente genera las tablas necesarias y solo tiene que usar una implementación (genérica) de un procesador que utiliza la información de la tabla para procesar los tokens. Este motor (como se lo llama) es bastante fácil de escribir y es básicamente una implementación pura usando las tablas LALR y DFA para procesar la entrada, y escribir dicha implementación puede ser un buen ejercicio para enseñarles.

+0

¿Por qué el voto a favor? ¿Nadie? – Lucero

Cuestiones relacionadas