Cose tecniche noiose
Per prima cosa fatevi ringraziare: in tanti siete venuti a dare un’occhiata su questo sito e sembra che l’idea vi sia piaciuta molto.
Non so dovremmo esserne felici oppure atterriti, ma abbiamo deciso in maniera non democratica di vedere solo il lato positivo.
Vi rubo solo altre due righe per ringraziare due pagine Facebook in particolare:
Roba da Informatici e Generatore automatico di post di Salvini per il gentilissimo feedback ricevuto.
Questo post è dedicato ai tre o quattro nerd che si sono chiesti come sia possibile creare un linguaggio di programmazione come RusPython.
Per cominciare, RusPython non è un fork di TrumScript, la logica è diversa e (non per vantarsi) RusPython ha anche qualche funzione in più.
Detto questo, come tutti i compilatori/interpreti che ammorbano il mondo con la loro presenza, RusPython è composto da 2 elementi fondamentali.
Il primo è il lexer
che si occupa di analizzare i caratteri del codice sorgente ruspy e generare una lista di Token.
Ad esempio quando il lexer
si imbatte nel carattere +
, lo etichetta come PLUS
e continua a esaminare il resto del codice.
Qando invece legge Renzi
lo etichetta come NAME
, 55
come NUMBER
e così via.
La seconda componente fondamentale è il parser
. Il parser
legge i token creati dal lexer e cerca di applicare una regola della grammatica generatrice del RusPython che potete trovare qui.
Potremmo parlare della grammatica per ore, ma giusto per fare una piccola introduzione, la grammatica definisce com’è fatto programma ruspy valido.
Un program
ad esempio è una lista di statement
che termina con il token PadaniaLibera
; uno statement
può essere il token ESPELLI
seguito da uno statement
.
Una volta capita quale regola applicare, il parser
esegue il metodo associato alla regola e ritorna una stringa.
La stringa finale ottenuta al termine del lavoro del parser è un normale listato in Python che posso, più o meno, far eseguire all’interprete Python così com’è.
Più o meno perché ci sono alcuni aspetti (come i parametri di input in uno script) che devono essere aggiunti al volo.
Per implementare lexer
e parser
ho usato una libreria chiamata PLY che mi ha snellito di molto il lavoro. L’alternativa è implementarvi il vostro lexer
e parser
casalingo come fa TrumScript. Qualunque sia la via del guerriero che sceglierete la struttura base rimane la stessa.
Per il momento è tutto, se qualcuno è interessato all’argomento può contattarci e magari scriveremo qualche altro articolo più dettagliato sull’argomento.
PadaniaLibera