Recientemente he emprendido la tarea de escribir un lenguaje de programación basado en pila. Sin embargo, antes de comenzar a diseñar mi lenguaje, pensé que sería una buena idea leer y experimentar con los lenguajes basados en pila existentes.
Esto me lleva al tema de esta publicación. Estaba leyendo el artículo de Wikipedia sobre Forth , un lenguaje basado en pila que usa expresiones de estilo postfix. En el artículo, vi la siguiente declaración:
La flexibilidad de Forth hace que una gramática BNF estática sea inapropiada y no tiene un compilador monolítico. Ampliar el compilador solo requiere escribir una nueva palabra, en lugar de modificar una gramática y cambiar la implementación subyacente.
Según tengo entendido, en la jerga de Forth, el término "palabra" parece ser básicamente sinónimo de "subrutina". Dado esto, la declaración anterior parece extraña. ¿Por qué exactamente la capacidad de crear nuevas funciones en Forth haría inapropiada una gramática formal para Forth? ¿Por qué necesitaría volver a escribir la gramática para cada nueva subrutina que defina? ¿Cómo escribir una nueva palabra en el entorno constituye extender el compilador? La afirmación anterior parece similar a decir que una gramática formal es inapropiada para Python porque puede definir nuevas funciones.
De hecho, decidí intentar escribir una gramática de estilo BNF para un subconjunto simple de Forth a continuación:
program ::= stmt+
stmt ::= func | expr
func ::= ':' expr+ ';'
expr ::= INTEGER | word
word ::= ('+' | '-' | '*' | '/' )
La gramática anterior parecería cubrir un subconjunto válido de declaraciones Forth, y no parece tan difícil de extender para cubrir todas las declaraciones válidas en el lenguaje Forth. Además, si el analizador de un compilador implementa la gramática anterior, no veo cómo se ampliará el compilador. El compilador simplemente agregará cualquier palabra nueva a su entorno . Solo se cambia el entorno. Casi parece que el extracto anterior de Wikipedia está combinando el código subyacente que compone el compilador (que no cambia) con el entorno del compilador (que sí cambia).
En resumen, ¿por qué la capacidad de Forth para definir nuevas palabras (subrutinas) es inapropiada para una gramática escrita?