Di recente ho intrapreso il compito di scrivere un linguaggio di programmazione basato su stack. Prima di iniziare a progettare la mia lingua, tuttavia, ho pensato che sarebbe stata una buona idea leggere e sperimentare lingue esistenti basate su stack.
Questo mi porta all'argomento di questo post. Stavo leggendo l' articolo di Wikipedia su Forth , un linguaggio basato su stack che utilizza espressioni in stile postfix. Nell'articolo ho visto la seguente dichiarazione:
La flessibilità di Forth rende inappropriata una grammatica BNF statica e non ha un compilatore monolitico. L'estensione del compilatore richiede solo di scrivere una nuova parola, invece di modificare una grammatica e cambiare l'implementazione sottostante.
Da quanto ho capito, nel gergo di Forth, il termine "parola" sembra fondamentalmente sinonimo di "subroutine". Detto questo, l'affermazione di cui sopra sembra strana. Perché esattamente la possibilità di creare nuove funzioni in Forth renderebbe inappropriata una grammatica formale per Forth? Perché dovresti riscrivere la grammatica per ogni nuova subroutine che definisci? In che modo scrivere una nuova parola nell'ambiente costituisce l' estensione del compilatore? L'affermazione precedente sembra affine a dire che una grammatica formale è inappropriata per Python perché puoi definire nuove funzioni.
In effetti, ho deciso di provare a scrivere una grammatica in stile BNF per un semplice sottoinsieme di Forth di seguito:
program ::= stmt+
stmt ::= func | expr
func ::= ':' expr+ ';'
expr ::= INTEGER | word
word ::= ('+' | '-' | '*' | '/' )
La grammatica di cui sopra sembrerebbe coprire un sottoinsieme valido di istruzioni Forth, e non sembra così difficile da estendere per coprire tutte le dichiarazioni valide nella lingua Forth. Inoltre, se il parser di un compilatore implementa la grammatica sopra, non riesco a vedere come il compilatore sarebbe mai stato esteso. Il compilatore aggiungerà semplicemente qualsiasi nuova parola al suo ambiente . Viene modificato solo l'ambiente. Sembra quasi che il suddetto estratto di Wikipedia stia fondendo il codice di sottolineatura che compone il compilatore (che non cambia) con l'ambiente del compilatore (che cambia).
In sintesi, perché la capacità di Forth di definire nuove parole (subroutine) potrebbe essere inappropriata per una grammatica scritta?