Prima di andare avanti permettetemi di affermare che uno degli aspetti più importanti quando si sviluppa un programma è quello di poter (e saper) scrivere correttamente un programma. Da quando sono nati i linguaggi di programmazione sono stati scritti libri e sono stati fatti corsi e seminari sul "come" scrivere programmi sensati. Quindi questa lezione e la prossima trattano (in maniera volutamente poco approfondita) il linguaggio di Backus-Naur e l'indentazione, il primo utile per scrivere programmi formalmente corretti ed il secondo importante per organizzare in maniera chiara il codice scritto.
Quando si esamina un linguaggio di programmazione occorre considerare due aspetti, la sintassi e la semantica: la prima rappresenta le regole che permettono di scrivere in maniera corretta le frasi del linguaggio, la seconda specifica il significato delle frasi, distinguendo tra quelle che hanno un significato e quelle che, invece, non ne hanno.
Per definire questi due aspetti occorre utilizzare un metalinguaggio, la cui definizione per la semantica risulta assai complessa, mentre per la sintassi il metalinguaggio è in genere costituito da un insieme di notazioni (non ambigue), simboliche o grafiche, che possono essere spiegate facilmente con il linguaggio naturale.
Nella fattispecie parleremo del linguaggio di Backus-Naur (BNF, Backus-Naur Form) utilizzato a livello internazionale nel campo della programmazione per definire la sintassi dei linguaggi. Quella che presentiamo qui è solamente una piccola infarinatura sul funzionamento e sulle ampie possibilità descrittive di questo linguaggio.
Per spiegare il corretto funzionamento prendiamo un piccolo sottoinsieme della lingua italiana scritta, in cui la sintassi del linguaggio è definita da alcune regole, ognuna delle quali descrive una struttura (o categoria sintattica). Proviamo a formalizzare la sintassi di una frase, attenendoci alla struttura seguente:
frase: soggetto verbo . soggetto: articolo nome articolo: one of il la
cane gatto fiume macchina prato
corre beve salta
|
Queste regole stabiliscono che una frase deve essere obbligatoriamente formata da un articolo, un nome, un verbo e dal segno di interpunzione "."; questo naturalmente vale per le regole che abbiamo definito, le quali possono essere estese anche in vari modi, vediamo sotto qualche esempio:
Elemento Opzionale - Un elemento opzionale viene generalmente contraddistinto dal pedice opt e indica appunto che tale elemento non è indispensabile per la costruzione di una "frase".
frase: soggetto aggettivo opt verbo . |
Elemento Ripetuto (o Ricorsivo) - A volte abbiamo bisogno che alcuni elementi si ripetano in maniera ricorsiva, questo per poter definire più elementi dello stesso tipo uno dopo l'altro.
frase: soggetto verbo complemento-list opt . complemento-list: complemento complemento complemento-list complemento: articolo nome preposizione nome |
Tale lista rappresenta una lista generica, ma esiste anche la lista separata da una virgola, il cui nome termina con il suffisso -clist, dove c rappresenta il termine inglese comma (virgola). Ripetendo l'esempio precedente
frase: soggetto verbo complemento-clist opt . complemento-clist: complemento complemento , complemento-clist complemento: articolo nome preposizione nome |
Elemento Incompleto - Quando abbiamo una lista di regole in forma incompleta, sarà usata l'espressione "...more..." per indicare che alcune alternative sono state omesse, secondo lo schema seguente:
element: alternative ... more ... |
A questo punto possiamo proporre la nuova sintassi estesa, basandoci su ciò che abbiamo appena illustrato:
frase: soggetto verbo complemento-list opt . soggetto: articolo aggettivo opt nome articolo: one of il la
mio tuo
cane gatto fiume macchina prato
corre beve salta
nella sul
|
Proviamo a costruire alcune frasi con questa sintassi:
- Il mio cane corre sul prato.
- Il tuo gatto salta sulla macchina.
- Il fiume beve sul mio cane.
- Il tuo prato corre nella macchina.
Come possiamo vedere tutte le frasi sono "sintatticamente" corrette, ma solo le prime due sono corrette dal punto di vista semantico. Questa è la cosa a cui il programmatore deve fare più attenzione, infatti un compilatore è in grado di trovare tutti gli errori sintattici, ma difficilmente individuerà una struttura programmativa senza senso, come ad esempio un ciclo che non finisce, sintatticamente corretto ma errore grave da evitare per il corretto funzionamento del programma e per una futura modifica del codice da parte di un'altra persona.
Quindi studiare la sintassi è indubbiamente molto utile e il linguaggio di Backus-Naur permette di comprendere le regole essenziali per scrivere un programma, ma il buonsenso e l'organizzazione logica di un programma sono cose che difficilmente si possono insegnare tramite un libro, ma si acquisiscono programmando giorno dopo giorno.
Questa lezione è liberamente tratta dal libro "Introduzione alla Programmazione ed elementi di strutture dati con il linguaggio C++" - A.Domenici, G.Frosini