New Immissions/Updates:
boundless - educate - edutalab - empatico - es-ebooks - es16 - fr16 - fsfiles - hesperian - solidaria - wikipediaforschools
- wikipediaforschoolses - wikipediaforschoolsfr - wikipediaforschoolspt - worldmap -

See also: Liber Liber - Libro Parlato - Liber Musica  - Manuzio -  Liber Liber ISO Files - Alphabetical Order - Multivolume ZIP Complete Archive - PDF Files - OGG Music Files -

PROJECT GUTENBERG HTML: Volume I - Volume II - Volume III - Volume IV - Volume V - Volume VI - Volume VII - Volume VIII - Volume IX

Ascolta ""Volevo solo fare un audiolibro"" su Spreaker.
CLASSICISTRANIERI HOME PAGE - YOUTUBE CHANNEL
Privacy Policy Cookie Policy Terms and Conditions
Backus-Naur Form - Wikipedia

Backus-Naur Form

Da Wikipedia, l'enciclopedia libera.

La BNF (Backus-Naur Form o Backus Normal Form) è una metasintassi, ovvero un formalismo attraverso il quale è possibile descrivere la sintassi di linguaggi formali (il prefisso meta ha proprio a che vedere con la natura circolare di questa definizione). Si tratta di uno strumento molto usato per descrivere, in modo preciso e non ambiguo, la sintassi dei linguaggi di programmazione, dei protocolli di rete e così via; benché non manchino, in letteratura, esempi di sue applicazioni a contesti anche non informatici e addirittura non tecnologici. La BNF viene usata nella maggior parte dei testi sulla teoria dei linguaggi di programmazione (e molti testi introduttivi su specifici linguaggi).

In termini formali, la BNF può essere vista come un formalismo per descrivere grammatiche libere dal contesto.

La BNF fu proposta da John Backus durante la definizione del linguaggio di programmazione Algol. L'acronimo BNF era inizialmente inteso come Backus Normal Form ("forma normale di Backus"); su suggerimento di Donald Knuth, fu in seguito riletto come Backus-Naur Form, in onore di Peter Naur, un altro membro del comitato Algol e pioniere dei linguaggi di programmazione (e più in particolare della realizzazione di compilatori).


[modifica] Introduzione

Una specifica BNF è un insieme di regole di derivazione della forma

<simbolo> ::= <espressione>

dove <simbolo> viene detto un simbolo nonterminale e <espressione> è costituita da una o più sequenze di simboli (terminali, vedi sotto, o nonterminali) separate dalla barra verticale '|'. La regola esprime il fatto che il nonterminale a sinistra della regola può essere sostituito da una qualsiasi delle sequenze indicate sulla destra (come chiariremo a breve). In una sequenza, alcuni simboli o sottosequenze possono essere indicati come opzionali racchiudendoli fra parentesi quadre.

I simboli che non appaiono mai a sinistra di una regola di derivazione sono detti terminali. I terminali sono in un certo senso il punto di arrivo, perché rappresentano elementi che si troveranno effettivamente in un testo scritto secondo le regole sintattiche che la specifica BNF descrive. I nonterminali, viceversa, sono strumenti utilizzati esclusivamente dalla BNF; si può dire che essi rappresentano gli elementi astratti della grammatica....

[modifica] Esempio

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. La specifica BNF potrebbe essere grosso modo come segue:

<indirizzo postale> ::= <destinatario> <indirizzo> <località>
<destinatario> ::= [<titolo>] [<nome>|<iniziale>] <cognome> <a capo>
<indirizzo> ::= <via> <numero civico> <a capo>
<località> ::= [<CAP>] <comune> <provincia>

Questo frammento di specifica può essere tradotto in italiano come segue:

un indirizzo postale include un destinatario, seguito da un indirizzo, seguito da una indicazione di località;
il destinatario comprende sicuramente un cognome, a cui si possono far precedere, nell'ordine, un titolo (come Sig. o Dott. ecc.) e un nome o una iniziale;
l'indirizzo comprende necessariamente una indicazione di via (o piazza, viale, ecc.) e il numero civico;
l'indicazione della località comprende un codice di avviamento postale opzionale, seguito dal nome del comune e dalla provincia.

L'interpretazione più intuitiva della BNF è probabilmente quella generativa. In sostanza, immaginiamo di sostituire il nonterminale principale <indirizzo postale> con la sequenza indicata sulla destra, e poi ripetere il procedimento sostituendo via via un nonterminale con una sequenza data da una regola di derivazione per quel nonterminale.

Per esempio:

<indirizzo postale>
(applicando la regola 1 diventa)
<destinatario> <indirizzo> <località>
(applicando la regola 2 diventa)
[<titolo>] [<nome>|<iniziale>] <cognome> <a capo> <indirizzo> <località>
(applicando la regola 3 diventa)
[<titolo>] [<nome>|<iniziale>] <cognome> <a capo> <via> <numero civico> <a capo> <località>

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:

<CAP> ::= <cifra><cifra><cifra><cifra><cifra>
<cifra> ::= 0|1|2|3|4|5|6|7|8|9

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' e '0'. 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.

