2.3k likes | 3.18k Views
Compilation et théorie des langages. Kaouther Nouira Ferchichi 2007. Chapitre 1. Introduction à la compilation. Quelques définitions. Un traducteur est un programme qui transforme chaque mot d’un langage L1 sur un alphabet A1 en un mot d’un langage L2 sur un alphabet A2.
E N D
Compilation et théorie des langages KaoutherNouiraFerchichi 2007
Chapitre 1 Introduction à la compilation
Quelques définitions • Un traducteur est un programme qui transforme chaque mot d’un langage L1 sur un alphabet A1 en un mot d’un langage L2 sur un alphabet A2. • Un compilateur est un cas particulier de traducteur qui prend en entrée un mot représentant un programme c’est-à-dire la description d’un calcul et qui est chargé de produire le résultat de ce calcul. En pratique, il s’agira de traduire un texte représentant le calcul vers une suite d’instructions exécutables par la machine.
Exemples • D’un langage de haut niveau (Pascal, C++, ML, …) vers un langage d’assembleur. • Du langage d’assembleur vers du code binaire. • D’un langage de haut niveau vers les instructions d’une machine virtuelle (JVM). • …
L1 L2 Ln L1 L2 Ln Langage Universel M1 M1 M2 Mp M2 Mp La compilation de n langages pour p architectures nécessite à priori la réalisation de n×p compilateurs. En utilisant un langage universel intermédiaire on réduit le problème de construction de n×p compilateurs.
Repères par rapport au langage naturel • Un langage est un ensemble de phrases, unités linguistiques formées selon des règles précises à l'aide d'un alphabet. • Un alphabet est un ensemble des signes élémentaires, par exemple les caractères d'un langage écrit, les phénomènes d'un langage oral, les notes de musique d'une partition…
La lexicographie d’un langage • L’assemblage linéaire d’unités lexicales ou lexèmes (vocabulaire) formé à partir de l’alphabet du langage.
Syntaxe d’un langage • La syntaxe d'un langage est l'ensemble des règles qui fixent l'organisation des lexèmes au sein d'une phrase.
La sémantique d'un langage • fixe les rapports entre les phrases et le monde réel, de manière à ce que chaque phrase bien formée syntaxiquement ait une signification précise. • Une phrase bien formée syntaxiquement peut ne pas avoir de signification.
Un compilateur • un compilateur lit un programme source dans un langage source et produit un programme cible qui est le résultat la traduction du programme source dans un autre langage, le langage cible. • Le compilateur produit éventuellement des messages d'erreurs.
Compilateur Programme cible Programme source Messages Entrées et sorties d'un compilateur
Compilateur Programme cible Programme source Compilateur Analyse Synthèse Messages figure 1.2 Les deux parties d’un compilateur
Partie Analyse Partie Synthèse • Analyse lexicale • Analyse syntaxique • Analyse Sémantique • Génération du code • Optimisation du code
Source A. lexicale E r r e u r s S y m b o l e s A. syntaxique A. sémantique G. code O. de code Cible
Analyse lexicale £e chat µange la souris. Erreurs
Analyse lexicale • Consiste à récupérer les mots, que l’on appelle « lexèmes » ou « tokens », à partir d’une suite de caractères. Par exemple déterminer, à partir de l’énoncé suivant : for i : = 1 to vmax do a := a + i; • on peut dégager la suite de tokens suivante : for : mot clé i : identificateur := : affectation 1 : entier to : mot clé vmax : identificateur do : mot clé a : identificateur := : affectation a : identificateur + : opérateur arithmétique i : identificateur ; : séparateur
Ensuite, l’énoncé précédent peut s’exprimer ainsi : • 10, 1000, 100, 5001, 11, 1002, 12, 1001, 100, 1001, 101, 1000, 13 • for i := 1 to vmax do a := a + i ; • c'est-à-dire comme une suite de référence à la table des symboles.
Analyse syntaxique Souris la chat le mange. Erreurs
Analyse syntaxique • Lors de l’analyse syntaxique, on vérifie que l’ordre des tokens correspond à l’ordre définit pour le langage. • On dit que l’on vérifie la syntaxe du langage à partir de la définition de sa grammaire. Cette phase produit une représentation sous forme d’arbre de la suite des tokens obtenus lors de la phase précédente.
L’arbre syntaxique obtenu après analyse syntaxique Identificateur Identificateur Identificateur Identificateur
Analyse sémantique Le chas mange la souris. Erreurs
Analyse sémantique • Dans cette phase on vérifie que les variables ont un type correct. • Par exemple, il faut vérifier que la variable ‘i’ possède bien le type ‘entier’, et que la variable ‘a’ est bien un nombre. • Cette opération s’effectue en parcourant l’arbre syntaxique et en vérifiant à chaque niveau que les opérations sont correctes.
Génération de code On génère le code pour du langage machine ou un langage d’assemblage. Voici un exemple de code généré pour une (pseudo) machine. var_a ;les étiquettes des variables var_i var_vmax ... ; le code du programme movvar_i,1 loop: mov A0, (var_i) ; comparaisoni >= vmax jge A0, (var_vmax), finFor ; si vrai aller en finFor mov A0, (var_a) ; calcul de a+i add A0, A0, (var_i) mov var_a,A0 ; a := a+i mov A0, (var_i) ; on incrémentei add A0, A0, 1 movvar_i, Ao jmploop ; et on continue la boucle finFor: ...
Chapitre 2 Langage et grammaire
Les langages réguliers • Dans le cadre d'une classe particulière de langages, les langages réguliers, nous montrons comment décrire la syntaxe dans un formalisme adapté.
Le méta-langage des expressions régulières nous définissons par récurrence l'ensemble des expressions régulières permettant de définir la syntaxe d'un langage défini sur un alphabet donné : • expressions de base : (1) si a est un symbole de l'alphabet alors a est une expression régulière. (2) en peut utiliser le symbole pour décrire la chaîne vide.
juxtaposition : (3) si e1et e2sont des expressions régulières alors e1e2est une expression régulière. • alternative : (4) si e1et e2sont des expressions régulières alors e1 | e2 est une expression régulière. • répétition : • (5) si eest une expression régulière alors e* est une expression régulière.
On peut noter quelques propriétés algébriques du langage des expressions régulières (e, e1, e2, e3 désignaient des expressions régulières) : • e = e = e • e | e = e • e1 | e2 = e2 | e1 • e1 ( e2 | e3 ) = e1 e2 | e1 e3 et ( e1 | e2 ) e3 = e1 e3 | e2 e3
Algorithme de reconnaissance syntaxique • le problème est d'écrire un algorithme qui pour un langage réguliers donné détermine si une séquence de symboles, pris dans l'alphabet du langage, est valide syntaxiquement. • Nous pouvons donc décrire l'algorithme par un automate, appelé automate reconnaisseur.
Exemple E2.1 • on considère un langage construit sur l'alphabet {a,b,c} est dont la syntaxe est décrite par l'expression régulière (ab|c)*. Les chaînes ababcabcc, ab, c sont des exemples de chaînes correctes syntaxiquement. on veut écrire un algorithme qui détermine si une phrase formée sur {a,b,c} vérifie la syntaxe du langage.
Algorithme Etat : un entier sur [1..3] EtatInitial : l'entier 1 Algorithme Démarrer Etat EtatInitial Lire (EC) Tant que EC != " " Selon Etat : Etat = 1 : selon EC EC = "a" : Etat 2 {attente d'un b} EC = "b": Etat 3 {erreur} EC="c" : {on reste dans l'état 1} FinSelon Etat = 2 : si EC = "b" alors Etat 1 sinon Etat 3 Etat = 3 : {quelque soit EC, on reste dans l'état 3} FinSelon Lire (EC) FinTanque Ecrire(si Etat = 1 alors "chaine correcte" sinon "chaine incorrecte")
EC = "b" EC = "a" sinon EC = "c" 1 2 3 EC = "b" vrai Représentation par un automate de l'algorithme de parcours itératif pour la reconnaissance de l'expression régulière (a b | c)*
Langage et grammaire • La notion de grammaire est à la base de l'étude formelle des propriétés syntaxiques d'un langage. • Ceci constitue un fondement autant pour la conception d'un langage que pour l'écriture d'un programme de traduction.
Nous abordons la notion de grammaire au travers d'exemple simple, tout en présentant divers méta-langages associés : notation BNF (BackusNaurForm) et EBNF (ExtendedBackusNaurForm) et diagrammes syntaxiques. • Les grammaires servent notamment de base à la construction systématique (et à la génération automatique) de programmes d'analyse syntaxique.
Notion de grammaire Exemple E2.1 Palindromes • On considère l'ensemble des séquences palindromes dont les éléments sont soit le caractère "a", soit le caractère "b". • Un palindrome est une séquence égale à son inverse. • Par exemple, les séquences "aabbaa", "a", "baaabaaab" sont des palindromes sur {a, b} et les séquences "abbb", "aabbb", "aca" n'en sont pas.
la séquence vide est un palindrome, • une séquence réduite à des caractères "a" ou "b" est un palindrome, • si la séquence S est un palindrome alors les séquences "a" S "a" et "b" S "b" sont des palindromes. enfin on peut s'intéresser à la description du langage Pal dont les phrases sont les palindromes formés sur l'alphabet donné {"a", "b"}. Ici, la lexicographie du langage se réduit à l'alphabet. La syntaxe est décrite en énumérant les règles suivantes : • <p> ::= " vide " • <p> ::= " a " • <p> ::= " b " • <p> ::= " a " <p> " a " • <p> ::= " b " <p> " b "
la description donnée ci-dessus utilise la notation BNF. • Les symboles en minuscules sont appelés les symboles terminaux : il représente les signes élémentaires que l'on trouve dans une phrase du langage. • le symbole <p> est appelé symbole non terminal. Il caractérise ici une phrase du langage. • Le symbole videreprésente la chaîne vide.
<p> ::= " vide " • <p> ::= " a " • <p> ::= " b " • <p> ::= " a " <p> " a " • <p> ::= " b " <p> " b " • Les règles de la grammaire se lisent de la façon suivante: • un palindrome <p> est soit vide (1), • soit le symbole a (2), • soit le symbole b (3), • soit le symbole a suivi d'un palindrome suivi d'un symbole a (4), • soit le symbole b suivi d'un palindrome suivi d'un symbole b (5). • On retrouve donc la juxtaposition (règles 4 et 5), la récursion (règles 4 et 5) et l'alternative (les règles donnent cinq formes possibles de palindromes).
Exemple E2.2 Identificateur • Un identificateur est une séquence de lettres ou de chiffres commençant par une lettre. • Un chiffre est "0", "1", "2", "3", "4", "5", "6", "7", "8" ou "9", • une lettre est "a" ou "b" ou "c", …
Une séquence de caractères alphanumériques est représentée par le symbole <salphanum>, • Un caractère alphanumérique est représenté par le symbole <calphanum>, • Une lettre ou un chiffre sont respectivement représentés par les symboles <lettre> ou <chiffre>.
<idf> ::= <lettre> | <lettre> <salphanum> • <salphanum> ::= <calphanum> | <calphanum> <salphanum> • <calphanum> ::= <lettre> | <chiffre> • <lettre> ::= " a "|" b "|…|" z " • <chiffre> ::= "0"|"1"|"2"|"3"|"4"|"5"|"6"|"7"|"8"|"9"
Définition, notation BNF • Une grammaire est composée de quatre éléments nommés Vt, Vnt, A, RP. G = {Vt, Vnt, A, RP } • Vt est l'ensemble des symboles terminaux. • Vnt est l'ensemble des symboles non terminaux. • A est l'axiome. l'axiome est le symbole non terminal désignant l'unité syntaxique qui caractérise le langage tout entier. • RP est l'ensemble des règles dites de production.
Dans l'exemple E2.2 : • Vt = {a, b, …, z, 0, 1, …,9} • Vnt = { <idf>, <salphanum>, <calphanum>, <lettre>, <chiffre>} • A = <idf> • RP = • <idf> ::= <lettre> | <lettre> <salphanum> • <salphanum> ::= <calphanum> | <calphanum> <salphanum> • <calphanum> ::= <lettre> | <chiffre> • <lettre> ::= "a" | "b" | "c" | … |"z" • <chiffre> ::= "0" | "1" | "2"| "3" | "4" | "5" | "6" | "7" | "8" |"9"
Exemple E2.3 Blocs en Pascal • Vt = {begin, end, ;, :=, if, then, else} • Vnt = { <bloc>, <list-inst>, <inst>, <expression>, <idf>, <cst-ent>} • A = <bloc> • RP = • <bloc> ::= “begin” <list-inst> “end” • <list-inst> ::= <inst>| <inst>”; “ <list-inst> • <inst> ::= <idf > “:=“ <expression> | • “if” <expression> “then” <inst>| • “if” <expression> “then” <inst> “else” <inst> • <expression> ::= <cst-ent> | <idf> • …
Remarque • en fixant des conventions d'écriture des symboles et en convenant que la première règle définit l'axiome, on peut ne donner que l'ensemble des règles de la grammaire. • Vt, Vnt et A s'en déduisant implicitement.
Exemple E2.4 Phrase en français • <phrase> ::= <gpe-sujet> <gpe-verbal> <gpe-complement> • <gpe-sujet> ::= <gpe-nominal> • <gpe-complement> ::= <gpe-nominal> • <gpe-verbal> ::= <verbe> • <gpe-nominal> ::= <article> <nom-commun> | <nom-propre> • …
Remarques • De manière générale, la lexicographie est la partie de la syntaxe qui fixe les règles d'assemblage linéaire des signes de l'alphabet en lexèmes, comme par exemple les mots dans une langue naturelle.
Erreurs. Lexèmes Source Arbres Anal. Lex Anal. Synt. requête Identificateurs Table Symbôles. Grammaire (Syntaxe)
EBNF • Dans la notation EBNF (BNF étendue), on complète le méta-langage par des symboles exprimant des itérations et des options: • [] signifie que la chaîne est optionnelle (dans la phrase décrite elle apparaît 0 ou 1 fois) • {} signifie que la chaîne apparaît 0,1, ou plusieurs fois.