APRES L'ANALYSE SYNTAXIQUE
- Beaucoup des règles que doivent respecter les programmes
sont difficiles
à exprimer par la syntaxe (p.ex. la déclaration d'une
fonction doit inclure
au moins une instruction return)
- voire impossibles (p.ex. une variable utilisée doit
être déclarée,
et toutes les règles sur les types)
- Traduction en code machine: très souvent en deux
étapes (ou plus):
traduction en code intermédiaire avec les
caractéristiques d'un code machine
mais sans les particularités d'une machine; l'argument
m × n
- Ecrire le compilateur en quel langage: en code machine
(historique),
en un langage de haut niveau (questions des poules et des oeufs),
génération automatique à partir d'une description
de la machine cible
(marche moins bien que pour l'analyse syntaxique)
- Questions intéressantes sur l'affectation
d'espace mémoire pour les
variables
(éventuellement récursives) de façon que
l'accès aux variables
et les appels des procédures soient efficaces
- Générer du code efficace; plutôt corriger le
code généré
- Point de départ: un arbre syntaxique produit par
l'analyse;
cet arbre peut être réel ou virtuel
ATTRIBUTS (SYNTHETISES)
Une méthode très utile pour spécifier les
propriétés non-algébriques
des programmes et leur traduction.
EXEMPLES
- Une propriété non-algébrique que tout
programme
doit vérifier: un attribut valable
qui est vrai si chaque identificateur utilisé dans un programme
est aussi déclaré quelque part dans le programme.
- Une propriété qui pourrait être utile pour
la génération de code
performant: les fonctions sans effets de bord.
YACC/BISON
Yacc/Bison permet d'utiliser des attributs d'une façon
très restreinte:
chaque noeud peut avoir un seul attribut!
dans les règles, l'attribut du symbole à gauche s'appelle
$$ et ceux
des symboles à droite s'appellent $1, $2 etc.
pour avoir plusieurs attributs il suffit de déclarer des types
union
le programmeur doit décider l'ordre de calcul des attributs;
et les sommets de l'arbre sont traités dans l'ordre d'un
parcours
postfixe de l'arbre.
Comment utiliser BISON?
- un fichier contient la grammaire: bison fichier.y
- format des productions de la grammaire: G : D1 | D2 | D3 ;
- bison produit un programme C: fichier.tab.c
- fonction yyparse(); peut (doit) être appelée dans
le main()
- il faut fournir un analyseur lexical (par exemple celui produit
par flex)
Format du fichier
un exemple:
%{
#define YYSTYPE int
#include <math.h>
%}
%token NUMBER POINTV ID
%%
statement : expression POINTV ;
expression : NUMBER | ID ;
%%
#include <ctype.h>
#include "lex.yy.c"
main()
{
yyparse();
}
yyerror(char *s) {
printf ("%s\n",s);
}
Communication avec
l'analyse lexicale
- #include "lex.yy.c"
- grammaire: les %token dans le bison donnent des
valeurs qui peuvent
être retournées par le flex
- attributs: le type des attributs est donné par YYSTYPE
la valeur de l'attribut d'un terminal est donné par un yylval=??;
dans le flex.
par exemple:
[0-9]+ {yylval=atoi(yytext); return NUMBER;}
Calcul des attributs
(et autres)
Chaque production de la grammaire peut être suivie d'instructions
C
(en accolades), par exemple des calculs des attributs:
{$$ = $1 + $2;}
File translated from
TEX
by
TTH,
version 3.05.
On 1 Mar 2005, 11:23.