Analyse syntaxique. Analyse syntaxique. Julien Forget

Documents pareils
Cours de Programmation 2

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

Machines virtuelles fonctionnelles (suite) Compilation ML Java

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

modules & compilation

chapitre 4 Nombres de Catalan

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

Théorie de la Programmation

ALGORITHMIQUE ET PROGRAMMATION En C

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

Cours 1 : La compilation

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

Recherche dans un tableau

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

Traduction des Langages : Le Compilateur Micro Java

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Compilation. Algorithmes d'analyse syntaxique

Interpréteur d algèbre relationnelle

Algorithmique et Programmation, IMA

Quelques éléments de compilation en C et makefiles

Logiciel Libre Cours 2 Fondements: Programmation

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 Langage C/C++ Programmation modulaire

Conception de circuits numériques et architecture des ordinateurs

Classes et Objets en Ocaml.

Peut-on tout programmer?

SHERLOCK 7. Version du 01/09/09 JAVASCRIPT 1.5

INF2015 Développement de logiciels dans un environnement Agile. Examen intra 20 février :30 à 20:30

RapidMiner. Data Mining. 1 Introduction. 2 Prise en main. Master Maths Finances 2010/ Présentation. 1.2 Ressources

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

SQL Parser XML Xquery : Approche de détection des injections SQL

Introduction à l algorithmique et à la programmation M1102 CM n 3

ACTIVITÉ DE PROGRAMMATION

LES TYPES DE DONNÉES DU LANGAGE PASCAL

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

Initiation à l algorithmique

Programmer en JAVA. par Tama

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

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Rappels Entrées -Sorties

Plan. Exemple: Application bancaire. Introduction. OCL Object Constraint Language Le langage de contraintes d'uml

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

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

COMMUNICATEUR BLISS COMMANDE PAR UN SENSEUR DE POSITION DE L'OEIL

Apache Camel. Entreprise Integration Patterns. Raphaël Delaporte BreizhJUG

Machines virtuelles Cours 1 : Introduction

Rappels d architecture

MICROINFORMATIQUE NOTE D APPLICATION 1 (REV. 2011) ARITHMETIQUE EN ASSEMBLEUR ET EN C

Structure d un programme et Compilation Notions de classe et d objet Syntaxe


Bases de programmation. Cours 5. Structurer les données

ADAPT: un modèle de transcodage des nombres. Une application des systèmes de production au développement

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

Chapitre 2. Classes et objets

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

Cours 1 : Introduction. Langages objets. but du module. contrôle des connaissances. Pourquoi Java? présentation du module. Présentation de Java

Vers l'ordinateur quantique

IV- Comment fonctionne un ordinateur?

Le langage C++ est un langage de programmation puissant, polyvalent, on serait presque tenté de dire universel, massivement utilisé dans l'industrie

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

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

TP 1 : 1 Calculs en binaire, octal et hexadécimal

Carl-Louis-Ferdinand von Lindemann ( )

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

Cours 1 : Qu est-ce que la programmation?

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

Java 1.5 : principales nouveautés

4. Groupement d objets

TP1 - Prise en main de l environnement Unix.

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

LES OUTILS D ALIMENTATION DU REFERENTIEL DE DB-MAIN

EXCEL PERFECTIONNEMENT CALCULS AVANCES

TP 1. Prise en main du langage Python

openarchitectureware & transformation de modèle Yannick Lizzi Architecte Logiciel itemis France Mail: lizzi@itemis.de

Le prototype de la fonction main()

Algorithmes d'apprentissage

EQUIPEMENTS ELECTRONIQUES : MAINTENANCE

HelpAndManual_unregistered_evaluation_copy GESTIONNAIRE D'ALARMES CENTRALISE OPTIM'ALARM. Manuel d'utilisation

Gestion Electronique de Document (ECM/GED)

Tutoriel code::blocks

Notions fondamentales du langage C# Version 1.0

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

Chapitre VI- La validation de la composition.

Comment installer ocaml sous windows avec ocamlsdl?

XML par la pratique Bases indispensables, concepts et cas pratiques (3ième édition)

Compilation (INF 564)

Projet d informatique M1BI : Compression et décompression de texte. 1 Généralités sur la compression/décompression de texte

