Come convertire BNF in EBNF

Come posso convertire questo BNF in EBNF?

 ::= var ;  ::=  {;}  ::=  {,} :   ::=  {}  ::=  |  | _ 

EBNF o Extended Backus-Naur Form è ISO 14977: 1996 ed è disponibile in PDF da ISO gratuitamente * . Non è ampiamente utilizzato dagli standard linguistici del computer. C’è anche un documento che lo descrive, e quella carta contiene questa tabella che riassume la notazione EBNF.

  Table 1: Extended BNF Extended BNF Operator Meaning ------------------------------------------------------------- unquoted words Non-terminal symbol " ... " Terminal symbol ' ... ' Terminal symbol ( ... ) Brackets [ ... ] Optional symbols { ... } Symbols repeated zero or more times { ... }- Symbols repeated one or more times† = in Defining symbol ; post Rule terminator | in Alternative , in Concatenation - in Except * in Occurrences of (* ... *) Comment ? ... ? Special sequence 

L’operatore * viene utilizzato con un numero intero (senza segno) precedente; non sembra consentire numeri variabili di ripetizioni – come 1-15 caratteri dopo un carattere iniziale per creare identificatori lunghi fino a 16 caratteri. Questo lis

Nello standard, la parentesi aperta ( è chiamata simbolo del gruppo iniziale e parentesi chiusa ) è chiamata simbolo del gruppo finale ; parentesi quadra aperta [ è il simbolo dell’opzione di partenza e la parentesi quadra chiusa è il simbolo dell’opzione di fine ; parentesi aperta { è il simbolo di ripetizione iniziale e parentesi chiusa } è simbolo di ripetizione fine . Le virgolette singole ' sono chiamate prima virgolette e virgolette " sono simboli di seconda citazione .

* Sì, gratis – anche se puoi anche pagare 74 CHF se lo desideri. Guarda la nota sotto la scatola contenente gli oggetti addebitabili.


La domanda cerca di convertire questo “BNF” in EBNF:

  ::= var ;  ::=  {;}  ::=  {,} :   ::=  {}  ::=  |  | _ 

Il BNF non è definito formalmente, quindi dobbiamo fare qualche (facile) ipotesi su cosa significhi. La traduzione è routine (potrebbe essere meccanica se il BNF è formalmente definito):

 vardec = 'var', vardeclist, ';'; vardeclist = varandtype, { ';', varandtype }; varandtype = ident, { ',', ident }, ':', typespec; ident = letter, { idchar }; idchar = letter | digit | '_'; 

Le parentesi angolari devono essere rimosse attorno ai non-terminali; il simbolo di definizione ::= è sostituito da = ; i terminali come ; e _ sono racchiusi tra virgolette; la concatenazione è esplicitamente contrassegnata con,; e ogni regola è finita con ; . Il raggruppamento e le operazioni alternative nell’originale coincidono con la notazione standard. Nota che la concatenazione esplicita con la virgola significa che i non-terminali multi-parola non sono ambigui.


Uno studio casuale dello standard suggerisce che la {...}- notazione non fa parte dello standard, solo del documento. Tuttavia, come note jmmut in un commento , lo standard definisce il significato di {…}- :

§5.8 Termine sintattico

Quando un termine sintattico è un fattore sintattico seguito da un simbolo di eccezione seguito da un’eccezione sintattica rappresenta una sequenza di simboli che soddisfa entrambe le condizioni:

a) è una sequenza di simboli rappresentata dal fattore sintattico,

b) non è una sequenza di simboli rappresentati dall’eccezione sintattica.

NOTA – { "A" } - rappresenta una sequenza di uno o più A perché è un termine sintattico con un’eccezione sintattica vuota.

Rimuovi le parentesi angolari e inserisci tutti i terminali tra virgolette:

 vardec ::= "var" vardeclist; vardeclist ::= varandtype { ";" varandtype } varandtype ::= ident { "," ident } ":" typespec ident ::= letter { idchar } idchar ::= letter | digit | "_"