JavaCC et ANTLR : générateurs de parseurs. marco savard



Documents pareils
Évaluation et implémentation des langages

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

Générer du code à partir d une description de haut niveau

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

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

Cours 1 : La compilation

Projet de développement. Introduction à Eclipse. Application à votre projet. Philippe Collet. Organisation. Cours 1 : principes généraux - svn

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

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

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

Projet de développement

RTDS G3. Emmanuel Gaudin

Les Langages Informatiques

Développement d un interpréteur OCL pour une machine virtuelle UML.

Chapitre I Notions de base et outils de travail

Rapport de Synthèse. Création d un Générateur de modèle PADL pour le langage C++ Sébastien Colladon

Environnements de développement (intégrés)

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

Éléments de programmation et introduction à Java

Optimisation de logiciels de modélisation sur centre de calcul

Programme et contenus Licence d'informatique de Lille, parcours MIAGE, en alternance ou en formation continue (13:40)

LES OUTILS D ALIMENTATION DU REFERENTIEL DE DB-MAIN

Interpréteur d algèbre relationnelle

Compilation. Algorithmes d'analyse syntaxique

Préparation à l examen EFA en Macro

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

OCL - Object Constraint Language

Machines virtuelles. Brique ASC. Samuel Tardieu Samuel Tardieu (ENST) Machines virtuelles 1 / 40

Traduction des Langages : Le Compilateur Micro Java

Cours en ligne Développement Java pour le web

LANGAGUE JAVA. Public Développeurs souhaitant étendre leur panel de langages de programmation

Meta Object Facility. Plan

Java Licence professionnelle CISII,

Visual Paradigm Contraintes inter-associations

Étude de l interopérabilité de deux langages de programmation basée sur la machine virtuelle de Java

Programme scientifique Majeure ARCHITECTURE DES SYSTEMES D INFORMATION. Mentions Ingénierie des Systèmes d Information Business Intelligence

TP1 : Initiation à Java et Eclipse

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Programmer en JAVA. par Tama

Télécom Nancy Année

Institut Supérieure Aux Etudes Technologiques De Nabeul. Département Informatique

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

DotNet. Plan. Les outils de développement

ACTIVITÉ DE PROGRAMMATION

Information utiles. webpage : Google+ : digiusto/

Derrière toi Une machine virtuelle!

Serveur d'application Client HTML/JS. Apache Thrift Bootcamp

Principes. 2A-SI 3 Prog. réseau et systèmes distribués 3. 3 Programmation en CORBA. Programmation en Corba. Stéphane Vialle

DSL. Domain Specific Language. À l'aide des technologies Eclipse Modeling. Goulwen Le Fur Le 23 novembre 2012

RMI le langage Java XII-1 JMF

Architecture Orientée Service, JSON et API REST

Programmation Web. Madalina Croitoru IUT Montpellier

Vulgarisation Java EE Java EE, c est quoi?

Serveur d Applications Web : WebObjects

XML, PMML, SOAP. Rapport. EPITA SCIA Promo janvier Julien Lemoine Alexandre Thibault Nicolas Wiest-Million

Catalogue des Formations Techniques

AUVRAY Clément (168187) HOMBERGER Alexandre (186897) GLADE. Langages, outils et méthodes pour la programmation avancée Page 1 sur 12

Module BD et sites WEB

Mise en œuvre des serveurs d application

basée sur le cours de Bertrand Legal, maître de conférences à l ENSEIRB Olivier Augereau Formation UML

Cours d Algorithmique et de Langage C v 3.0

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

Mercredi 15 Janvier 2014

Programme «Analyste Programmeur» Diplôme d état : «Développeur Informatique» Homologué au niveau III (Bac+2) (JO N 176 du 1 août 2003) (34 semaines)

IFT785 Approches Orientées Objets. FINAL Été Remise : Jeudi 19 août 2002 à 9h00 am

