L3/TL — TP 1
Premiers pas de JavaCC
L’objectif de ce TP est de se familiariser avec l’outil d’analyse syntaxique JavaCC. Le travail
consiste `a modifier et `a compl´eter des fichiers fournis. Ces fichiers sont disponibles `a l’adresse
suivante :
http://circe.univ-fcomte.fr/Jerome-Voinot/TL/TP1/
1 Analyse lexicale
Le but de ces exercices est, d’une part, de se familiariser avec l’analyseur lexical de JavaCC
(lexer) et d’autre part, d’appliquer les connaissances sur les expressions r´eguli`eres vues en cours.
Le dossier source contient deux fichiers.
1. Exercice1.jj, qui est reproduit dans la figure 1.
2. Lanceur1.java, qui est reproduit dans la figure 2.
Exercice1.jj contient un analyseur syntaxique au format javaCC. Il se compile avec la com-
mande suivante : javacc Exercice1.jj
PARSER_BEGIN(Exercice1)
public class Exercice1 { }
PARSER_END(Exercice1)
/* --------------------- Regles lexicales ------------------------ */
SKIP: {
" " | "\r" | "\t"
}
TOKEN: {
<EOL: "\n" >
| < ALETTER: "a">
| < AWORD: (<ALETTER>)+ >
}
void start(): {System.out.print("start parsing");}{
<AWORD>
}
Fig. 1 – Fichier Exercice1.jj
Le compilateur cr´ee un certain nombre de fichiers sources Java. Ce sont les sources de l’analy-
seur syntaxique correspondant au fichier Exercice1.jj. En particulier, un fichier Exercice1.java
1
est cr´e. C’est la classe principale du parser (analyseur syntaxique). La classe Lanceur1.java per-
met de l’ex´ecuter.
La seconde ´etape est de compiler les sources avec la commande : javac *.java Puis on peut
ex´ecuter le parser par la commande : java Lanceur1
public class Lanceur1 {
public static void main (String args[]) throws ParseException {
Exercice1 parser = new Exercice1(System.in);
parser.start();
}
}
Fig. 2 – Fichier Lanceur1.java
Exercices
1. Taper les mots aa,aaa,aaaaa,b... Que constatez vous ?
2. Taper le mot a. Est-il accept´e ? Remplacer dans le fichier .jj la ligne <ALETTER: "a"> par la
ligne <#ALETTER: "a">. Que constatez-vous ? A pr´esent, l’analyseur syntaxique Exercice1.jj
reconnaˆıt les mots du langage correspondant `a l’expression r´eguli`ere (a)+.
3. Ecrire les r`egles lexicales et syntaxiques permettant de reconnaˆıtre les langages suivants :
(a+b)+,a|b+,a.(b+).a.
4. La r`egle lexicale suivante permet de reconnaˆıtre un chiffre :
<DIGIT: [0-9]>
Inegrez-la dans votre parseur. Puis, en vous inspirant de ce mod`ele, ´ecrivez les r`egles lexicales
permettant de d´ecrire un nombre entier <INT> , une chaˆıne de caract`eres <STRING>, une
chaˆıne de caract`eres en majuscules, une chaˆıne de caract`eres commecant par "a".
2 Analyse syntaxique
Les expressions r´eguli`eres ne permettent pas de reconnaˆıtre des langages alg´ebriques tels que
L2={an.c.bn|n0}.
Pour reconnaˆıtre ce genre de langages, il faut utiliser des r`egles syntaxiques. Par exemple, la
grammaire du fichier Exercie2.jj (reproduit dans la figure 3) reconnaˆıt le langage L2.
2.1 Utilisation des r`egles syntaxiques
Le but de cet exercice est de construire un parser pour une structure if ... then ... else `a l’aide
de r`egles syntaxiques.
1. D´efinir dans le lexer la reconnaissance des mots du langage.
2. D´efinir les r`egles syntaxiques pour reconnaˆıtre le langage suivant :
if (<STRING>) {<STRING>} else {<STRING>}
o`u <STRING> reconnaˆıt une chaˆıne de caract`eres quelconque.
3. Transformer votre grammaire afin d’autoriser l’utilisation d’une autre structure if imbriqu´ee.
Par exemple, cette grammaire doit engendrer
if ( a) { if (b){c} else {d} } else {e}
2
PARSER_BEGIN(Exercice2)
public class Exercice2 { }
PARSER_END(Exercice2)
/* --------------------- Regles lexicales ------------------------ */
SKIP: {
" " | "\r" | "\t"
}
TOKEN: {
<EOL: "\n" >
| < ALETTER: "a">
| < BLETTER: "b">
| < CLETTER: "c">
}
void start(): {}{
<ALETTER> start() <BLETTER> | end()
}
void end(): {} {
<CLETTER>
}
Fig. 3 – Fichier Exercice2.jj
2.2 Reconnnaˆıtre une expression arithm´etique
Le dernier exercice consiste `a cr´eer, dans un fichier Exercice3.jj, un parser pour les expres-
sions arithm´etiques. Ces expressions sont constitu´ees de constantes (nombres), du signe "+" et du
signe "*".
Indication : Pour ces expressions, il faut d’abord trouver sur papier une grammaire sans r´ecursivit´e
gauche, sans , et qui tienne compte de la priorit´e de la multiplication sur l’addition.
3
1 / 3 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !