2013-02-17 2 views
4

Comment puis-je convertir ce BNF en EBNF?Comment convertir BNF en EBNF

<vardec> ::= var <vardeclist>; 
<vardeclist> ::= <varandtype> {;<varandtype>} 
<varandtype> ::= <ident> {,<ident>} : <typespec> 
<ident> ::= <letter> {<idchar>} 
<idchar> ::= <letter> | <digit> | _ 
+3

double possible de [Conversion BNF à EBNF] (http://stackoverflow.com/questions/8101594/converting-bnf-to-ebnf) – CharlesB

+0

Qu'est-ce que vous avez exactement des problèmes avec? –

+1

La question "duplication possible" a une réponse qui contient deux liens vers le matériel SO. Il pose certainement une question à peu près équivalente; il n'a cependant pas une très bonne réponse, donc ce n'est pas un bon doublon. –

Répondre

0

Retirez les crochets et mettre tous les terminaux en guillemets:

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

En première approximation; il y a quelques détails à corriger. –

9

EBNF ou Extended Backus-Naur Form est ISO 14977:1996, et est disponible en format PDF à partir de ISO gratuitement *. Il n'est pas largement utilisé par les normes de langage informatique. Il y a aussi un paper qui le décrit, et ce document contient ce tableau résumant la notation 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'opérateur * est utilisé avec un précédent (unsigned) nombre entier; il ne semble pas autoriser de nombres de répétitions variables, tels que 1 à 15 caractères après un caractère initial, pour faire des identifiants jusqu'à 16 caractères. Ce lis

Dans la norme, parenthèse ouverte ( est appelé symbole de groupe de démarrage et parenthèse fermante ) est appelé symbole de groupe final; le crochet carré ouvert [ est le symbole d'option de début et le crochet fermé est symbole d'option de fin; accolade ouverte { est commencer le symbole de répétition et fermer accolade } est symbole de fin de fin. Les guillemets simples ' sont appelés le premier guillemet et les guillemets " sont le deuxième guillemet.

* Oui, gratuit - même si vous pouvez également payer 74 CHF si vous le souhaitez. Regardez la note sous la boîte contenant les articles imputables.


La question vise à transformer cette « BNF » en EBNF:

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

La BNF est pas formellement défini, nous devons donc faire un peu (facile) devine à ce que cela signifie. La traduction est la routine (ce pourrait être mécanique si le BNF est formellement défini):

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

Les supports angle doivent être retirés autour de non-terminaux; le symbole de la définition ::= est remplacé par =; les terminaux tels que ; et _ sont inclus entre guillemets; la concaténation est explicitement marquée avec ,; et chaque règle est terminée avec ;. Le regroupement et les opérations alternatives dans l'original coïncident avec la notation standard. Notez que la concaténation explicite avec la virgule signifie que les non-terminaux multi-mots sont sans ambiguïté.


étude Casual de la norme elle-même suggère que la notation {...}- ne fait pas partie de la norme, juste du papier.Cependant, comme jmmut notes dans un comment, la norme ne définit le sens de {…}-:

§5.8 terme Syntactic

...

Lorsqu'un terme syntaxique est un facteur syntaxique suivi par un symbole excepté suivi d'une syntaxe-exception représente n'importe quelle séquence de symboles qui satisfait à la fois les conditions:

a) c'est une séquence de symboles représentée par le facteur syntaxique,

b) ce n'est pas une séquence de symboles représentée par l'exception syntaxique .

...

NOTE - { "A" } - représente une séquence d'un ou plusieurs A est parce qu'il est un terme syntaxique avec un vide-exception syntaxique.

+0

Merci, ça m'a aidé! –

+0

Je voudrais noter que la notation '{...} -' ** fait ** partie de la norme (fin de la page 4, sous 5.8 terme syntaxique), mais pas de manière intuitive. On montre comment on ne peut utiliser que les définitions de '{', '}' et '-' une" une ou plusieurs "règle:' ee = {"A"} -, "E"; 'définit" AE " , "AAE", "AAAE", etc. > NOTE {"A"} - représente une séquence d'un ou de plusieurs A parce que c'est un terme syntaxique avec une exception syntaxique vide. – jmmut

+1

@jmmut: Merci. Bien repéré. C'est un morceau de minimalisme intéressant. J'ai mis à jour ma réponse. Je ne suis pas sûr que ce soit trop-tuer; Ça pourrait être. –