Нещодавно я взяв на себе завдання написання мови програмування на основі стека. Перш ніж я почав розробляти свою мову, я подумав, що було б хорошою ідеєю читати та експериментувати з існуючими мовами на основі стека.
Це підводить мене до теми цієї публікації. Я читав статтю у Вікіпедії про Forth , мовою на основі стека, яка використовує вирази стилю postfix. У статті я побачив таке твердження:
Гнучкість Forth робить статичну граматику BNF недоцільною, і вона не має монолітного компілятора. Розширення компілятора вимагає написання нового слова замість зміни граматики та зміни базової реалізації.
З мого розуміння, у Forth lingo термін "слово" здається в основному синонімом "підпрограми". З огляду на це, наведене твердження видається дивним. Чому саме можливість створення нових функцій у Forth зробить формальну граматику для Forth недоцільною? Чому вам потрібно переписати граматику для кожної нової визначеної підпрограми? Як написання нового слова в середовищі означає розширення компілятора? Вищенаведене твердження здається схожим на те, що формальна граматика не підходить для Python, оскільки ви можете визначати нові функції.
Насправді я вирішив спробувати написати граматику стилю BNF для простої підмножини Forth нижче:
program ::= stmt+
stmt ::= func | expr
func ::= ':' expr+ ';'
expr ::= INTEGER | word
word ::= ('+' | '-' | '*' | '/' )
Вищенаведена граматика, здається, охоплює дійсну підмножину тверджень Forth, і не здається, що важко розширити, щоб охопити всі дійсні висловлювання на мові Forth. Крім того, якщо аналізатор компілятора реалізує вищевказану граматику, я не бачу, як компілятор коли-небудь буде розширений. Компілятор просто додасть будь-які нові слова до свого оточення . Змінюється лише середовище. Це майже здається, ніби вищевказаний уривок з Вікіпедії суперечить підкреслюваному коду, який складається з компілятора (який не змінюється) із середовищем компілятора (який дійсно змінюється).
Підсумовуючи це, чому абліті Форта щодо визначення нових слів (підпрограм) роблять невідповідними для писемної граматики?