2010-10-27 36 views
3

J'ai des problèmes avec BNF. Je ne peux pas dire ce qui semble être la manière standard de faire les choses (s'il y en a une), et s'il y a des types comme char ou int ou quoi que ce soit déjà construit.Que se passe-t-il entre {et} lors de l'écriture de BNF?

Cependant, mon problème principal n'est pas comprendre comment fonctionne la partie de la BNF dans les accolades.
Étant donné quelque chose comme:

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

(Ceci a été haut la main volé quelque part, et pour yacc/C)

Quelles sont les choses dans les accolades en train de dire? J'ai aussi regardé une chose similaire pour le générateur de parser heureux, et j'ai été aussi confus.

+0

Est-ce ce devoir? – jcolebrand

+0

Oh, et ce n'est pas vraiment BNF. –

+0

@drachenstern: Alors que cette question est principalement posée parce que je regarde BNF parce que je vais devoir écrire quelque chose pour Happy pour créer un analyseur pour un langage jouet pour une tâche de compilateur, ce n'est pas vraiment une question de devoirs. Je ne comprenais pas ce que je regardais quand je cherchais sur Google, d'où le fait de demander. Ce n'est donc pas un travail à faire, mais c'est lié au travail prévu pour mon diplôme. Même alors, ce n'est pas comme si je demandais à quelqu'un de travailler pour moi, je suis après une explication. – Squidly

Répondre

2

Vous devez distinguer entre BNF en général (et EBNF) et la syntaxe Yacc. Ce que signifient les accolades dans BNF varie avec le dialecte; cela signifie souvent «choisir l'une des alternatives», ou il peut être associé à la répétition, ou les deux. Dans EBNF (ISO 14977: 1996), '{...}' signifie répéter zéro ou plusieurs 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 contiennent les actions à effectuer lorsque la règle est mise en correspondance (réduite dans le jargon). Ainsi, l'action '{$$ = $1;}' signifie 'affecter la valeur correspondant à' term 'au résultat de la réduction' exp :: = term '(en utilisant une autre variante de BNF).

2

Le contenu des accolades est en réalité du code C qui est exécuté lorsque la règle correspondante est analysée. 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 fait référence à la exp et $3 est le term, donc ce dit que lorsque cette règle est analysée, ajouter exp et term pour obtenir le résultat.