Ich habe kürzlich die Aufgabe übernommen, eine stapelbasierte Programmiersprache zu schreiben. Bevor ich jedoch anfing, meine Sprache zu entwerfen, hielt ich es für eine gute Idee, vorhandene stapelbasierte Sprachen zu lesen und damit zu experimentieren.
Dies bringt mich zum Thema dieses Beitrags. Ich habe den Wikipedia-Artikel über Forth gelesen , eine stapelbasierte Sprache, die Ausdrücke im Postfix-Stil verwendet. In dem Artikel habe ich folgende Aussage gesehen:
Die Flexibilität von Forth macht eine statische BNF-Grammatik unangemessen und es gibt keinen monolithischen Compiler. Zum Erweitern des Compilers muss nur ein neues Wort geschrieben werden, anstatt eine Grammatik zu ändern und die zugrunde liegende Implementierung zu ändern.
Nach meinem Verständnis scheint der Begriff "Wort" im Forth-Jargon im Grunde genommen gleichbedeutend mit "Unterprogramm" zu sein. Angesichts dessen erscheint die obige Aussage seltsam. Warum genau würde die Fähigkeit, neue Funktionen in Forth zu erstellen, eine formale Grammatik für Forth unangemessen machen? Warum müssen Sie die Grammatik für jede neue Unterroutine, die Sie definieren, neu schreiben? Wie stellt ein neues Wort in der Umgebung Schreiben Verlängerung des Compilers? Die obige Aussage scheint zu sagen, dass eine formale Grammatik für Python ungeeignet ist, da Sie neue Funktionen definieren können.
Tatsächlich habe ich mich entschlossen, eine Grammatik im BNF-Stil für eine einfache Teilmenge von Forth zu schreiben:
program ::= stmt+
stmt ::= func | expr
func ::= ':' expr+ ';'
expr ::= INTEGER | word
word ::= ('+' | '-' | '*' | '/' )
Die obige Grammatik scheint eine gültige Teilmenge von Forth-Anweisungen abzudecken und scheint nicht so schwer zu erweitern, um alle gültigen Anweisungen in der Forth-Sprache abzudecken. Wenn der Parser eines Compilers die obige Grammatik implementiert, sehe ich nicht, wie der Compiler jemals erweitert werden würde. Der Compiler fügt seiner Umgebung einfach neue Wörter hinzu . Nur die Umgebung wird geändert. Es scheint fast so, als würde der obige Auszug aus Wikipedia den unterstrichenen Code, aus dem der Compiler besteht (der sich nicht ändert), mit der Umgebung des Compilers (die sich ändert) zusammenführen.
Zusammenfassend lässt sich sagen, warum Forths Fähigkeit, neue Wörter (Unterprogramme) zu definieren, für eine geschriebene Grammatik ungeeignet ist.