Bases Java - Eclipse / Netbeans

IFT2255 : Génie logiciel

Cours de Programmation 2

LICENCE PROFESSIONNELLE SYSTEMES INFORMATIQUES & LOGICIELS

Architecte Logiciel. Unité de formation 1 : Développer en s appuyant sur les modèles et les frameworks 7 semaines

Initiation à JAVA et à la programmation objet.

Auto-évaluation Programmation en Java

TP 1. Prise en main du langage Python

Chapitre VI- La validation de la composition.

Corrigé des exercices sur les références

Installation de DocBook sur un système Linux

Java c est quoi? Java. Java. Java : Principe de fonctionnement 31/01/ Vue générale 2 - Mon premier programme 3 - Types de Programme Java

TP1 : Initiation à Java et Eclipse

Ingénieur Développement Nouvelles Technologies

Architectures web/bases de données

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

Systeme d'exploitation

PROFIL DU CANDIDAT. Ingénieur Etudes confirmé JAVA ans d expérience

Z i e d Z a i e r ( )

Les nouvelles architectures des SI : Etat de l Art

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

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

Ingénierie des Modèles. Méta-modélisation

Logiciel Libre Cours 2 Fondements: Programmation

Chapitre 1 Qu est-ce qu une expression régulière?

Annexe : La Programmation Informatique

Laurent JOLIN. Compétences. Expériences professionnelles. Architecte technique. 15, rue Jean Favier Toulouse

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

4. SERVICES WEB REST 46

CC30 Certificat de compétence Conception, développement et animation de sites Web

Cours No 3 : Identificateurs, Fonctions, Premières Structures de contrôle.

Transcription:

JavaCC et ANTLR : générateurs de parseurs marco savard 1

Plan de la présentation Pourquoi «parser»? Théorie du «parsing» Diagramme syntaxique, BNF, grammaire Outils : JavaCC et ANTLR Quelques exemples Pièges à éviter et conseils 2

Pourquoi «parser»? Compilateur Interpréteur Rétro-ingénierie Audits automatique de code Métriques Langues naturelles (?) 3

Langages roulant avec la JVM Jacl (Tcl in Java) Jython (Python) JBasic Lisp Smalltak Cobol Ada Eiffel Une bonne centaines de langages : http://www.robert-tolksdorf.de/vmlanguages.html En utilisant Javacc/ANTLR pour parser et BCEL pour produire le bytecode, vous pourriez écrire votre propre langage de programmation (http://jakarta.apache.org/bcel/). 4

Expérience personnelle Parseur de C++ avec lex/yacc Rétro-ingénierie de Java vers UML Définition et interprétation d un langage propriétaire de script Audits et métriques de code Java 5

Théorie Analyse lexicale (lexer) Erreur lexicale Java : un nombre mal construit (ex: 0x00fg, 1.3.2, 1.2e2.5) Analyse syntaxique (parser) Erreur syntaxique Java : un modifiant non-permis (ex: abstract final void method()) Analyse sémantique Erreur sémantique Java : un méthode redéfinissante (overriding) qui ne propage (throws) pas une exception non-runtime déclarée dans la méthode redéfinie (overridden) dans la super-classe. 6

Analyse lexicale (lexing) Note : les commentaires sont consommés par le lexer 7

Analyse syntaxique (parsing) 8

Diagramme lexicale Un nombre dans une BD Oracle : Un digit : Est-ce valide? +32 0.5 070 1.0f 0. 10E2.5 0e3.1 0xff 1e0-0. PI 9

Diagramme lexicale Un nombre dans une BD Oracle : Un digit : Expression régulière: number := (+ -)? (([0-9]+ (.)? [0-9]*) (. [0-9]+ )) ( (e E) (+ -)? [0-9]+ )? 10

