Td N°4 Exercice 1: S → Sxsy S → Z S → Ε
Td N°4 Exercice 1: S → Sxsy S → Z S → Ε
Td N°4 Exercice 1: S → Sxsy S → Z S → Ε
TD N4 Exercice 1
Soit G = ({S} {x,y,z}, S) la grammaire suivante
S SxSy S z S
Construisez lanalyseur SLR(1) de la grammaire suivante : Simulez-en le fonctionnement sur la chane xzxyy.
Exercice2
On considre la grammaire G sur l'alphabet terminal A = {a, b, c } et non terminal = {S, T,U, V } qui engendre un langage fini et qui a pour rgles :
S aT | Ub | V c T Uc| V b U V
1. Montrer que cette grammaire est LL(1). 2. En utilisant les 0-items montrer que G n'est pas SLR(1). 3. Montrer que cette grammaire n'est pas LR(0).
Exercice 3
1. Ecrire les fichiers dentre pour Lex et pour Yacc permettant de lire en entre une expression arithmtique traditionnelle (en notation infixe, avec les oprateurs +, -, * et /). On rappelle que ces oprateurs sont associatifs gauches : a + b c ((a + b) c) que les + et ont la mme priorit, que les * et / ont la mme priorit, et que les + et sont moins prioritaires que les * et / : a + b / c (a + (b / c)) - Construire en mme temps son arbre de syntaxe abstraite.
2. Complter le programme pour imprimer partir de larbre lexpression en notation prfixe, postfixe et compltement parenthse. void ImprimerPrefixe (EXPR_ARBRE a); void ImprimerPostfixe (EXPR_ARBRE a); void ImprimerParenthese (EXPR_ARBRE a); 3.
Modifier ces fichiers dentre pour accepter loprateur binaire modulo % (reste de la division entire) ayant une associativit gauche et de mme priorit que les * et /.
4. Modifier ces fichiers dentre, pour accepter les oprateurs unaires ++ et -- (resp. incrmentation et dcrmentation comme en C) ayant une associativit droite et de priorit suprieure aux * et / : a * ++b c ((a * (++b)) c) 5. Modifier ces fichiers dentre, pour accepter loprateur ternaire ?: (comme en C) ayant une associativit droite et moins prioritaire que les + et - : a * (b + c) ? e : f ? g : h + g ((a * (b + c)) ? e : (f ? g : (h + g))) 6. Modifier ces fichiers dentre, pour accepter loprateur binaire daffectation = ayant une associativit droite et moins prioritaire que le ?: : a = b = c ? d : e (a = (b = (c ? d : e))) A gauche du symbole =, on ne peut trouver quune seule variable.