2010-04-04 15 views
22

Voglio creare una sintassi del linguaggio. Ho letto un po 'di questi tre e non riesco davvero a vedere nulla che uno possa fare che un altro non possa fare. C'è qualche ragione per usarne uno rispetto all'altro? O è solo una questione di preferenza?BNF vs EBNF vs ABNF: quale scegliere?

risposta

25

Dovete pensare EBNF e ABNF come estensioni aiutarvi solo ad essere più concisi ed espressivi mentre sviluppate le vostre grammatiche.

Per esempio pensare a un simbolo non terminale opzionale, in un BNF grammatica definirebbe esso utilizzando simboli intermedi come:

A  ::= OPTIONAL OTHER 
OPTIONAL ::= opt_part | epsilon 

mentre con EBNF è possibile farlo direttamente utilizzando opzionale sintassi:

A ::= [opt_part] OTHER 

Poi dal momento che non c'è modo di esprimere la precedenza in un BNF bisogna noi e sempre simboli intermedi anche per le scelte nidificati:

BNF 
A ::= B C 
B ::= a | b | c 

EBNF 
A ::= (a | b | c) C 

Questo è vero per molti problemi di sintassi che sono consentiti in un grammatica EBNF o ABNF, grazie a zucchero sintattico, ma non con un normale BNF. ABNF estende EBNF, che consente di fare le cose più complicate, come specificare il numero di occorrenza di un simbolo può essere trovato insieme (cioè 4*DIGIT)

Quindi la scelta di un ABNF o un EBNF come lingua di la scelta della grammatica renderà più facile il tuo lavoro, dal momento che sarai più espressivo senza riempire la tua grammatica con simboli inutili che saranno generati comunque dal tuo generatore di parser, ma non ti preoccuperai di loro!

+2

Rispetto al 4 * DIGIT: lo stesso può essere fatto in EBNF utilizzando la stessa sintassi. – Kamarey

+4

Inoltre: IETF utilizza ABNF. ABNF è molto più pratico di EBNF. –

0

È possibile ottenere ciò che si desidera utilizzando uno di essi, ma ognuno è conciso ed efficace nel rappresentare la propria lingua in base a quali sono le funzionalità del linguaggio.

Ho letto BNF, EBNF e ABNF da wikipedia e ha descritto alcune differenze e perché EBNF e ABNF è entrato in immagine sulla base di BNF

4

Secondo Wikipedia, i valori letterali di stringa doppiamente quotati di ABNF sono case-insensitive e le corrispondenze con distinzione tra maiuscole e minuscole devono essere definite come valori ASCII numerici. Lo considero uno svantaggio.

Il testo letterale viene specificato mediante l'uso di una stringa racchiusa tra virgolette ("). Queste stringhe sono case-insensitive e il set di caratteri utilizzato è (US-) ASCII. Pertanto la stringa "abc" corrisponderà a "abc", "Abc", "aBc", "abC", "ABc", "AbC", "aBC" e "ABC". Per una corrispondenza con distinzione tra maiuscole e minuscole è necessario definire i caratteri espliciti: per corrispondere a "aBc" la definizione sarà %d97.66.99.

https://en.wikipedia.org/wiki/Augmented_Backus%E2%80%93Naur_Form#Terminal_values

Tuttavia, RFC 7405 sembra aggiungere stringhe letterali case-sensitive per ABNF.

https://tools.ietf.org/html/rfc7405

Problemi correlati