Backus-Naur Form: differenze tra le versioni

m
WPCleaner v1.38 - Fixed using Wikipedia:Check Wikipedia (Elemento HTML <a>)
(LiveRC : Annullate le modifiche di 195.223.151.243 (discussione), riportata alla versione precedente di Mandella85)
m (WPCleaner v1.38 - Fixed using Wikipedia:Check Wikipedia (Elemento HTML <a>))
Etichetta: Nowiki inseriti da dispositivo mobile
Una '''specifica BNF''' è un insieme di '''regole di derivazione''', ciascuna espressa nella forma:
 
:<nowiki><simbolo> ::= __espressione__</nowiki>
 
o nella forma equivalente:
 
:<nowiki><simbolo> → __espressione__</nowiki>
 
Le due forme sono assolutamente equivalenti. La prima forma (che verrà utilizzata nel seguito) utilizza caratteri ASCII standard ed è quella più utilizzata per scrivere grammatiche che devono essere utilizzate dai calcolatori e lette in file di testo. La seconda forma è meno utilizzabile nella pratica ma è comune nei testi e negli articoli di informatica teorica in quanto meglio esprime l'operazione di derivazione delle stringhe di un linguaggio a causa dell'applicazione delle regole di derivazione.
Immaginiamo di voler descrivere in modo formale, preciso e non ambiguo le regole che bisognerebbe seguire quando si scrive un indirizzo su una lettera. In realtà anche un "micro-linguaggio" come questo richiede una specifica BNF piuttosto articolata, e quindi ne riporteremo qui solo uno stralcio, applicando anche qualche semplificazione. In particolare cominciamo con un esempio che contiene (per ora) solo simboli non terminali; la sua specifica BNF potrebbe essere grosso modo come segue:
 
:<nowiki><indirizzo postale> ::= <destinatario> <indirizzo> <località></nowiki>
 
:<nowiki><destinatario> ::= [<titolo>] [<nome>|<iniziale>] <cognome> <a capo></nowiki>
 
:<nowiki><indirizzo> ::= <via> <numero civico> <a capo></nowiki>
 
:<nowiki><località> ::= [<CAP>] <comune> <provincia></nowiki>
 
Questo frammento di specifica può essere tradotto in italiano come segue:
Come esempio:
 
:<nowiki><indirizzo postale></nowiki>
:<nowiki>(applicando la regola 1 diventa)</nowiki>
:<nowiki><destinatario> <indirizzo> <località> </nowiki>
:<nowiki>(applicando la regola 2 diventa)</nowiki>
:<nowiki>[<titolo>] [<nome>|<iniziale>] <cognome> <a capo> <indirizzo> <località></nowiki>
:<nowiki>(applicando la regola 3 diventa)</nowiki>
:<nowiki>[<titolo>] [<nome>|<iniziale>] <cognome> <a capo> <via> <numero civico> <a capo> <località></nowiki>
 
eccetera. Il procedimento terminerà quando avremo un testo composto solo da terminali, che rappresenterà un indirizzo postale ''sintatticamente corretto''. Per mostrare una regola che includa dei terminali, consideriamo l'esempio del CAP:
 
:<nowiki><CAP> ::= <cifra><cifra><cifra><cifra><cifra></nowiki>
 
:<nowiki><cifra> ::= 0|1|2|3|4|5|6|7|8|9</nowiki>
 
Questo frammento dice che un CAP è composto da cinque cifre, e che le cifre sono '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'. Nella regola di derivazione per ''cifra'' non compaiono le [[parentesi angolari]] "<" e ">"; i simboli a destra, infatti, sono terminali, ovvero rappresentano proprio i simboli concreti che devono apparire nel testo finale di un indirizzo.
Per rappresentare queste situazioni era quindi necessario definire differenti regole di produzione per lo stesso simbolo nonterminale a sinistra, una per ciascuna delle sequenze possibili. Comunque queste estensioni (il cui scopo è quello di avere una rappresentazione più chiara e compatta della grammatica) sono riconosciute ormai universalmente come parte integrante della BNF. per rendersi conto del notevole vantaggio, sia di codice che di chiarezza, che si ottiene utilizzando questi costrutti notiamo che una delle regole di produzione viste sopra:
 
:<nowiki><destinatario> ::= [<titolo>] [<nome>|<iniziale>] <cognome> <a capo></nowiki>
 
senza i costrutti [] e | richiederebbe ben 6 regole di produzione:
 
:<nowiki><destinatario> ::= <cognome> <a capo></nowiki>
:<nowiki><destinatario> ::= <nome> <cognome> <a capo></nowiki>
:<nowiki><destinatario> ::= <iniziale> <cognome> <a capo></nowiki>
:<nowiki><destinatario> ::= <titolo> <cognome> <a capo></nowiki>
:<nowiki><destinatario> ::= <titolo> <nome> <cognome> <a capo></nowiki>
:<nowiki><destinatario> ::= <titolo> <iniziale> <cognome> <a capo></nowiki>
 
Invece le vere e proprie varianti o estensioni introducono modifiche più sostanziali, come i [[metacarattere|metacaratteri]] tipici delle [[espressione regolare|espressioni regolari]]. Alcuni esempi sono la [[EBNF]] (Extended Backus-Naur form) e la [[ABNF]] (Augmented Backus-Naur form), che conta, fra le sue applicazioni tipiche, la descrizione dei [[Protocollo di rete|protocolli]] [[Internet Engineering Task Force|IETF]].
207 173

contributi