2. Bibliographie pour aujourd'hui
Alfred V. Aho, Monica S. Lam, Ravi Sethi, Jeffrey
D. Ullman, Compilers: Principles, Techniques,
and Tools (2nd Edition)
– Chapitre 5
• 5.1
• 5.2
• 5.3
8. Analyse sémantique
Analyse sémantique
Programmes lexicales corrects Analyse lexicale
Analyse syntactique
Programmes syntaxiquement correctes
Programmes qui compilent sans erreur
Programmes en cours
d'exécution sans erreurs
9. Analyse sémantique
Nous sommes intéressés par
Annotez l'arbre de syntaxe avec des informations de
type
Créer le tableau des symboles
Ajouter des noeuds "typecast"
La plupart de l'analyse sémantique se réfère à la
gestion du contexte
13. SDD Exemple
Production Règle
L-> E L.val = E.val
E -> E1 + T E.val = E1.val + T.val
E -> T E.val = T.val
T -> T1 * F T.val = T1.val * F.val
T -> F T.val = F.val
F -> ( E ) F.val = E.val
F-> digit F.val = digit.text
14. Translation dirigée par syntaxe
• Syntax-Directed Translation (SDT)
– Grammaire
– Attributs
– Règles (pour les attributs)
– Actions
E -> E + E { … }
15. Arbre de syntaxe abstraite
Parse Tree AST
function
FUNCTION s LP parameters
a COMMA parameters
b
RP LB statements
return
RETURN expression
a
PLUS
b
PV
RB
FUNCTION (name: s,
parameters: [a, b])
RETURN
PLUS
VAR (name: a)
VAR (name: b)
16. Exemple de AST
function factorial (n)
{
var f = 1;
for (var i=1; i < n; i++)
f = f * i;
return f;
}
17. Exemple de AST
{
“type”: “function”,
“name”: “factorial”,
“parameters”: {
“n”: “var”
},
statements: [ … ]
}
18. Contexte (scope)
Les contextes mémorisent les déclarations
Nom et structure de type
Nom de variable
Nom, type de retour et les paramètres pour les fonctions
Lorsqu'elles sont déclarées, les variables, les types et les
fonctions sont ajoutés au contexte
Lorsqu'ils sont consultés, ils sont recherchés dans le
contexte actuel
Les contextes sont imbriqués
20. Contexte - exemple
C++
Locale (block { … } ou fichier)
Label - le contexte c’est la fonction
Attributs/méthodes – toute la classe.
Java
Niveaux: Package, Class, Inner class, Method
21. Contexte et espace de nom
C:
typedef int foo; foo foo;
int int;
Java
Integer Integer = new Integer(4);
C, Java:
int foo(x) { return x+4;}
int f() { int foo=3; return foo(foo);}
22. Implémentation du contexte
Tableau de symbole
Actions:
Nouveau contexte
Ajoute un symbole
Retrouve un symbole
Ferme le contexte
Pile ou hashtable
23. Pile
var a;
function work (p)
{
var i;
{
var a;
let l;
}
}
• l: var
Inside
{…}
• p: var
• i: var
• a: var
work
• a: var
• work: function
Program
24. Hashtable
var a;
function work (p)
{
var i;
{
var a;
let l;
}
}
Symbol Type
a_program var
work_program function
i_work var
a_work var
l_work_inner var
25. Exemple de AST
function factorial (n) // make new context (function)
{
// add variable n to conext
var f = 1; // add variable f to conext
for (var i=1; i < n; i++) // make new context (for),
//add variable i to context (function)
f = f * i;
// destroy context (for)
return f;
// destroy context (function)
}
26. Contexte statique et dynamique
Statique - a la compilation
C/C++
Java
Pascal
Dynamique – lors de l'exécution
Javascript
Python
Ruby
28. Paramètres pour les type
Simple
Le type (int, char, float … )
Compose
struct
Liste avec les components
Nom
Type
array
Type des éléments
Numéro des éléments
Les index
29. Les types sont pour
Constantes
Variables
Fonctions
Expressions
Instructions
30. Langage et type
• Dynamique vs. Statique
• Ou est-ce que la vérification de type est
effectuée?
Exécution vs compilation
• Strongly typed vs. Weakly typed
• Que se passe-t-il si les types ne
correspondent pas?
Erreur vs. conversion
31. Vérification de type
Synthèse
Détermination de type pour un instruction
Expression
Overloading
Inférence
Détermine un type dans le contexte
32. Equivalence de types compose
Un arbre pour l’information de type
Nom
Structure
Vérifiez de façon récursive que l'arbre correspond
33. Inférence de type
Déduction de type pour un expression
dans le contexte
A compilation ou a exécution.
C’est important
Vérification de type
Overloading de fonction
Conversion implicite
Widening / Narrowing
Pasii de analiza – o serie de filtre
Tipurile de gramatici
A "statically-typed" language is a language designed to facilitate automatic correctness checking by a tool that has access to only the source code, not the running state of the program. The facts that are deduced by the tool are called "types." The language designers produce a set of rules about what makes a program "type safe," and the tool seeks to prove that the program follows those rules; if it does not then it produces a type error.
A "dynamically-typed" language by contrast is one not designed to facilitate this kind of checking. The meaning of the data stored in any particular location can only be easily determined by inspection while the program is running.