Recentemente, assumi a tarefa de escrever uma linguagem de programação baseada em pilha. Antes de começar a projetar meu idioma, pensei que seria uma boa ideia ler e experimentar idiomas existentes baseados em pilha.
Isso me leva ao tópico deste post. Eu estava lendo o artigo da Wikipedia sobre Forth , uma linguagem baseada em pilha que usa expressões de estilo postfix. No artigo, vi a seguinte declaração:
A flexibilidade de Forth torna inadequada uma gramática estática de BNF e não possui um compilador monolítico. Estender o compilador requer apenas escrever uma nova palavra, em vez de modificar uma gramática e alterar a implementação subjacente.
No meu entender, no quarto idioma, o termo "palavra" parece ser basicamente sinônimo de "sub-rotina". Diante disso, a afirmação acima parece estranha. Por que exatamente a capacidade de criar novas funções no Forth tornaria inadequada uma gramática formal do Forth? Por que você precisaria reescrever a gramática para cada nova sub-rotina definida? Como escrever uma nova palavra no ambiente constitui estender o compilador? A declaração acima parece semelhante a dizer que uma gramática formal é inadequada para o Python porque você pode definir novas funções.
Na verdade, eu decidi tentar escrever uma gramática no estilo BNF para um subconjunto simples de Forth abaixo:
program ::= stmt+
stmt ::= func | expr
func ::= ':' expr+ ';'
expr ::= INTEGER | word
word ::= ('+' | '-' | '*' | '/' )
A gramática acima parece cobrir um subconjunto válido de declarações anteriores, e não parece tão difícil de estender para cobrir todas as declarações válidas no idioma anterior. Além disso, se o analisador de um compilador implementa a gramática acima, não consigo ver como o compilador seria estendido. O compilador simplesmente adiciona novas palavras ao seu ambiente . Somente o ambiente é alterado. Quase parece que o trecho acima da Wikipedia está confundindo o código subjacente que compõe o compilador (que não muda) com o ambiente do compilador (que muda).
Em resumo, por que a habilidade de Forth em definir novas palavras (sub-rotinas) torna inadequado para uma gramática escrita?