Niedawno podjąłem się zadania napisania języka programowania opartego na stosie. Zanim jednak zacząłem projektować swój język, pomyślałem, że dobrym pomysłem byłoby czytanie i eksperymentowanie z istniejącymi językami stosowymi.
To prowadzi mnie do tematu tego postu. Czytałem artykuł w Wikipedii na temat Forth , języka opartego na stosie, który używa wyrażeń w stylu postfiksowym. W artykule widziałem następujące oświadczenie:
Elastyczność Fortha sprawia, że statyczna gramatyka BNF jest nieodpowiednia i nie ma monolitycznego kompilatora. Rozszerzenie kompilatora wymaga tylko napisania nowego słowa, zamiast modyfikacji gramatyki i zmiany podstawowej implementacji.
Z mojego zrozumienia, w języku żargonu Forth, termin „słowo” wydaje się zasadniczo równoznaczny z „podprogramem”. Biorąc to pod uwagę, powyższe stwierdzenie wydaje się dziwne. Dlaczego właśnie możliwość tworzenia nowych funkcji w Forth sprawia, że formalna gramatyka dla Forth jest nieodpowiednia? Dlaczego musiałbyś przepisywać gramatykę dla każdego nowego podprogramu, który zdefiniujesz? W jaki sposób pisanie nowego słowa w środowisku stanowi rozszerzenie kompilatora? Powyższe stwierdzenie wydaje się podobne do stwierdzenia, że gramatyka formalna jest nieodpowiednia dla Pythona, ponieważ można definiować nowe funkcje.
W rzeczywistości postanowiłem napisać gramatykę w stylu BNF dla prostego podzbioru Forth poniżej:
program ::= stmt+
stmt ::= func | expr
func ::= ':' expr+ ';'
expr ::= INTEGER | word
word ::= ('+' | '-' | '*' | '/' )
Powyższa gramatyka wydaje się obejmować prawidłowy podzbiór zdań Fortha i nie wydaje się, że trudno jest rozszerzyć ją na wszystkie prawidłowe instrukcje w języku Forth. Ponadto, jeśli parser kompilatora implementuje powyższą gramatykę, nie widzę, jak kiedykolwiek kompilator mógłby zostać rozszerzony. Kompilator po prostu doda nowe słowa do swojego środowiska . Zmienia się tylko środowisko. Wydaje się, że powyższy fragment Wikipedii łączy w sobie kod podkreślający, który tworzy kompilator (który się nie zmienia) ze środowiskiem kompilatora (który się zmienia).
Podsumowując, dlaczego nieumiejętność Fortha w zakresie definiowania nowych słów (podprogramów) jest nieodpowiednia dla gramatyki pisanej?