Introduction à la compilation TD 1 : Analyse LL(1)

Documents pareils
Machines virtuelles fonctionnelles (suite) Compilation ML Java

Cours 1 : La compilation

Recherche dans un tableau

Théorie de la Programmation

Rappel. Analyse de Données Structurées - Cours 12. Un langage avec des déclaration locales. Exemple d'un programme

Chap 4: Analyse syntaxique. Prof. M.D. RAHMANI Compilation SMI- S5 2013/14 1

Cours de Programmation 2

1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

Éléments d informatique Cours 3 La programmation structurée en langage C L instruction de contrôle if

Classes et Objets en Ocaml.

Machines virtuelles Cours 1 : Introduction

Logiciel Libre Cours 2 Fondements: Programmation

Génie Logiciel avec Ada. 4 février 2013

Théorie des Langages

Exo7. Calculs de déterminants. Fiche corrigée par Arnaud Bodin. Exercice 1 Calculer les déterminants des matrices suivantes : Exercice 2.

Gestion mémoire et Représentation intermédiaire

length : A N add : Z Z Z (n 1, n 2 ) n 1 + n 2

Correction Code nécessaire à la compilation : let bs ="\\" let nl = "\n" ;; let appliquer = List.map ;; (* affichage d'un noeud *)

Java Licence Professionnelle CISII,

LE PROCESSUS ( la machine) la fonction f. ( On lit : «fonction f qui à x associe f (x)» )

Vérification de programmes et de preuves Première partie. décrire des algorithmes

Programmation en Caml pour Débutants

Problème : Calcul d'échéanciers de prêt bancaire (15 pt)

# let rec concat l1 l2 = match l1 with [] -> l2 x::l 1 -> x::(concat l 1 l2);; val concat : a list -> a list -> a list = <fun>

Analyse de sécurité de logiciels système par typage statique

UE Programmation Impérative Licence 2ème Année

Algorithmique et Programmation, IMA

Probabilités. Rappel : trois exemples. Exemple 2 : On dispose d un dé truqué. On sait que : p(1) = p(2) =1/6 ; p(3) = 1/3 p(4) = p(5) =1/12

Exo7. Matrice d une application linéaire. Corrections d Arnaud Bodin.

Grandes lignes ASTRÉE. Logiciels critiques. Outils de certification classiques. Inspection manuelle. Definition. Test

Compilation (INF 564)

TRIGONOMETRIE Algorithme : mesure principale

UEO11 COURS/TD 1. nombres entiers et réels codés en mémoire centrale. Caractères alphabétiques et caractères spéciaux.

Cours d introduction à l informatique. Partie 2 : Comment écrire un algorithme? Qu est-ce qu une variable? Expressions et instructions

TP1 : Initiation à Java et Eclipse

Cours d algorithmique pour la classe de 2nde

STAGE IREM 0- Premiers pas en Python

modules & compilation

Les deux points les plus proches

Projet de programmation (IK3) : TP n 1 Correction

Traduction des Langages : Le Compilateur Micro Java

Cours 1 : Qu est-ce que la programmation?

Cours 1 : Introduction Ordinateurs - Langages de haut niveau - Application

Gestion de base de données

Présentation du langage et premières fonctions

Corrigé des TD 1 à 5

Plan du cours : Zippers. Des fonctions sur les listes avec position. Des fonctions sur les listes avec position

Problèmes liés à la concurrence

OCL - Object Constraint Language

TP Contraintes - Triggers

Déroulement. Evaluation. Préambule. Définition. Définition. Algorithmes et structures de données 28/09/2009

Le théorème de Thalès et sa réciproque

Initiation à l algorithmique

27/11/12 Nature. SDK Python et Java pour le développement de services ACCORD Module(s)

Représentation d un entier en base b

MIS 102 Initiation à l Informatique

Cours d initiation à la programmation en C++ Johann Cuenin

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Travaux pratiques. Compression en codage de Huffman Organisation d un projet de programmation

Introduction à la programmation Travaux pratiques: séance d introduction INFO0201-1

Exo7. Limites de fonctions. 1 Théorie. 2 Calculs

Limites finies en un point

ACTIVITÉ DE PROGRAMMATION

Quelques éléments de compilation en C et makefiles

M2-Images. Rendu Temps Réel - OpenGL 4 et compute shaders. J.C. Iehl. December 18, 2013

Paris Airports - Web API Airports Path finding

Argument-fetching dataflow machine de G.R. Gao et J.B. Dennis (McGill, 1988) = machine dataflow sans flux de données

Les chaînes de caractères

Licence Sciences et Technologies Examen janvier 2010

Programmer en JAVA. par Tama

CH.6 Propriétés des langages non contextuels

Architecture des ordinateurs TD1 - Portes logiques et premiers circuits

Atelier C TIA Portal CTIA04 : Programmation des automates S7-300 Opérations numériques

Simulation de variables aléatoires

Programme Compte bancaire (code)

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

LMI 2. Programmation Orientée Objet POO - Cours 9. Said Jabbour. jabbour@cril.univ-artois.fr

Utilisation d objets : String et ArrayList

Langage et Concepts de Programmation Objet. 1 Attributs et Méthodes d instance ou de classe. Travaux Dirigés no2

Cours d Analyse. Fonctions de plusieurs variables

Suivant les langages de programmation, modules plus avancés : modules imbriqués modules paramétrés par des modules (foncteurs)

Continuité et dérivabilité d une fonction

Rapport de Mini-Projet en ArcGIS Engine

Probabilités sur un univers fini

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

Corrigé des exercices sur les références

SNT4U16 - Initiation à la programmation TD - Dynamique de POP III - Fichiers sources

Programmation. fonctionnelle, impérative, logique et orientée objet

Initiation à la programmation en Python

Licence de MIDO - 3ème année Spécialités Informatique et Mathématiques Appliquées

Cours Informatique Master STEP

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

Cette application développée en C# va récupérer un certain nombre d informations en ligne fournies par la ville de Paris :

Exercices - Nombres complexes : corrigé. Formes algébriques et trigonométriques, module et argument

Paginer les données côté serveur, mettre en cache côté client

Fonctions homographiques

Cours de C++ François Laroussinie. 2 novembre Dept. d Informatique, ENS de Cachan

CHAPITRE V SYSTEMES DIFFERENTIELS LINEAIRES A COEFFICIENTS CONSTANTS DU PREMIER ORDRE. EQUATIONS DIFFERENTIELLES.

Exercices Corrigés Premières notions sur les espaces vectoriels

Transcription:

Introduction à la compilation TD 1 : Analyse LL(1) Université Paris Diderot Licence 3 (2012-2013) Exercice 1 S E$ E OEE A O + A n (E) 1. Calculez la fonction FIRST pour tous les non termaux de cette grammaire. FIRST (S) = FIRST (E) = { +, *, (, n } FIRST (O) = { +, * } FIRST (A) = { n, ( } 2. La grammaire est-elle LL(1)? Si oui, quelle est la table d analyse correspondante? Si non, existe-t-il une grammaire équivalente LL(1)? Dans ce cas, donnez-en la table d analyse. Pour savoir si une grammaire est LL(1), il suffit d essayer de construire la table d analyse LL(1) de la grammaire. Asi, on obtient : + ( ) n $ S S E$ S E$ S E$ S E$ E E OEE E OEE E A E A O O O + A A (E) A n Il n y a qu une règle par case, cette grammaire est bien LL(1). 3. Écrivez un programme CAML qui terprète cette table pour détermer si un mot est dans le langage engendré par cette grammaire. type nontermal = S E O A type termal = LPAREN RPAREN EOF INT PLUS STAR type symbol = Termal of termal NonTermal of nontermal type rule = Rule1 (* S -> E $ *) Rule2 (* E -> O E E *) Rule3 (* E -> A *) Rule4 (* O -> + *) Rule5 (* O -> * *) Rule6 (* A -> n *) 1

Rule7 (* A -> ( E ) *) let expand = function Rule1 [NonTermal E ; Termal EOF ] Rule2 [NonTermal O ; NonTermal E ; NonTermal E] Rule3 [NonTermal A] Rule4 [Termal PLUS] Rule5 [Termal STAR] Rule6 [Termal INT] Rule7 [Termal LPAREN ; NonTermal E ; Termal RPAREN] exception Fail let table = function S (function STAR PLUS LPAREN INT Rule1 _ raise Fail) E (function STAR PLUS Rule2 LPAREN INT _ Rule3 _ raise Fail) O (function STAR Rule5 PLUS Rule4 _ raise Fail) A (function LPAREN Rule7 INT _ Rule6 _ raise Fail) type prediction = symbol list type put = termal list type configuration = put * prediction exception TokenError of termal * termal exception SyntaxError let rec parse = function (token : : put, Termal token : : prediction) if token = token then parse (put, prediction) else raise (TokenError (token, token )) (token : : put, NonTermal s : : prediction) let rule = table s token parse (token : : put, expand rule @ prediction) ([], []) () 2

_ raise SyntaxError let parse put = parse (put, [NonTermal S]) 4. Écrivez un programme CAML qui implémente cette table à l aide de quatre fonctions mutuellement récursives. let parse = let ( > ) p1 p2 = fun put p2 (p1 put) and (» ) put p = p put let current_token = function token : : _ token [] assert false let accept token put = if current_token put token then raise (TokenError (current_token put, token)) ; List.tl put let rec parse_s put = match current_token put with STAR PLUS LPAREN INT put» (parse_e > (accept EOF)) _ raise SyntaxError and parse_e put = match current_token put with STAR PLUS put» (parse_o > (parse_e > parse_e)) LPAREN INT put» parse_a _ raise SyntaxError and parse_o put = match current_token put with STAR put» (accept STAR) PLUS put» (accept PLUS) _ raise SyntaxError and parse_a put = match current_token put with LPAREN put» (accept LPAREN > (parse_e > (accept RPAREN))) INT put» (accept INT) _ raise SyntaxError parse_s 5. Explicitez les étapes de la reconnaissance de la chaîne +( 21)(+(+11)2)$. 3

+( II)(+(+II)I)$ II)(+(+II)I)$ +(+II)I)$ II)I)$ S EE)E$ E)$ AE)E)$ +( II)(+(+II)I)$ II)(+(+II)I)$ +(+II)I)$ II)I)$ E$ AE)E$ OEE)$ IE)E)$ +( II)(+(+II)I)$ II)(+(+II)I)$ +(+II)I)$ I)I)$ OEE$ IE)E$ +EE)$ E)E)$ +( II)(+(+II)I)$ I)(+(+II)I)$ (+II)I)$ I)I)$ +EE$ E)E$ EE)$ A)E)$ ( II)(+(+II)I)$ I)(+(+II)I)$ (+II)I)$ I)I)$ EE$ A)E$ AE)$ I)E)$ $ ( II)(+(+II)I)$ I)(+(+II)I)$ (+II)I)$ )I)$ $ AE$ I)E$ (E)E)$ )E)$ ( II)(+(+II)I)$ )(+(+II)I)$ +II)I)$ I)$ (E)E$ )E$ E)E)$ E)$ II)(+(+II)I)$ (+(+II)I)$ +II)I)$ I)$ E)E$ E$ OEE)E)$ A)$ II)(+(+II)I)$ (+(+II)I)$ +II)I)$ I)$ OEE)E$ A$ +EE)E)$ I)$ II)(+(+II)I)$ (+(+II)I)$ II)I)$ )$ EE)E$ (E)$ EE)E)$ )$ 6. Explicitez les étapes du rejet de la chaîne (+1( 2))$. (+I( I))$ +I( I))$ ( I))$ I))$ S OEE)$ E)$ EE))$ (+I( I))$ +I( I))$ ( I))$ I))$ E$ +EE)$ A)$ EE))$ (+I( I))$ I( I))$ ( I))$ I))$ A$ EE)$ (E))$ AE))$ (+I( I))$ I( I))$ I))$ I))$ (E)$ AE)$ E))$ IE))$ +I( I))$ I( I))$ I))$ ))$ E)$ IE)$ OEE))$ E))$ 7. ( ) Comment adapter votre analyseur syntaxique pour qu il produise un arbre de production si il existe? type action = Recognize of symbol 4