Brève introduction à la recherche d!information sur le Web à base d!agents logiciels

Présentation du langage et premières fonctions

Télécom Nancy Année

Compression de Données - Algorithme de Huffman Document de Conception

Gestion mémoire et Représentation intermédiaire

Éléments d'architecture des ordinateurs

Cours de Programmation Impérative: Zones de mémoires et pointeurs

Chap III : Les tableaux

Chapitre 10 Arithmétique réelle

TP3 : Manipulation et implantation de systèmes de fichiers 1

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

Ingénierie Dirigée par les Modèles. Editeurs de modèles. (Eclipse Modeling Tools) Jean-Philippe Babau

Transcription:

Analyse syntaxique Julien Forget julien.forget@onera.fr www.cert.fr/anglais/deri/jforget/ml.html 30 avril 2009

Introduction Plan 1 Introduction 2 Analyse lexicale : Ocamllex 3 Analyse grammaticale : Ocamlyacc 4 Structuration globale

Introduction Analyse syntaxique : dénition et structuration Analyse syntaxique : découpage d'un texte brut en termes complexes (en programme). Analyse de la forme d'un texte. Analyse sémantique : analyse du sens d'un texte (ex : typage). Décomposition de l'analyse syntaxique : 1 Analyse lexicale : décomposition d'un texte en diérents mots (ex : en Français découpage selon les espaces). 2 Analyse grammaticale : regroupement des mots en diérentes constructions (ex : en Français, découpage en propositions). Production d'une représentation abstraite du texte d'entrée : l'arbre de Syntaxe Abstraite.

Introduction Exemple Example l e t x = 4 i n x+3 L'analyse lexicale reconnaît les symbôles suivants :

Introduction Exemple Example l e t x = 4 i n x+3 L'analyse lexicale reconnaît les symbôles suivants :let, in (mots-clés), x (identiant), 4, 3 (entiers), =, + (caractères spéciaux). L'analyse grammaticale regroupe les mots clés en expressions, puis les expressions simples en expressions plus complexes. Par exemple

Introduction Exemple Example l e t x = 4 i n x+3 L'analyse lexicale reconnaît les symbôles suivants :let, in (mots-clés), x (identiant), 4, 3 (entiers), =, + (caractères spéciaux). L'analyse grammaticale regroupe les mots clés en expressions, puis les expressions simples en expressions plus complexes. Par exemple elle reconnaît que x+3 est une application de fonction et que let x = 4 dénit une liaison. Par contre cette analyse ne permet ni de reconnaître que x est de type entier ni de savoir que l'expression complète a pour valeur 7.

Analyse lexicale : Ocamllex Plan 1 Introduction 2 Analyse lexicale : Ocamllex 3 Analyse grammaticale : Ocamlyacc 4 Structuration globale

Analyse lexicale : Ocamllex Analyse lexicale L'analyse lexicale consiste à décomposer un ux de caractères d'entrée en une suite d'éléments plus abstraits : les lexèmes (token). Il s'agit en général du premier traitement eectué par un compilateur. Exemple de lexèmes : nombres, chaînes de caractères. Un lexème est en général déni par une expression régulière.

Analyse lexicale : Ocamllex Les expressions régulières en Unix De nombreux outils Unix manipulent les expressions régulières (shell, sed, awk). Par exemple, le shell :? : caractère quelconque (une fois). * : caractère quelconque, répétitions quelconque. Noms de chiers % ls *.ml % ls toto.ml?

Analyse lexicale : Ocamllex (Caml)lex lex est un outil d'analyse lexicale Unix. Il prend en entrée un ensemble d'expressions régulières (et les actions associées) et produit en sortie un automate reconnaissant le langage correspondant. camllex est une version OCaml de lex. ocamllex lexer.mll : produit l'automate OCaml correspondant dans lexer.ml.

Analyse lexicale : Ocamllex Forme générale Code { h e a d e r } r u l e e n t r y p o i n t = p a r s e r e g e x p 1 { a c t i o n 1 }... r e g e x p n { a c t i o n n } { t r a i l e r } regexp1,, regexpn : des expressions régulières. action1,, actionn : des expressions OCaml décrivant l'action à réaliser lorsqu'une expression régulière est reconnue. {header} et {trailer} : un code OCaml quelconque. Sert en général à dénir des fonctions auxilliaires, des déclarations préliminaires, etc.

Analyse lexicale : Ocamllex Syntaxe des expressions régulières Camllex "string" : une chaîne de caractère ; 'char ' : un caractère ; ['char 1 ' 'char 2 '...] : char 1 ou char 2 ou... ; ['char 1 ' - 'char 2 '] : un caractère compris entre char 1 et char 2 ; eof : la n du chier ; regexp* : regexp répétée un nombre quelconque de fois ; regexp+ : regexp répétée au moins une fois ; _ : n'importe quelle chaîne de caractères ; etc.

Analyse lexicale : Ocamllex Expressions régulières : exercice Dénissez le lexème entier. Dénissez le lexème identiant.

Analyse lexicale : Ocamllex Les actions Une action consiste à construire la valeur correspondant à un lexème. On utilise pour cela des constructeurs (comme pour les types union). On peut récupérer le contenu du lexème reconnu grâce à l'expression Lexing.lexeme lexbuf (a pour type string ). Example [ ' 0 ' ' 9 ' ] + {INT ( i n t _ o f _ s t r i n g ( L e x i n g. l e x e m e l e x b u f ) ) }

Analyse lexicale : Ocamllex Exemple : lexer d'expressions arithmétiques lexer.mll { open P a r s e r ; ; } r u l e t o k e n = p a r s e '+ ' {PLUS} ' ' {MOINS} ' ' {MULT} ' / ' {DIV} [ ' 0 ' ' 9 ' ] + {INT ( i n t _ o f _ s t r i n g ( L e x i n g. l e x e m e l e x b u f ) ) } [ ' A' ' z ' ] + {IDENT ( L e x i n g. l e x e m e l e x b u f )}

Analyse grammaticale : Ocamlyacc Plan 1 Introduction 2 Analyse lexicale : Ocamllex 3 Analyse grammaticale : Ocamlyacc 4 Structuration globale

Analyse grammaticale : Ocamlyacc Grammaires : rappel Une grammaire est un quadruplet G =< V, T, P, S >, avec : V l'ensemble des variables. T l'ensemble des terminaux. P l'ensemble des règles de production. P (V T ) V (V T ) (V T ) Example S V le symbole de départ. V = S T = a, b, c P = S asbs, S c Mots reconnus :

Analyse grammaticale : Ocamlyacc Grammaires : rappel Une grammaire est un quadruplet G =< V, T, P, S >, avec : V l'ensemble des variables. T l'ensemble des terminaux. P l'ensemble des règles de production. P (V T ) V (V T ) (V T ) Example S V le symbole de départ. V = S T = a, b, c P = S asbs, S c Mots reconnus : c, acbc, aacbcbc,...

Analyse grammaticale : Ocamlyacc Grammaires (2) Dans une grammaire non-contextuelle, toutes les règles de P sont de la forme : V i w où V i V et w (V T ) + Arbre de dérivation d'une grammaire : Racine : S. N ud : une variable. Feuille : un terminal. Mot w vérié par une grammaire il existe un arbre dont les feuilles lues dans l'ordre forment w. Dans une grammaire ambiguë, plusieurs arbres de dérivation peuvent aboutir au même mot. Grammaire non-contextuelle mais ambiguë P = S assb, S asbs, S b Le mot abbb correspond à plusieurs arbres de dérivation.

Analyse grammaticale : Ocamlyacc Arbre de syntaxe abstraite Un arbre de syntaxe abstraite (AST) permet de représenter une construction d'un langage de programmation. Dans un AST, un n ud correspond à un opérateur dont les ls sont les opérandes. Les feuilles correspondent soit à une constante soit à une variable de la grammaire du langage. L'analyse syntaxique consiste à construire l'ast correspondant au programme pris en entrée. C'est la première phase de la compilation. Les phases suivantes de la compilation (moderne) consistent à eectuer une suite d'analyses et de transformations sur cet arbre.

