Недавно я взял на себя задачу написания стекового языка программирования. Однако прежде чем приступить к разработке своего языка, я подумал, что было бы неплохо прочитать и поэкспериментировать с существующими языками, основанными на стеке.
Это подводит меня к теме этого поста. Я читал статью в Википедии о Forth , основанном на стеке языке, который использует выражения в стиле постфикса. В статье я увидел следующее утверждение:
Гибкость Forth делает статическую грамматику BNF неуместной, и у нее нет монолитного компилятора. Расширение компилятора требует только написания нового слова вместо изменения грамматики и изменения базовой реализации.
Насколько я понимаю, в «Forth lingo» термин «слово» кажется синонимом «подпрограммы». Учитывая это, приведенное выше утверждение кажется странным. Почему именно способность создавать новые функции в Forth делает формальную грамматику для Forth неуместной? Зачем вам нужно переписывать грамматику для каждой новой подпрограммы, которую вы определяете? Как написание нового слова в среде означает расширение компилятора? Вышеприведенное утверждение похоже на то, что формальная грамматика не подходит для Python, потому что вы можете определять новые функции.
Фактически, я решил попытаться написать грамматику стиля BNF для простого подмножества Forth ниже:
program ::= stmt+
stmt ::= func | expr
func ::= ':' expr+ ';'
expr ::= INTEGER | word
word ::= ('+' | '-' | '*' | '/' )
Вышеприведенная грамматика, по-видимому, охватывает действительное подмножество операторов Forth, и, кажется, не так сложно расширить ее, чтобы охватить все действительные операторы на языке Forth. Кроме того, если синтаксический анализатор компилятора реализует вышеуказанную грамматику, я не вижу, как компилятор будет расширяться. Компилятор просто добавит любые новые слова в свою среду . Только среда изменилась. Кажется, что приведенный выше фрагмент из Википедии объединяет подчеркивающий код, который составляет компилятор (который не изменяется), со средой компилятора (которая действительно изменяется).
Итак, почему аблиции Форта для определения новых слов (подпрограмм) делают неуместными для письменной грамматики?