Expressions régulières Regular expression ou regex en anglais Texte décrivant un patron de recherche Concept de wildcards étendu (ex: *.txt) Outils UNIX (grep, awk, Tcl, Perl..) Librairies depuis Java 1.4 (java.util.regex) Pour plus de détails: Mastering Regular Expressions, O'Reilly and Associates, 1997. Tutorial Sun : Regular Expressions http://java.sun.com/docs/books/tutorial/ex tra/regex/index.html 11

Expressions régulières KEYWORD [a-z]+ add_clause IS (NOT)? NULL (NOT FOUND) ERROR WARNING variable (, variable)* (statement)+ 12

Un nombre en Java Java1_4.jj (JavaCC): TOKEN :{ < INTEGER_LITERAL: <DECIMAL_LITERAL> (["l","l"])? <HEX_LITERAL> (["l","l"])? <OCTAL_LITERAL> (["l","l"])? > < #DECIMAL_LITERAL: ["1"-"9"] (["0"-"9"])* > < #HEX_LITERAL: "0" ["x","x"] (["0"-"9","a"-"f","A"-"F"])+ > < #OCTAL_LITERAL: "0" (["0"-"7"])* > Java1_5.g (ANTLR): NUM_INT :. ( 0.. 9 )+ (EXPONENT)? (FLOAT_SUFFIX)? ( 0 (( x X ) (HEX_DIGIT)+) ( 0.. 7 )+ )? ( 1.. 9 ) ( 0.. 9 )* ( l L ) 13

Backus-Naur Form (BNF) Formule mathématique pour décrire formellement un langage Utilisé par Backus pour décrire Algol60 symbol := alternative1 alternative2 LHS (Left-Hand Side) : symbol RHS (Right-Hand Side): the rest Règle terminale : où le RHS est formé uniquement de lexèmes (tokens) Règle non-terminale : où le RHS contient des règles définies ailleurs par des LHS Règle récursive : où un des éléments du RHS est dans le LHS Details : http://www.garshol.priv.no/download/text/bnf.html 14

Java grammar BNF CompilationUnit := OptPackageDeclaration ImportDeclarations TypeDefinitions EOF ImportDeclaration := import IDENTIFIER ; TypeDeficitions := TypeDefinition OptPackageDeclaration := PackageDeclaration /*nothing */ ; PackageDeclaration := package IDENTIFIER ; ImportDeclarations := ImportDeclarations importdeclaration TypeDefinitions := TypeDefinitions TypeDefinition TypeDefinitions := ClassDefinition TypeDefinition := InterfaceDefinition Trouvez les LHS, RHS, règles terminales et non-terminales, etc. Note : Les parseurs LR, tels que yacc, préfèrent la recursion a gauche (comme ImportDeclarations importdeclaration, voir [LEX&YACC] page 197). 15

Extended Backus-Naur Form (BNF) Regex + BNF = EBNF Support de [optional] or (optional)? (one_or_many)+ (zero_or_many)* 16

Java grammar EBNF Java1_4.jj (JavaCC) : void CompilationUnit() : {} { [ PackageDeclaration() ] ( ImportDeclaration() )* ( TypeDeclaration() )* <EOF> } void PackageDeclaration() : {} { "package" Name() "; } void ImportDeclaration() : {} { "import" Name() [ "." "*" ] "; } { hook_method() } Java1_5.g (ANTLR) : compilationunit : ( packagedefinition /*nothing*/ ) ( importdefinition ) * ( typedefinition )* EOF! ; packagedefinition : p: package identifier SEMI! ; ImportDefinition options { hook_method() } : i: import ( static )? identifierstar SEMI! ; typededinition : m:modifiers (classdefinition interfacedefinition) ; 17

Outils Lex (GNUs flex) : lexer Yacc (GNU s bison) : LALR(1) parser Jlex : Java lexer CUP : Java LALR(1) parser PCCTS -> ANTLR: LL(k) parser (C, puis Java) SableCC : LL(k) parser JavaCC : LL(k) parser 18

Topologie des parseurs L Parsers Left-to-right parsers LR parsers LL parsers Left-to-right Rightmost-first parsers Left-to-right Leftmost-first parsers (bottom-up parsers) (top-down parsers) SLR LALR(1) CLR Simple LR Look-ahead LR Canonical LR (yacc, bison, CUP) LL(k) ANTLR, JavaCC Ref:http://encyclopedia.thefreedictionary.com/parser 19

Workflow de JavaCC 1) If JAVA_UNICODE_ESCAPE = true -> extracts JavaCharStream.java 2) JavaCC avant 3.0 => ASCII_CharStream.java & ASCII_UCodeESC_CharStream.java 3) Tout est genere dans le paquetage com.myapp.parsers 20