Una specifica come quella sopra (una volta completata) può essere utilizzata per stabilire se un indirizzo postale è sintatticamente corretto. Si dirà infatti che un testo è sintatticamente corretto rispetto alla sintassi descritta da un insieme di regole BNF, se può essere ricavato partendo dal nonterminale principale applicando ripetutamente le regole di sostituzione, un numero finito di volte.

La specifica della sintassi di un linguaggio di programmazione ha tipicamente un nonterminale principale <programma>, e un insieme di regole di derivazione che descrivono come un programma è strutturato in moduli, i moduli in istruzioni, le istruzioni in espressioni, e via dicendo. Un testo scritto da un programmatore si potrà considerare sintatticamente corretto (e quindi effettivamente un programma nel linguaggio in questione) se è possibile ricavarlo per sostituzioni successive a partire dal nonterminale <programma>. Questo tipo di verifica, dato il testo da verificare e una specifica BNF, si presta a essere eseguito in modo automatico. Una verifica di questo tipo rappresenta infatti una parte importante del funzionamento dei compilatori.

Può essere interessante notare che è possibile descrivere, usando la BNF, la sintassi della BNF stessa.

[modifica] Varianti

Sono state proposte, in letteratura, molte varianti ed estensioni della BNF. In effetti, persino le parentesi quadre utilizzate nell'esempio riportato sopra non erano previste dalla BNF originale, ma sono state introdotte in seguito dai progettisti della IBM per descrivere la sintassi del linguaggio PL/1; si tratta comunque di un'estensione riconosciuta ormai universalmente. Vere e proprie varianti o estensioni introducono modifiche più sostanziali, come i metacaratteri tipici delle 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 protocolli IETF.

Static Wikipedia (no images)

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - bcl - be - be_x_old - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - co - cr - crh - cs - csb - cu - cv - cy - da - de - diq - dsb - dv - dz - ee - el - eml - en - eo - es - et - eu - ext - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gan - gd - gl - glk - gn - got - gu - gv - ha - hak - haw - he - hi - hif - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kaa - kab - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mdf - mg - mh - mi - mk - ml - mn - mo - mr - mt - mus - my - myv - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - quality - rm - rmy - rn - ro - roa_rup - roa_tara - ru - rw - sa - sah - sc - scn - sco - sd - se - sg - sh - si - simple - sk - sl - sm - sn - so - sr - srn - ss - st - stq - su - sv - sw - szl - ta - te - tet - tg - th - ti - tk - tl - tlh - tn - to - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu -

Static Wikipedia 2007 (no images)

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - bcl - be - be_x_old - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - co - cr - crh - cs - csb - cu - cv - cy - da - de - diq - dsb - dv - dz - ee - el - eml - en - eo - es - et - eu - ext - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gan - gd - gl - glk - gn - got - gu - gv - ha - hak - haw - he - hi - hif - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kaa - kab - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mdf - mg - mh - mi - mk - ml - mn - mo - mr - mt - mus - my - myv - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - quality - rm - rmy - rn - ro - roa_rup - roa_tara - ru - rw - sa - sah - sc - scn - sco - sd - se - sg - sh - si - simple - sk - sl - sm - sn - so - sr - srn - ss - st - stq - su - sv - sw - szl - ta - te - tet - tg - th - ti - tk - tl - tlh - tn - to - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu -

Static Wikipedia 2006 (no images)

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - bcl - be - be_x_old - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - co - cr - crh - cs - csb - cu - cv - cy - da - de - diq - dsb - dv - dz - ee - el - eml - eo - es - et - eu - ext - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gan - gd - gl - glk - gn - got - gu - gv - ha - hak - haw - he - hi - hif - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kaa - kab - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mdf - mg - mh - mi - mk - ml - mn - mo - mr - mt - mus - my - myv - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - quality - rm - rmy - rn - ro - roa_rup - roa_tara - ru - rw - sa - sah - sc - scn - sco - sd - se - sg - sh - si - simple - sk - sl - sm - sn - so - sr - srn - ss - st - stq - su - sv - sw - szl - ta - te - tet - tg - th - ti - tk - tl - tlh - tn - to - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu

Static Wikipedia February 2008 (no images)

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - bcl - be - be_x_old - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - co - cr - crh - cs - csb - cu - cv - cy - da - de - diq - dsb - dv - dz - ee - el - eml - en - eo - es - et - eu - ext - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gan - gd - gl - glk - gn - got - gu - gv - ha - hak - haw - he - hi - hif - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kaa - kab - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mdf - mg - mh - mi - mk - ml - mn - mo - mr - mt - mus - my - myv - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - quality - rm - rmy - rn - ro - roa_rup - roa_tara - ru - rw - sa - sah - sc - scn - sco - sd - se - sg - sh - si - simple - sk - sl - sm - sn - so - sr - srn - ss - st - stq - su - sv - sw - szl - ta - te - tet - tg - th - ti - tk - tl - tlh - tn - to - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu