Le générateur de parsers YACC/BISON

Documents pareils
Le prototype de la fonction main()

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)

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

Programmation système I Les entrées/sorties

3IS - Système d'exploitation linux - Programmation système

Rappels Entrées -Sorties

Programmation système de commandes en C

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

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

Le langage C. Séance n 4

MISE A NIVEAU INFORMATIQUE LANGAGE C - EXEMPLES DE PROGRAMMES. Université Paris Dauphine IUP Génie Mathématique et Informatique 2 ème année

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

Cours de C. Petits secrets du C & programmation avancée. Sébastien Paumier

Introduction au langage C

Arguments d un programme

Algorithmique et Programmation, IMA

Les structures. Chapitre 3

Cours Programmation Système

INFO-F-404 : Techniques avancées de systèmes d exploitation

Programmation système en C/C++

PROJET ALGORITHMIQUE ET PROGRAMMATION II

Programmation C. J.-F. Lalande. 15 novembre 2012

Cours 6 : Tubes anonymes et nommés

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

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

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

Programmation Réseau SSH et TLS (aka SSL)

INFO-F-105 Language de programmation I Séance VI

Programmation Classique en langage C

Le Langage C Version 1.2 c 2002 Florence HENRY Observatoire de Paris Université de Versailles florence.henry@obspm.fr

Interpréteur d algèbre relationnelle

Outils pour la pratique

Java Licence Professionnelle CISII,

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

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

Initiation à l algorithmique

Programmation C. Apprendre à développer des programmes simples dans le langage C

30.avr.10 Présentation miniprojet. 9.mars.10 Cours 3 4.mai.10 Cours C mars.10 Cours 4 11.mai.10 Cours C++ 2

DNS Server RPC Interface buffer overflow. Céline COLLUMEAU Nicolas BODIN

OS Réseaux et Programmation Système - C5

Langages et Concepts de Programmation Introduction à la programmation en langage C

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

Présentation du langage et premières fonctions

STAGE IREM 0- Premiers pas en Python

Architecture des ordinateurs

Les processus. Système L3, /39

DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51

TD3: tableaux avancées, première classe et chaînes

Machines virtuelles fonctionnelles (suite) Compilation ML Java

Exercice sur les Dockers

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

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

Programme awk------introduction rapide

Programmation en langage C d un µcontrôleur PIC à l aide du compilateur C-CCS Sommaire

BASES DE DONNEES TP POSTGRESQL

Archivage Messagerie Evolution pour usage HTML en utilisant Hypermail

Une introduction à Java

Lier Erlang avec d autres langages de programmation

API REST COLLABORATORS TITLE : API REST ACTION NAME DATE SIGNATURE. WRITTEN BY 08 juin 2012 REVISION HISTORY

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

Les processus légers : threads. Système L3, /31

Utilisation d objets : String et ArrayList

Les chaînes de caractères

COMPARAISONDESLANGAGESC, C++, JAVA ET

Chap III : Les tableaux

INF111. Initiation à la programmation impérative en C amini/cours/l1/inf111/ Massih-Reza Amini

Les fichiers. Chapitre 4

Chapitre 10. Les interfaces Comparable et Comparator 1

V- Manipulations de nombres en binaire

Brefs rappels sur la pile et le tas (Stack. / Heap) et les pointeurs

Cours de Programmation 2

Modernisation, développement d applications et DB2 sous IBM i Technologies, outils et nouveautés Volubis.fr

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

INITIATION A LA PROGRAMMATION

Langage propre à Oracle basé sur ADA. Offre une extension procédurale à SQL

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

Programmation C++ (débutant)/instructions for, while et do...while

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

A.E.C. GESTION DES APPLICATIONS TECHNOLOGIE DE L'INFORMATION LEA.BW

Premiers Pas en Programmation Objet : les Classes et les Objets

Derrière toi Une machine virtuelle!

ACTIVITÉ DE PROGRAMMATION

Cours Informatique Master STEP

ARDUINO DOSSIER RESSOURCE POUR LA CLASSE

Notes de Cours - Programmation Pascal Ferraro

Représentation d un entier en base b

Présentation du PL/SQL

Les structures de données. Rajae El Ouazzani

Exercices sur SQL server 2000

UE C avancé cours 1: introduction et révisions

TP 1. Prise en main du langage Python

Seance 2: En respectant la méthode de programmation par contrat, implémentez les autres fonctions de jeu.

Cours Java Native Interface

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

Programmation en langage C

Centre CPGE TSI - Safi 2010/2011. Algorithmique et programmation :

Théorie de la Programmation

Programmer en JAVA. par Tama

Langage Éric Guérin 5 octobre 2010

Anis ASSÈS Mejdi BLAGHGI Mohamed Hédi ElHajjej Mohamed Salah Karouia

Transcription:

Le générateur de parsers YACC/BISON INFO-F-403 Théorie des langages Partie pratique N. MAQUET INFO-F-403 YACC / BISON p. 1

Introduction 1 YACC est un outil qui permet de générer automa{t g}iquement des parsers. Son entrée est une spécification qui décrit la grammaire du langage et les action à effectuer tout au long du parsing. Sa sortie est un morceau de code C qui implémente le parser sous forme d une fonction : yyparse(). INFO-F-403 YACC / BISON p. 2

