27 mars 2014 : Écriture en C++ d'un analyseur descendant
- Organisation
- La notation polonaise préfixée
- La grammaire proposée par Louis
Lecailliez
Mise en œuvre en C++ de la stratégie d'analyse
descendante,
sous la forme d'un programme C++ qui produit
- la dérivation gauche associée au mot candidat, si ce mot
appartient au langage
- une erreur dans le cas contraire.
avec la pile (de string
) vue avec M.A. Moreaux et un
lexeur produit par FOMA (voyez la
page sur l'analyse lexicale).
Pour mémoire : le code de la pile pile.h
et pile.cpp
.
-
- Le lexeur est
composé de deux parties
- l'une commune à tous les exemples (pour explications,
voir le cours de M.A. Moreaux):
lex.h
et lex.cpp
- l'autre qui varie selon le cas traité :
token.foma
(programme) et token.fst
(fichier-texte, version compilée
appelée par C++)
- La commande de compilation prend la forme d'un script shell :
FOMA=où-se-trouve-sur-votre-ordinateur-la-bibliothèque-FOMA/lib
g++ -Wall -pedantic -o pp pile.h pile.cpp lex.h lex.cpp leParseur.cpp
$FOMA/libfoma.a -lz
-
S -> op S S
S -> cte
S -> var
Exemple : chaîne "+* 12+xxx
89+678 yyy
" dans le fichier "e.txt
"
jfp$ ./pp < e.txt
+ -- S
* -- S S
12 -- S S S
+ -- S S
xxx -- S S S
89 -- S S
+ -- S
678 -- S S
yyy -- S
OK : 1 1 2 1 3 2 1 2 3
-
S -> ( op2 S S )
S -> ( op1 S )
S -> chn
avec op2
= '||
', '&&
'
et op1 = '~
'.
Exemple : chaîne "(~(|| xxx (&& (~ vvv) yyy)) )
"
dans le fichier "e.txt
"
jfp$ ./pp < e.txt
( -- S
( -- S pf
xxx -- S S pf pf
( -- S pf pf
( -- S S pf pf pf
vvv -- S pf S pf pf pf
) -- pf S pf pf pf
yyy -- S pf pf pf
) -- pf pf pf
) -- pf pf
) -- pf
OK : 2 1 3 1 2 3 3