2016-02-18 1 views
1

Je suis en train de lire un book sur la construction d'un compilateur. Au chapitre 4, il passe beaucoup de temps à parler de la grammaire des attributs, ce qui m'embrouille beaucoup.pourquoi avons-nous besoin d'attribuer la grammaire dans l'analyse sémantique?

Pourquoi en avons-nous besoin? et comment est-il utilisé dans le compilateur de production?

enter image description here

Il me semble que la grammaire d'attribut est utilisé pour décorer un arbre d'analyse syntaxique dans l'arbre de syntaxe abstraite. Mais pourquoi ne pouvons-nous pas construire des AST dans la phase d'analyse?

Par exemple, dans OCaml, je peux décrire AST comme ceci:

type ast = 
    | Var of string 
    | Num of int 
    | If of test * then * else 
    ... 
    ... 

Pour construire un si le nœud, je peux simplement faire If (test, then, else)

+0

Il n'est en effet pas impératif que vous _d'utiliser une grammaire attribuée et/ou une AST dans votre compilateur. C'est juste une façon commune de faire les choses. –

+0

En ce qui concerne votre question sur "pourquoi ne pouvons-nous construire STs dans la phase d'analyse?" Pendant l'analyse, nous construisons AST et le transmettons à l'analyseur sémantique. L'analyseur sémantique ajoute plus d'informations aux nœuds de l'AST (par exemple son type, sa valeur, etc.) qui ne peuvent pas être ajoutés pendant la phase de syntaxe. –

Répondre

3

Si vous avez écrit beaucoup de compilateurs différents que vous pourriez obtenir fatigué de reproduire les mêmes types de code encore et encore. Des choses comme les grammaires d'attribut réduisent la quantité de code standard en déplaçant certaines choses évidentes dans la définition grammaticale.

Vous pouvez poser la même question sur les systèmes comme yacc - pourquoi ne pas simplement écrire du code pour faire l'analyse? La réponse est que, après avoir écrit quelques compilateurs, vous en avez assez et commencez à vouloir de l'aide de plus haut niveau.

Un autre avantage est que (si le système est implémenté correctement), vous évitez la possibilité de faire des erreurs dans votre code standard.

+0

Existe-t-il un compilateur simple quelque part en ligne qui utilise la grammaire d'attribut? Le livre que je suis en train de lire contient beaucoup de théorie selon laquelle un exemple de code peut m'aider. –

+0

Vous pouvez essayer les exemples de code sur le site compagnon pour le livre: http://booksite.elsevier.com/9780124104099/ Supposément, ils ont été étendus dans des programmes exécutables complets. Je ne connais pas de compilateurs spécifiques utilisant des grammaires d'attributs - désolé. –