Question

J'ai des problèmes avec BNF. Je ne peux pas dire ce qui semble être le moyen standard de faire les choses (s'il y en a un), et s'il existe ou non des types comme Char ou INT ou tout ce qui est déjà construit.

Cependant, mon principal problème n'est pas de comprendre comment fonctionne la partie du BNF en orthèse bouclé.
Étant donné quelque chose comme:

exp    : term                           {$$ = $1;}  
| exp '+' term                   {$$ = $1 + $3;}  
| exp '-' term                   {$$ = $1 - $3;}  
;  

(Ceci a été volé à partir de quelque part et est pour yacc / c)

Quelles sont réellement les choses dans les accolades bouclées? J'ai également regardé une chose similaire pour le générateur Happy Parser, et j'ai été confus de la même manière.

Était-ce utile?

La solution

Vous devez faire la distinction entre BNF en général (et EBNF) et la syntaxe YACC. Ce que les appareils orthopédiques signifient en BNF varient avec le dialecte; Cela signifie souvent «Choisissez l'une des alternatives», ou elle peut être associée à la répétition, ou aux deux. Dans EBNF (ISO 14977: 1996), '{...}' signifie répéter zéro ou plus de fois, et '{...} -' signifie répéter une ou plusieurs fois (et pourquoi c'est un '-' et non un '+' est mystérieux). L'IETF utilise RFC-5234 et son dialecte de BNF n'utilise pas du tout '{}'.

Dans une grammaire YACC, cependant, les accolades enferment les actions à effectuer lorsque la règle est appariée (réduite dans le jargon). Alors le '{$$ = $1;}«Action signifie« Attribuez la valeur correspondante par «terme» au résultat de la réduction de «exp :: = terme» (en utilisant une autre variante de BNF).

Autres conseils

Les trucs à l'intérieur des accolades bouclés sont en fait du code C qui est exécuté lorsque la règle correspondante est analysée. La $ Les symboles sont des espaces réservés qui sont remplacés par les valeurs réelles analysées par YACC: $$ est le résultat que vous souhaitez calculer, tandis que $1 à $n représentent les valeurs des symboles sur le côté droit de la règle.

Par exemple, la règle exp '+' term { $$ = $1 + $3; }, $1 se réfère à la exp et $3 est le term, donc cela dit que lorsque cette règle est analysée, ajouter exp et term Pour obtenir le résultat.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top