¿Cuáles son las opciones para escribir una gramática de idiomas para un nuevo modo principal?

7

Estoy escribiendo un modo principal para un lenguaje de programación que tiene una gramática bien definida: tiene un BNF, formalizado en algunos archivos felices .

En particular, no quiero volver a implementar el BNF como una serie de escaneos de expresiones regulares hacia adelante / hacia atrás (como lo hacen muchos modos principales), aunque no me opondría a traducirlo de forma manual o automática.

Soy consciente de SMIE , ¿hay alguna otra opción disponible para mí en Emacs lisp que me permita definir la gramática del lenguaje y generar la mayor cantidad automática posible, por ejemplo, rostros, comandos sexp, población imenu?

Me preocupa principalmente la simplicidad y la corrección del modo, en lugar de su rendimiento en bruto, pero ciertamente me gustaría tener una idea aproximada de cuáles son las compensaciones (obviamente, si el rendimiento es demasiado bajo, sería inutilizable y por lo tanto, no es apropiado para usar).

Esto está algo relacionado con la escritura de un modo mayor, aunque está más avanzado, ya que estoy al tanto de todo en "Modos principales" en el manual de Emacs Lisp.

ACTUALIZACIÓN : He estudiado y hablado con el autor de Semantic y no es capaz de generar los mensajes de correo electrónicofont-lock , tiene el objetivo de proporcionar herramientas de nivel superior y no es algo que estoy buscando.

fommil
fuente
1
Iría por CEDET / Wisent, pero no lo he hecho yo mismo. Ver cedet.sourceforge.net/addlang.shtml
Stefan Kamphausen
CEDET me pareció bastante inmaculado, pero el analizador sonaba genial.
fommil
1
Parece que al menos la parte del analizador de CEDET ahora es parte de Emacs. Ver gnu.org/software/emacs/manual/html_node/semantic/index.html#Top
Stefan Kamphausen
2
CEDET es parte de Emacs, pero eso no significa que se mantenga, vea el Bug # 23792 .
npostavs
Ahora he leído el manual semántico / sabio (s) de principio a fin y no creo que me ayude a evitar escribir un motor de bloqueo de letras o sangría. El lexer todavía depende de las tablas de sintaxis. Tiene muchas características de alto nivel que no me interesan (no creo que funcionen o escalen satisfactoriamente para mi idioma), pero parece haber una brecha en las cosas de bajo nivel. ¿Me estoy perdiendo de algo? @StefanKamphausen
fommil

Respuestas:

4

Además del paquete SMIE (que de hecho puede usar una gramática BNF, pero generalmente no funcionará bien con una gramática BNF que fue diseñada para el analizador de estilo LALR habitual), hay un wisipaquete disponible de GNU ELPA ( http: //elpa.gnu .org / packages / wisi.html ):

El paquete wisi proporciona utilidades para usar analizadores LALR generalizados para hacer sangría, fuente y navegación. Vea el modo ada para un ejemplo de su uso.

No tengo experiencia con él y no conozco ningún paquete que no sea el modo ada que lo usa, pero el modo ada es bastante funcional, por lo que vale la pena echarle un vistazo. También espero que su autor esté encantado de ayudarlo a utilizarlo.

Stefan
fuente
esto se ve un poco genial, aunque está muy ligado ada-modey no estoy seguro de cuán generalizable es. Una de las preocupaciones que diría es que el analizador subyacente, sabio, de Semantic, a menudo realiza un análisis completo de archivos en lugar de localizado, y no es particularmente robusto para los errores de sintaxis, por lo que puede introducir una gran regresión de rendimiento. Supongo que uno necesitaría una prueba de concepto para ver, ya que no hay respuestas definitivas.
fommil