J'ai récemment entrepris d'écrire un langage de programmation basé sur la pile. Cependant, avant de commencer à concevoir ma langue, je pensais que ce serait une bonne idée de lire et d'expérimenter avec les langues existantes basées sur la pile.
Cela m'amène au sujet de cet article. Je lisais l'article Wikipedia sur Forth , un langage basé sur la pile qui utilise des expressions de style postfix. Dans l'article, j'ai vu la déclaration suivante:
La flexibilité de Forth rend une grammaire BNF statique inappropriée, et elle n'a pas de compilateur monolithique. L'extension du compilateur nécessite uniquement d'écrire un nouveau mot, au lieu de modifier une grammaire et de changer l'implémentation sous-jacente.
D'après ma compréhension, dans le quatrième jargon, le terme "mot" semble être fondamentalement synonyme de "sous-programme". Compte tenu de cela, la déclaration ci-dessus semble étrange. Pourquoi exactement la possibilité de créer de nouvelles fonctions dans Forth rendrait-elle inappropriée une grammaire formelle pour Forth? Pourquoi auriez-vous besoin de réécrire la grammaire pour chaque nouveau sous-programme que vous définissez? En quoi l'écriture d'un nouveau mot dans l'environnement constitue-t-elle une extension du compilateur? L'instruction ci-dessus semble s'apparenter à dire qu'une grammaire formelle n'est pas appropriée pour Python car vous pouvez définir de nouvelles fonctions.
En fait, j'ai décidé d'essayer d'écrire une grammaire de style BNF pour un simple sous-ensemble de Forth ci-dessous:
program ::= stmt+
stmt ::= func | expr
func ::= ':' expr+ ';'
expr ::= INTEGER | word
word ::= ('+' | '-' | '*' | '/' )
La grammaire ci-dessus semble couvrir un sous-ensemble valide d'instructions Forth, et ne semble pas difficile à étendre pour couvrir toutes les instructions valides dans la langue Forth. De plus, si l'analyseur d'un compilateur implémente la grammaire ci-dessus, je ne vois pas comment le compilateur serait jamais étendu. Le compilateur ajoutera simplement de nouveaux mots à son environnement . Seul l'environnement est modifié. Il semble presque que l'extrait de Wikipedia ci-dessus confond le code de soulignement qui compose le compilateur (qui ne change pas) avec l'environnement du compilateur (qui change).
En résumé, pourquoi l'aptitude de Forth à définir de nouveaux mots (sous-programmes) est-elle inappropriée pour une grammaire écrite?