Recentemente ho intrapreso il compito di scrivere un linguaggio di programmazione basato su stack. Tuttavia, prima di iniziare a progettare la mia lingua, ho pensato che sarebbe stata una buona idea leggere e sperimentare con i linguaggi basati sugli stack esistenti.
Questo mi porta all'argomento di questo post. Stavo leggendo l' articolo di Wikipedia su Forth , un linguaggio basato sullo stack che usa espressioni di stile postfisso. Nell'articolo, ho visto la seguente dichiarazione:
Forth's flexibility makes a static BNF grammar inappropriate, and it does not have a monolithic compiler. Extending the compiler only requires writing a new word, instead of modifying a grammar and changing the underlying implementation.
Dalla mia comprensione, in Forth gergo, il termine "parola" sembra essere fondamentalmente sinonimo di "subroutine". Detto questo, la dichiarazione di cui sopra sembra strana. Perché esattamente la capacità di creare nuove funzioni in Forth potrebbe rendere inappropriata una grammatica formale per Forth? Perché dovresti dover riscrivere la grammatica per ogni nuova subroutine che definisci? In che modo scrivere una nuova parola nell'ambiente costituisce estendere il compilatore? L'affermazione sopra sembra simile 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 sottoinsieme semplice di Forth in basso:
program ::= stmt+
stmt ::= func | expr
func ::= ':' expr+ ';'
expr ::= INTEGER | word
word ::= ('+' | '-' | '*' | '/' )
La grammatica di cui sopra sembrerebbe coprire un sottoinsieme valido di affermazioni Forth, e non sembra così difficile da estendere a coprire tutte le affermazioni valide nella lingua Forth. Inoltre, se il parser di un compilatore implementa la grammatica di cui sopra, non riesco a vedere come il compilatore sarebbe mai stato esteso. Il compilatore aggiungerà semplicemente nuove parole al suo ambiente . Solo l'ambiente è cambiato. Sembra quasi che il precedente estratto da Wikipedia stia combinando il codice di sottolineatura che compone il compilatore (che non cambia) con l'ambiente del compilatore (che non cambia).
In sintesi, perché l'approvazione di Forth per definire nuove parole (subroutine) non è appropriata per una grammatica scritta?