Produce of rule let recognize_usg r = List.map (fun x Recognize x) (expand r) @ [Produce r] type prediction = action list type put = termal list type ptree = Rule of rule * ptree list Leaf of termal exception TokenError of termal * termal exception SyntaxError let apply_rule = function Rule1 (function teof : : te : : ts Rule (Rule1, [te ; teof]) : : ts Rule2 (function te : : te : : to : : ts Rule (Rule2, [to ; te ; te]) : : ts Rule3 (function ta : : ts Rule (Rule3, [ta]) : : ts Rule4 (function tp : : ts Rule (Rule4, [tp]) : : ts Rule5 (function ts : : ts Rule (Rule5, [ts]) : : ts Rule6 (function ti : : ts Rule (Rule6, [ti]) : : ts Rule7 (function tr : : te : : tl : : ts Rule (Rule7, [tl ; te ; tr]) : : ts type configuration = ptree list * put * prediction let strg_of_action = function Recognize s strg_of_symbol s Produce r strg_of_rule r let rec parse (configuration : configuration) : ptree = prt_configuration configuration ; match configuration with (pts, tokens, Produce rule : : prediction) let pts = apply_rule rule pts parse (pts, tokens, prediction) (pts, token : : put, Recognize (Termal token ) : : prediction) (* Étape d acceptation d un caractère. *) 5

if token = token then parse (Leaf token : : pts, put, prediction) else raise (TokenError (token, token )) (pts, token : : put, Recognize (NonTermal s) : : prediction) (* Étape de prédiction. *) let rule = table s token parse (pts, token : : put, recognize_usg rule @ prediction) ([ptree], [], []) ptree _ raise SyntaxError let parse put = parse ([], put, [Recognize (NonTermal S)]) 8. ( ) Comment obtenir un arbre de syntaxe abstraite à partir de l arbre de production produit par votre analyseur syntaxique? type exp = Add of exp * exp Mul of exp * exp Int let exp_of_ptree = let rec aux = function Leaf INT (function [] Int _ assert false) Rule (Rule1, [t ; _]) aux t Rule (Rule2, [to ; te ; te ]) (function [] (aux to) [ get te ; get te ] _ assert false) Rule (Rule3, [ta]) aux ta Rule (Rule4, [tp]) (function [a ; b] Add (a, b) _ assert false) Rule (Rule5, [ts]) (function [a ; b] Mul (a, b) _ assert false) Rule (Rule6, [ti]) aux ti Rule (Rule7, [_ ; te ; _]) aux te _ assert false and get i : exp = aux i [] get Exercice 2 S E$ E T + E T! T F T F! F n (E) 1. Calculez la fonction FIRST pour tous les non termaux de cette grammaire. FIRST (S) = FIRST (E) = FIRST (T) = FIRST (F) = { n, ( } 6

2. La grammaire est-elle LL(1)? Si oui, quelle est la table d analyse correspondante? Si non, existe-t-il une grammaire équivalente LL(1)? Dans ce cas, donnez-en la table d analyse. Pour savoir si une grammaire est LL(1), il suffit d essayer de construire la table d analyse LL(1) de la grammaire. Asi, on obtient : + ( ) n! $ S S E$ S E E E T + E E T + E E T! E T! T T F E T F E T F! T F! F F (E) F n Cette grammaire n est pas LL(1) car il y a deux règles dans 4 cases. Pour la rendre LL(1), il faut factoriser à gauche ces règles en réécrivant la grammaire itiale de la façon suivante : S E$ E T E E +E! T F T T T! F n (E) Exercice 3 Considérez la grammaire suivante : S E$ T T F F E E + T E T T F id (E) (num) 1. Pourquoi cette grammaire n est pas LL(1)? Il y a au mos deux raisons à cela : F IRST (E + T ) = F IRST (E T ) ; aucune grammaire avec récursion gauche est LL(1). 2. Élimez les récursions gauches. On obtient : S E$ E T E E +T E T E ɛ T F T T F T ɛ F id (E) (num) 3. Est-ce que la grammaire obtenue asi est LL(1)? La grammaire obtenue après élimation n est pas LL(1) à cause de F (E) et F (num). Elle est LL(2). On peut la factoriser pour la rendre LL(1) en troduisant les règles : F (F et F E) num) Exercice 4 On considère la grammaire : S E$ E T E E +T E ɛ T F T T F T ɛ F (E) id 1. Calculez les symboles annulables (c est-à-dire les symboles qui ont. ɛ dans F IRST ) E et T sont annulables. 7

2. Calculez FIRST des symboles non termaux. FIRST(S) = FIRST(E) = FIRST(T ) = FIRST(F ) = {(, id}. FIRST(E ) = {+, ɛ}, FIRST(T ) = {, ɛ}. 3. Calculez FOLLOW des symboles non termaux. FOLLOW (S) = FOLLOW (E) = FOLLOW (E ) = {), $} FOLLOW (T ) = FOLLOW (T ) = {+, ), $} FOLLOW (F ) = {+,, ), $}. 4. Donnez une table d analyse descendante pour cette grammaire. La grammaire est-elle LL(1)? Expliquez. On vérifie que pour chaque couple (A, a) composée d un non-termal et d un termal il y au plus une règle qui s applique. Une règle A α, α ɛ s applique si a FIRST(α). Une règle A ɛ s applique si a FOLLOW (A). Exercice 5 On considère la grammaire : S A B A aab 0 B abbb 1 1. Quel est le langage généré par cette grammaire? C est le langage {a n 0b n n 0} {a n 1b 2n n 0}. On le prouve par double clusion. Première clusion : Montrons d abord que tout mot engendré par cette grammaire est dans ce langage, c est-à-dire que pour tout k tel que S k w, alors il existe un entier n tel que w = a n 0b n ou w = a n 1b 2n. On va montrer un résultat un peu plus fort : pour tout k tel que S k w, alors il existe un entier n tel que w = a n Ab n ou w = a n Bb 2n. Par duction sur k, si k = 0 alors il n y a pas de dérivation de taille 0 donc le résultat est vrai. Supposons matenant que le résultat est vrai pour k et montrons-le vrai pour k + 1. On se donne donc w tel que S k u w. Par duction, on sait qu il existe m tel que u = a m Ab m ou u = a m Bb 2m. Il suffit alors de procéder par cas sur la dernière règle utilisée : Si cette règle est S A ou S B alors il suffit de choisir n = 0. Si cette règle est A aab alors cela signifie que u contient un A donc que u est de la forme u = a m Ab m, ce qui, en appliquant la règle considérée, produit w = a m+1 Ab m+1. Si cette règle est B abbb alors cela signifie que u contient un B don que u est de la forme u = a m Bb 2m, ce qui, en appliquant la règle considérée, produit w = a m Bb 2(m+1). En utilisant ce résultat sur un mot w qui ne contient que des termaux, la dernière règle appliquée traduit nécessairement le non termal A en 0 si w est de la première forme et le non termal B en 1 si w est de la seconde forme. Seconde clusion : Par duction sur n, on montre facilement que tout mot w = a n 0b n peut être engendré par la grammaire : il suffit d avoir appliqué n fois la première de règle A puis de termer avec la seconde règle. Le même raisonnement s applique sur les mots de la forme w = a n 1b 2n. 2. Calculer les ensembles FIRST de S, A et B. F IRST (S) = F IRST (A) = F IRST (B) = {a}. 3. La grammaire est-elle LL(1)? Non, puisque l on ne sait pas choisir entre la reconnaissance d un A ou d un B à la vue d un seul a. Il faudrait attendre d avoir vu passé tous les a jusqu à arriver à un 1 ou un 0 pour prendre cette décision. 4. Pouvez-vous construire un automate à pile détermiste qui reconnaît le langage généré par la grammaire? 8

Oui, et pour faciliter la défition on donne un automate à pile avec acceptation à pile vide. Soit A = (Q = {q a, q 0, q 1, q 1, q f }, Σ = {a, b, 0, 1}, Γ = {a, Z 0 }, δ, q a, Z 0, q f ) où les transitions de l automate sont : δ(q a, aw, π) = (q a, aπ) δ(q a, 0w, π) = (q 0, π) δ(q 0, bw, aπ) = (q 0, π) δ(q a, 1w, π) = (q 1, π) δ(q 1, bw, aπ) = (q 1, π) δ(q 1, bw, aπ) = (q 1, π) 5. ( ) Pouvez-vous écrire un programme CAML qui reconnaît ce langage? type token = Ta Tb T1 T0 EOF exception Unexpected of token let parse tokens = let (accept, next, current) = let rec state = ref tokens let next () = match!state with [] state : = [EOF] _ : : toks state : = toks let current () = match!state with [] EOF tok : : _ tok let accept tok = if tok current () then raise (Unexpected (current ())) ; next () (accept, next, current) let rec parse_s () = parse_a_or_b (fun () ()) (fun () ()) ; accept EOF and parse_a_or_b parse_end_of_a parse_end_of_b = match current () with Ta next () ; parse_a_or_b (fun () accept Tb ; parse_end_of_a ()) (fun () accept Tb ; accept Tb ; parse_end_of_b ()) Tb raise (Unexpected Tb) T0 next () ; parse_end_of_a () T1 next () ; parse_end_of_b () parse_s () Une autre solution existe si on utilise un entier pour compter les symboles a lus. 9

Exercice 6 On considère la grammaire suivante : S ietss a S es ɛ E b Expliquez pourquoi cette grammaire n est pas LL(1). Elle n est pas LL(1) car e First(S ) Follow(S ). La grammaire est-elle ambiguë? Oui. Par exemple, le mot ibtibtaea peut être engendré par deux arbres de dérivation différents. Exercice 7 Considérez la grammaire suivante : S S $ S S AB S BC BB A aaa ɛ B bb ɛ C cc ɛ Calculez les symboles annulables et les ensembles FIRST et FOLLOW. Est-ce que la grammaire est LL(1)? A, B et C sont clairement annulable à cause des règles A ɛ. Alors S est annulable à cause de la règle S BB. Les équations pour le calcul de FIRST et FOLLOW sont : F IRST (A) = {a, ɛ} F OLLOW (A) F OLLOW (A) = {a} F IRST (B) F OLLOW (B) F IRST (B) = {b, ɛ} F OLLOW (B) F OLLOW (B) = F IRST (C) F IRST (B) F OLLOW (S ) F IRST (S ) = F IRST (S ) F IRST (B) F OLLOW (S ) = {$} F IRST (A) F IRST (B) F IRST (S) = F IRST (S ) F OLLOW (S ) En faisant une résolution itérative de ce système en partant de on obtient que les ensembles FIRST de A, B, C, S sont égaux à {a, b, c, $, ɛ} et FISRT(S) et tous les ensembles FOLLOW sont égaux à {a, b, c, $}. La grammaire n est pas LL(1) car elle est récursive ou, par exemple, F IRST (A) F OLLOW (A). 10