Le parser généré Le parser généré par YACC a les caractéristiques suivantes : Il analyse la grammaire en bottom-up ; Il fait appel à la fonction yylex() comme analyseur lexical. Celle-ci peut provenir de LEX. (mais ce n est pas obligatoire) ; Il fait appel à la fonction yyerror() en cas d erreur (à implémenter) ; Il effectue les actions spécifiées pour chaque règle lors du reduce de la règle. INFO-F-403 YACC / BISON p. 3

Spécification YACC Spécification en trois parties (séparées par %%) : Partie 1 : les déclarations Déclarations C entre %{ et %} Déclaration des tokens grâce au mot-clef %token ; Associativité des opérateurs : %left, %right et %nonassoc. INFO-F-403 YACC / BISON p. 4

Spécification YACC Spécification en trois parties (séparées par %%) : Partie 2 : les règles. Sont de la forme : symbol : definition1 {action1} definition2 {action2}... ; Les actions sont effectuées à chaque fois que la définition correspondante est réduite. INFO-F-403 YACC / BISON p. 4

Spécification YACC Spécification en trois parties (séparées par %%) : Partie 2 : les règles. Les définitions sont formées de parties gauches d autres règles et d identifiants de tokens ; Les tokens auront été déclarés dans la première partie grâce à %token ; Pour que LEX utilise les mêmes tokens, on fait appel à YACC avec l option -d, pour générer y.tab.h. INFO-F-403 YACC / BISON p. 4

Spécification YACC Spécification en trois parties (séparées par %%) : Partie 3 : le code C. Il peut contenir les fonctions suivantes : main(), qui fait alors appel à yyparse() ; yyerror()... sans commentaires! yylex(), qui sera en général générée par LEX dans un fichier séparé. INFO-F-403 YACC / BISON p. 4

Attributs YACC permet d associer des attributs à chaque symbole, grâce aux variable $$, $1, $2,... $$ est l attribut de la partie gauche de la règle ; $i est l attribut du ième symbole de la partie droite de la règle ; Par défaut, ces attributs sont des entiers ; On peut y accéder dans le code : expression : expression + term {$$ = $1 + $3} ; INFO-F-403 YACC / BISON p. 5

Attributs : les terminaux À quoi correspondent les attributs $i des terminaux? Il s agit de la valeur mise dans yylval par la fonction yylex(). INFO-F-403 YACC / BISON p. 6

Attributs : types plus complexes Les entiers c est bien... mais on peut faire mieux! On peut déclarer les tokens comme étant des union au sens de C : %union { int cmd ; char * text ; double val ; } Cet union sera aussi le type de yylval! INFO-F-403 YACC / BISON p. 7

Attributs : types plus complexes 2 On peut choisir d associer un terminal ou un non-terminal à un élément particulier de l union. Pour les terminaux, cela se fait grâce à %token : %token<val> REAL %token<text> IDENTIFIER INFO-F-403 YACC / BISON p. 8

Attributs : types plus complexes 2 On peut choisir d associer un terminal ou un non-terminal à un élément particulier de l union. Pour les non-terminaux, cela se fait grâce à %type : %type<val> expression %type<val> term... expression : expression + term {$$ = $1 + $3 ;} // $$, $1 et $3 : de type double INFO-F-403 YACC / BISON p. 8

Attributs : types plus complexes 3 Attention! dans le scanner LEX, il faut toujours déclarer explicitement quel élément de l union on manipule! Pour un token associé au champ c de l union, on devra donc stocker la valeur de l attribut dans yylval.c. INFO-F-403 YACC / BISON p. 9

Exemple Spécification LEX %{ #include "y.tab.h" %} integer [0-9]* real ([0-9]*"."[0-9]+) nl \n %% [ \t]+ ; {integer} { sscanf(yytext, "%d", &yylval.integer) ; return INTEGER ; } {real} { sscanf(yytext, "%lf", &yylval.real) ; return REAL ; } {nl} { extern int lineno ; lineno++ ; return \n ; }. { return yyext[0] ; } %% INFO-F-403 YACC / BISON p. 10

Exemple Spécification YACC %{ #include <stdio.h> %} %union { double real ; int integer ; } %token <real> REAL %token <integer> INTEGER %type <real> rexpr %type <integer> iexpr %left + - %left * / INFO-F-403 YACC / BISON p. 11

Exemple Spécification YACC %% iexpr: INTEGER {$$ = $1 ;} iexpr + iexpr { $$ = $1 + $3 ; } iexpr - iexpr { $$ = $1 - $3 ; } iexpr * iexpr { $$ = $1 * $3 ; } iexpr / iexpr { if ($3) $$ = $1 / $3 ; else { printf ("error: division by zero\n") ; yyerror() ; } } ( iexpr ) { $$ = $2 ; } ; rexpr: REAL rexpr + rexpr [... ] INFO-F-403 YACC / BISON p. 12

Exemple Spécification YACC char * progname ; int lineno ; main(int argc, char ** argv) { progname = argv[0] ; yyparse() ; } yyerror(char * s) { fprintf(stderr, "%s: %s", progname, s) ; fprintf(stderr, " line %d\n", lineno) ; } INFO-F-403 YACC / BISON p. 13

Exercices Voir feuilles volantes distribuées au T.P. INFO-F-403 YACC / BISON p. 14