Théorie des langages Détails d’analyse syntaxique avec JavaCC et JJTree1 Jérôme Voinot [email protected] http://lifc.univ-fcomte.fr/~voinot Licence informatique 3ème année Octobre 2007 Laboratoire d’Informatique de l’Université de Franche-Comté 1 Réalisé à partir de documents de A. Giorgetti Principe de JavaCC Pas de : Eliminer les productions vides Analyse descendante LL(k) Eliminer les récursivités gauches Conflits ”lecture-réduction” (tenir compte des ”warnings”) Pour plus de détails, voir le tutoriel LookAhead https://javacc.dev.java.net/doc/lookahead.html J. Voinot TL - Détails d’analyse syntaxique avec JavaCC et JJTree 2/7 Productions JavaCC 4 sortes de règles en JavaCC Règles lexicales : définit la partie régulière du langage (unités lexicales) Règles syntaxiques : règles de grammaire en Extended Backus-Naur Form (EBNF) ”TOKEN MANAGER DECLS” : déclarations qui seront incluses dans l’analyseur lexicale généré Règles en code Java : Code Java pour les parties hors-contextes de la grammaire J. Voinot TL - Détails d’analyse syntaxique avec JavaCC et JJTree 3/7 Format des règles syntaxiques Equivalente à la norme EBNF Pour en savoir plus : http://www.cl.cam.ac.uk/~mgk25/iso-ebnf.html J. Voinot TL - Détails d’analyse syntaxique avec JavaCC et JJTree 4/7 Rôle de JJTree Génère un fichier .jj pour JavaCC Avec des annotations syntaxiques de créations de noeuds Fichier .jjt : syntaxe JavaCC + annotations JJTree (#) Génère des classes de noeuds Node (interface) |- SimpleNode (classe) |- AST... |- AST... Classes AST... si options { MULTI=true ; } sinon tous les noeuds sont de classe SimpleNode J. Voinot TL - Détails d’analyse syntaxique avec JavaCC et JJTree 5/7 Nœuds JJTree En partie gauche de règle Si void nonTerminal() : {} { ... } alors : Un noeud par non-terminal Ses fils sont les noeuds construits par l’exécution des méthodes en partie droite de règle Donne un arbre d’analyse syntaxique (AAS) Si void nonTerminal() #void : { ... } alors pas de noeud créé pour ce non-terminal En partie droite de règle void nonTerminal() : {} { ... #Binaire(2) #Tout() } Nombre de fils fixé par le paramètre Si aucun paramètre, tous les noeuds sur la pile J. Voinot TL - Détails d’analyse syntaxique avec JavaCC et JJTree 6/7 Portée des nœuds JJTree Exemple : void affect() #AffectNode() : {} { ident() #IdentNode(1) { /* code java (a) */ } " :=" expression() { /* code java (b) */ } } Dans le bloc de code java (a), jjtThis désigne un noeud unaire de classe ASTIdentNode Son unique fils sera construit par ident() Dans le bloc de code java (b), jjtThis désigne un noeud de classe AffectNode et d’arité quelconque Ses fils sont tous les noeuds de la pile Son premier fils sera de classe ASTIdentNode) et les suivants seront construits par expression() J. Voinot TL - Détails d’analyse syntaxique avec JavaCC et JJTree 7/7