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?
Respuestas:
Una palabra "normal" es prácticamente una subrutina.
... pero puede escribir una palabra de definición definida por el usuario , que cambia el funcionamiento del compilador. Por ejemplo, una definición normalmente comienza con dos puntos (":") y termina con un punto y coma (";"). Pero si lo desea, puede (por ejemplo) cambiar lo que hace los dos puntos y, en el proceso, cambiar cómo se "compila" una definición de palabra, cambiando así el funcionamiento del compilador y la gramática del lenguaje que se reconoce.
Es por eso que dice que una gramática es inapropiada: la gramática puede literalmente cambiar de una parte del programa a otra. Cargar un diccionario puede cambiar no solo las subrutinas cuyos nombres se reconocen actualmente, sino también la gramática que se analiza cuando define una nueva palabra.
fuente
En Forth, puede ejecutar código en tiempo de compilación.
En particular, puede ejecutar código que consume palabras de la entrada. Por ejemplo, podría escribir un compilador de C en Forth, y luego llamarlo en tiempo de compilación, y luego escribir el resto de su programa en C.
Más comúnmente, puede definir palabras que leen argumentos del código fuente. Tradicionalmente, usted leería palabras de la misma manera que el compilador, pero no es obligatorio.
Por ejemplo, la
."
palabra (que imprime una cadena) no se lee hasta el siguiente espacio, se lee hasta el siguiente"
. Si intenta analizar el código: PRINTHELLO ." Hello ; : func2 world!" ;
sin un caso especial."
, encontrará que no se analiza correctamente.Por supuesto que puede añadir un caso especial para
."
que su gramática, pero la gramática todavía será incorrecto si el programador define su propia palabra como."
- por ejemplo, aquí está uno:: MY_PRINT POSTPONE ." ; IMMEDIATE
. Esta palabra es equivalente a."
; Puedo escribirMY_PRINT Hello ; world! "
y tu gramática necesita poder analizarla. Buena suerte con eso.fuente