Théorie des langages - Détails d`analyse syntaxique avec

publicité
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
Téléchargement