Devo usare una grammatica formale per il mio linguaggio di scripting interpretato

1

Ho un motore di scripting che ho appena pubblicato come progetto open source. È stato seduto sul mio harddrive aspettando circa un anno. Il mio motore ovviamente non è completo in alcun modo, ma funziona per script semplici. Ha un aspetto javascript-ish, ma non desidero rispettare le specifiche ECMA o altro.

Ora, la cosa importante su cui sto lavorando è migliorare la qualità del codice, lasciando il linguaggio che funziona così com'è (che ho alcuni test di regressione da "provare"). Non ha una grammatica formale e funziona così:

  1. preelaborazione / Tokenize. A questo punto rimuove gli spazi bianchi e taglia tutto in "token", che è fondamentalmente solo una struttura contenente una stringa e un "suggerimento" approssimativo su quale sia il token (numero, identificatore, operazione, ecc.) E alcune informazioni di debug come numero di riga
  2. Una classe ScriptingEngine che prende l'elenco di token e li analizza effettivamente e li esegue
  3. Una classe "ExpressionEvaluator" che prende un sottoinsieme dell'elenco dei token e crea un albero specifico di operazioni, valori e quindi esegue operazioni e simili e collassa l'albero in un unico valore

Il mio motore ha l'obiettivo di essere portabile (funziona ovunque .Net lo fa) e autonomo. Finora, questo "funziona", ma il codice è terribile e sono abbastanza sicuro che lo farò nel modo sbagliato.

Mi chiedo se una grammatica formale e tutto ciò che ne consegue potrebbe aiutare

Alcuni vantaggi che ho sentito di essere più formale con la grammatica

  • Specifica univoca della lingua
  • Più facile da mantenere / modificare
  • Più tradizionale / Più grande supporto della comunità?

E alcuni degli svantaggi

  • Alcune lingue possono essere molto difficili da ridurre a una grammatica formale, ad esempio Perl.
  • Una curva di apprendimento per qualcuno che non è a conoscenza (cioè io)
  • Generalmente si basano su strumenti come yacc e ANTLR, che introducono un altro passo nel flusso di lavoro e / o aggiungono dipendenze (che vorrei evitare)

Sebbene questo progetto sia in .Net, potrebbe ugualmente applicarsi a qualsiasi altro linguaggio di implementazione. Dovrei usare una grammatica formale? Qualcuno può espandere i pro / contro di entrambe le parti?

    
posta Earlz 25.03.2013 - 07:20
fonte

1 risposta

2

Prima di tutto, una grammatica formale non implica che tu debba usare un generatore di parser. Puoi scrivere un parser di discesa ricorsivo o qualunque cosa faccia galleggiare la tua barca.

Le grammatiche formali sono buone come documentazione. Aiutano i programmatori a decidere cosa significa codice estero e ti dice cosa è permesso / obbligatorio nella lingua.

Ad esempio, in javascript, devo sempre racchiudere una funzione letterale in parentesi se voglio chiamarla subito? Cioè, è permesso:

function(a1,a2) { ... }(42, "bacon").

Anche le grammatiche formali sono molto utili quando vuoi

  1. Realizza un'altra implementazione della lingua,
  2. la generazione del codice viene indirizzata alla lingua,
  3. O per fare analisi statiche della lingua.

Naturalmente, se si tratta di un linguaggio di script rapido e sporco questi punti sono meno importanti.

    
risposta data 25.03.2013 - 11:41
fonte