Analyse grammaticale : Ocamlyacc (Caml)yacc yacc est un outil d'analyse grammaticale Unix. Il prend en entrée un ensemble de règles de grammaires et produit un analyseur syntaxique reconnaissant le langage correspondant. Les grammaires acceptées sont non-contextuelles mais pas forcément non-ambiguës (signalé par des warnings). Tout comme pour lex, ocamlyacc produit un chier.ml contenant l'analyseur syntaxique (à partir d'un chier.mly).

Analyse grammaticale : Ocamlyacc Forme générale Code %{ h e a d e r %} d e c l a r a t i o n s %% r u l e s %% t r a i l e r

Analyse grammaticale : Ocamlyacc Déclaration des lexèmes Les règles de la grammaire yacc manipulent des lexèmes dénis dans le lexer associé. Les diérents lexèmes doivent être déclarés dans le parser à l'aide du mot clé token : %token constr1... constrn : rajoute les lexèmes constr 1,... constrn. %token <typexpr> constr1 constrn : fait de même mais attache en plus un attribut de type typexpr aux lexèmes. Règles d'associativité et de priorité entre opérateurs : % left constr1 constr2 : ces opérateurs sont associatifs à gauche (% right pour droite, %nonassoc pour non associatif). Lorsqu'on a plusieurs lignes avec de telles déclaration, les opérateurs les plus prioritaires sont ceux apparaissant en dernier.

Analyse grammaticale : Ocamlyacc Exemple : parser d'expressions arithmétiques parser.mly (1/2) %{ open Ast ; ; %} ( Header ) ( Lexemes e t l e u r t y p e ) %t o k e n <i n t > INT %t o k e n <s t r i n g > IDENT %t o k e n PLUS MOINS MULT DIV ( R e g l e s d ' a s s o c i a t i v i t e e t p r i o r i t e s ) %l e f t PLUS MOINS %l e f t MULT DIV ( Symbole de d e p a r t e t s o n t y p e ) %s t a r t exp %type <Ast. expr > exp %%

Analyse grammaticale : Ocamlyacc Les règles de grammaire Forme Générale n o n t e r m i n a l : symbol... symbol { a c t i o n }... symbol... symbol { a c t i o n } symbol correspond ici soit à un lexème soit à un autre non-terminal (une autre règle de la grammaire). action construit la valeur correspondant à la (sous)-règle reconnue. Dans une action, $1 permet d'accéder à la valeur produite par l'action associée au premier symbole de la règle, $2 au deuxième, etc.

Analyse grammaticale : Ocamlyacc Exemple : parser d'expressions arithmétiques (2) parser.mly (2/2) ( L e s r e g l e s ( une s e u l e i c i ) ) exp : INT { E x p I n t $1 } IDENT { ExpVar $1 } exp PLUS exp { ExpBin ( $1, Plus, $3 ) } exp MOINS exp { ExpBin ( $1, Moins, $3 ) } exp MULT exp { ExpBin ( $1, Mult, $3 ) } exp DIV exp { ExpBin ( $1, Div, $3 ) }

Structuration globale Plan 1 Introduction 2 Analyse lexicale : Ocamllex 3 Analyse grammaticale : Ocamlyacc 4 Structuration globale

Structuration globale Programme principal Il faut maintenant : Dénir les structures de données (l'ast) construites par le parser. Invoquer le parser et le lexer sur un chier d'entrée. Compiler le tout.

Structuration globale Exemple : AST ast.ml type b i n o p = P l u s Moins Mult Div type e x p r = E x p i n t of i n t ExpVar of s t r i n g ExpBin of e x p r b i n o p e x p r

Structuration globale Programme principal arith.ml open AST ; ; l e t s t r i n g _ o f _ e x p r e = match e with E x p I n t i > s t r i n g _ o f _ i n t i ExpVar v > v... l e t _ = l e t l e x b u f = L e x i n g. from_channel ( open_in " f i c. t x t " ) i n l e t e = P a r s e r. e x p r L e x e r. t o k e n l e x b u f i n P r i n t f. f p r i n t f ( s t r i n g _ o f _ e x p r e )

Structuration globale Compilation o c a m l l e x l e x e r. m l l # > l e x e r. ml o c a m l y a c c p a r s e r. mly # > p a r s e r. ml e t p a r s e r. m l i ocamlc c p a r s e r. m l i ocamlc c l e x e r. ml ocamlc c p a r s e r. ml ocamlc c a s t. ml ocamlc c a r i t h. ml ocamlc o a r i t h l e x e r. cmo p a r s e r. cmo a s t. cmo a r i t h. cmo