Quiero aprender cómo escribir un intérprete para un lenguaje de programación personalizado. ¿Cuáles son algunos buenos recursos para aprender a definir la sintaxis del idioma y construir un intérprete?

Eventualmente, si tiene tiempo e interés, busque una universidad local y tome su clase de “construcción de compiladores”, y también la clase sobre “semántica de lenguaje comparativo” (*) y quizás “teoría de autómatas”. Hay mucho que aprender sobre el tema si quieres saberlo bien. Un buen curso de compilación usará a menudo la implementación moderna de compiladores en Java: Andrew W. Appel, Jens Palsberg: 9780521820608: Amazon.com: Libros como libro de texto.

Sin embargo, mientras tanto, compre uno de los libros sobre ANTLR. La referencia definitiva ANTLR 4 de Terence Parr debería estar disponible en Amazon. ANTLR es una buena herramienta y el libro es relativamente fácil de leer, especialmente para los principiantes. En ningún caso, intente escribir un analizador de descenso recursivo escrito a mano para cualquier cosa no trivial. No es difícil, pero es fácil cometer errores en el proceso y terminar con algo que tiene bichos extraños (bugs) en los que intentaste ser inteligente, especialmente si dejas que tu idioma crezca. Si después de aprender ANTLR y quiere probar Yacc ++, escríbame un correo electrónico a Compiler Resources y le enviaré una versión GPL y el manual.

Eso debería ser suficiente para que comiences. Sin embargo, pregúntese por qué lo está haciendo y lea las respuestas en ¿Qué conocimiento me ayudaría a crear mi primer lenguaje de programación? Por ejemplo, aprenda más sobre los sistemas operativos, la historia de la programación, la teoría de autómatas, etc. ¿Mejor intuyo lo que quiero hacer? En serio, he visto a más personas implementar una muy buena idea en un lenguaje o herramienta única que nunca fue desarrollada, mantenida o incluso utilizada por nadie más que el autor y, en general, incluso el autor se dio por vencido en menos de una. Año en la mayoría de los casos.

*) La semántica es mucho más importante que la sintaxis. Una vez escribí un analizador para un compilador Verilog en un par de días usando Yacc ++. La sintaxis no es tan difícil o interesante. Luego escribí dos versiones de fondo para ello, uno que construía un intérprete que podía ejecutarse y el otro colocaba versiones sintetizables, uno usaba un formulario SSA con conteos de uso y recolección de basura, el otro usaba algo más para rastrear las conexiones, cada uno tomaba aproximadamente 9 meses para escribir. La única parte difícil fue darme cuenta de que no podía usar la misma semántica de “lenguaje intermedio” para ambos, y al tratar de hacerlo, fue el error más difícil que encontré, me tomó otros 9 meses diagnosticar que no podía hackear el dos juntos, y era mejor dejarlos como dos extremos separados. Eso va a la parte dura de la semántica. A menudo hay varias opciones, que pueden parecer igual de buenas al principio, pero algunas opciones hacen su vida más fácil y otras lo hacen más difícil, y la incorrecta puede llevarlo a tomar atajos que no podrá corregir fácilmente.

Recomiendo a los compiladores e intérpretes de escritura de Robert Mak : un enfoque de ingeniería de software . La edición original se centró en C ++ como lenguaje de implementación; la nueva edición utiliza Java en su lugar. De lo contrario, son similares, así que puedes elegir el que puedas leer con mayor fluidez.

Si yo fuera tú, iría por probar alguna mierda básica. Intenta analizar cosas simples como variables, asegúrate de que las matemáticas funcionen bien y luego ve a las funciones …
Probablemente, esto se ensuciará muy rápido. Entonces sabrás lo que hiciste mal al principio.
A partir de ahí, puede intentar comenzar de nuevo desde cero, o puede obtener más información sobre los temas en los que tuvo dificultades durante las pruebas.

EDITAR: También sugeriría que a usted no le interesen las actuaciones primero, eso lo retrasaría mucho.
EDIT2: Por favor, si termina con un buen intérprete, agregue múltiples valores de retorno para funciones, como en Python. ¡Esa es una gran característica del lenguaje!