Workflow de ANTLR 1) If exportvocab = Java, le parseur est généré en langage Java. 2) Tout est genere dans le paquetage spécifié dans la clause declaration; 21

Ambuiguité syntaxique Grammaire ambiguë : Expression := Expression + expression Expression * expression ( expression ) ; NUMBER 2+3*4 : is ambiguous Grammaire nonambiguë: Expression := expression + mulexpr mulexpr ; Mulexpr := mulexpr * primary primary ; Primary := ( expression ) NUMBER ; Note : Java1_4.jj de JavaCC et Java1_5.g de ANTLR utilisent cette approche (AdditiveExpression and MultiplicativeExpression); yacc utilise une technique de priorité d opérations (+ compliqué). 22

Répertoires de grammaires JavaCC (*.jj files): Ada C/C++ HTML IDL (Corba) Java Python Rational Rose (Petal) SQL (ANSI) Visual Basic VRML XML See:http://www.cobase.cs.ucla.edu/pub/javacc/ ANTLR (*.g files): Ada C/C++/C# HTML IDL (Corba) Java OCL (UML constraints) Pascal Python RCS files (CVS) SQL (SQLServer2000, Oracle7) VRML See: http://www.antlr.org/grammar/list 23

Utilisation JavaCC: Grammaire *.jj Trois fichiers généres Quatre fichiers extraits ANTLR: Grammaire.g Trois fichiers générés Dépend d une librarrie externe antlr.jar 24

Exemples Faire la démo JavaCC/ANTLR 25

JavaCC versus ANTLR Avantages JavaCC : Interface usager intuitif Syntaxe de la grammaire plus simple Parseur autonome (sans.jar) (pour Java) grammaire plus tolérante Avantages ANTLR : Historique «open source» plus long Peut générer des parseurs en Java ou en C++ Intégration avec Eclipse Un peu plus de grammaires disponibles 26

Alternatives aux parseurs StringTokenizer StreamTokenizer Interpretor Design Pattern SAX/DOM XML libraries 27

StringTokenizer Convient pour séparer des mots dans une chaîne Un seul type de séparateur Un seul type de token 28

StreamTokenizer Convient pour séparer des tokens d un flux entrant Quatre types de tokens par défaut Possibilité de rédéfinir les tokens 29

Librairies DOM/SAX Même si JavaCC et ANTLR ont des grammaires XML, vaut mieux utiliser DOM/SAX DOM préférable en général (mais plus lent). SAX est évenementiel (event-driven), donc plus rapide et plus près de l approche des parseurs. 30

Pièges Ne pas définir de paquetage de génération Mélanger les classes générées de parsage et les classes normales dans le paquetage. Mettre trop de code dans la grammaire Les commentaires sont perdus à l`analyse lexicale (solution : lexer hook methods) 31

Conseils Définir une interface Actions.java, puis faites hériter des implémentations de Actions Définir une classe implémentant Actions.java pour le debogage (trace) Laisser LA = 1 32

Références LALR(1) : [LEX&YACC] O Reilly & Associates, 1995, 366 pages LL(k) : Presque rien sur JavaCC ou ANTLR Références électroniques seulement 33