Vous êtes sur la page 1sur 8

Analyse syntaxique Polyte

h-IG4

ANTLR : une brève introdu tion

1 Généralités
ANTLR = ANother Tool for Language Re ognition :
générateur de ompilateurs, interpréteurs, tradu teurs
• auteur (au départ) : Teren e Parr
• obje tifs : é rire rapidement des tradu teurs pour des langages spé i-
ques à un domaine.
• version a tuelle : antlr3
• générateurs d'analyseurs des endants : LL(1), LL(2), ..., LL(*)
• peut générer du Java, C, Python, et ...

1 GÉNÉRALITÉS 1
Analyse syntaxique Polyte h-IG4

2 Prin ipe
En entrée : un  hier sour e dé rivant une grammaire (dénition des
tokens et produ tions)
• la grammaire peut être dé rite ave le format EBNF
• dans la partie droite peuvent gurer des a tions : fragments de ode
é rits en java
En sortie : le ode de l'analyseur lexi al et de l'analyseur syntaxique (ou
du tradu teur)

=⇒ travail du programmeur :
1. dénir la grammaire (proprement)
2. éventuellement rajouter les a tions né essaires

2 PRINCIPE 2
Analyse syntaxique Polyte h-IG4

3 Un exemple
Grammaire : { Axiome → S, S → abR | bRbS, R → a | bR }
Le sour e ANTLR :

3 UN EXEMPLE 3
Analyse syntaxique Polyte h-IG4

Après génération : réation d'un répertoire output omprenant :


 essai.tokens ( ontient les odes des unités lexi ales)
 essaiLexer.java ( ode de l'analyseur lexi al)
 essaiParser.java ( ode de l'analyseur syntaxique)

3 UN EXEMPLE 4
Analyse syntaxique Polyte h-IG4

• Un extrait du ode de l'analyseur syntaxique

// $ANTLR 3.2 Sep 23, 2009 12:02:23


import org.antlr.runtime.*;
import java.util.Sta k;
import java.util.List;
import java.util.ArrayList;
publi lass essaiParser extends Parser {
publi essaiParser(TokenStream input) {
this(input, new Re ognizerSharedState());
}
.....
publi final void axiome() throws Re ognitionEx eption {
try {
{
pushFollow(FOLLOW_grands_in_axiome25);
grands();
state._fsp--;
mat h(input,EOF,FOLLOW_EOF_in_axiome27);
}
}
....
}
return ;
}

3 UN EXEMPLE 5
Analyse syntaxique Polyte h-IG4

publi final void grands() throws Re ognitionEx eption {


try {// ..... ( 'a' 'b' grandr | 'b' grandr 'b' grands )
int alt1=2;
int LA1_0 = input.LA(1); //{ LA1_0 ontient le ara tère ourant}
if ( (LA1_0==5) ) { alt1=1;} // as où ourant est 'a'
else if ( (LA1_0==6) ) { alt1=2;} // as où ourant est 'b'
else {..... throw nvae;}
swit h (alt1) {
ase 1 :// produ tion S -> 'a' 'b' R
{mat h(input,5,FOLLOW_5_in_grands52); // 5 orrespond à 'a'
mat h(input,6,FOLLOW_6_in_grands54); // 6 orrespond à 'b'
pushFollow(FOLLOW_grandr_in_grands56);
grandr(); state._fsp--;}
break;
ase 2 :// produ tion S -> 'b' R 'b' S
{mat h(input,6,FOLLOW_6_in_grands63);
pushFollow(FOLLOW_grandr_in_grands65);
grandr();state._fsp--;
mat h(input,6,FOLLOW_6_in_grands67);
pushFollow(FOLLOW_grands_in_grands70);
grands(); state._fsp--;}
break;
}
} ....
return ;}

3 UN EXEMPLE 6
Analyse syntaxique Polyte h-IG4

4 Un exemple ave une a tion


Même grammaire, mais on veut a her un message à la n de l'anlayse réussie
d'une entrée :
grammar essai;
options{k=1;}
// produ tions
axiome : grands EOF {System.out.println(" 'est gagne");}
;
grands : A B grandr
| B grandr B grands
;
grandr : A
| B grandr
;
// tokens
WS : (' '|'\t'|'\n')+ {skip();} ;
A : 'a' ;
B : 'b';

4 UN EXEMPLE AVEC UNE ACTION 7


Analyse syntaxique Polyte h-IG4

ode du parser pour le non terminal axiome

publi final void axiome() throws Re ognitionEx eption {


// produ tion : axiome -> S EOF {System.out.println(" 'est gagne");}
try {
{
pushFollow(FOLLOW_grands_in_axiome25);
grands();
state._fsp--;
mat h(input,EOF,FOLLOW_EOF_in_axiome27);
System.out.println(" 'est gagne");
}
}
......
return ;
}

attention : le ode rajouté dans la produ tion est re opié


tel quel dans le ode généré par antlr ; il faut don qu'il
soit orre t !

4 UN EXEMPLE AVEC UNE ACTION 7

Vous aimerez peut-être aussi