Série d'exercices #1
IFT-2035 7 septembre 2021
1.1 Préxe, postxe et ASA
Pour chaque expression inxe ci-dessous, réécriver l'expression en notation pré- xe et postxe. Dessiner également l'arbre de syntaxe abstraite (ASA).
1. a+b+c 2. a+ (b+c) 3. a·b+c·d 4. a+b < a·(c+d)
5. (−b+sqrt(b·b−4·a·c))/(2·a)
1.2 Postxe et machine à pile
La notation postxe s'évalue facilement à l'aide d'une pile. L'algorithme général est :
1. Lire l'expression de gauche à droite.
(a) S'il s'agit d'un nombre, l'empiler.
(b) S'il s'agit d'un opérateur :
i. dépiler le nombre correspondant de valeurs du sommet de la pile ; ii. calculer le résultat ;
iii. et l'empiler.
2. Lorsque la lecture est terminée, le résultat est au sommet de la pile.
Illustrer cet algorithme avec les expressions de la section 1.1.
1.3 Si et seulement si
Voici une grammaire pour if. . . then. . . else. Les éléments E et X représentent des expressions et parties de la grammaire qu'il n'est pas important de spécier
ici. S ::= X
| if E then S
| if E then S else S Cette grammaire est ambiguë.
1
1. Donner un exemple d'ambiguïté.
2. Donner une grammaire non ambiguë qui associe les else avec le if le plus proche, comme le font les langages de programmation habituels.
1.4 Conversion de base
Écrire les fonctions suivantes en Haskell pour convertir des nombres en représen- tation binaire à décimal et vice versa (à remarquer que l'argument est un entier et que par exemple l'entier cent-un représente le nombre binaire un-zéro-un qui correspond à 5 en décimal). Vous aurez besoin des fonctions prédénies mod, et div.
bin2dec10001 ∗ 17 dec2bin17 ∗ 10001
Écrire la fonction baseconv en Haskell qui convertit d'une base à une autre (≤10). N'hésitez pas à dénir des fonctions auxiliaires si nécessaire.
baseconv2 10 10001 ∗ 17 baseconv10 2 17 ∗ 10001
Donner aussi le type de chacune des fonctions que vous avez dénies.
Note : La distinction entre une valeur et sa représentation est un thème qui réapparait souvent dans ce cours, par exemple sous la forme de la diérence entre la syntaxe et la sémantique des programmes.
1.5 Ambiguïté et récursion
Soit la grammaire suivante pour des expressions arithméthiques expr ::= expr+expr
| expr∗expr
| number 1. Montrer que cette grammaire est ambiguë.
2. Réécrire cette grammaire de manière à éliminer les ambiguïtés.
3. Cette grammaire est récursive à gauche, ce qui pose problème pour cer- taines techniques d'analyse syntaxique : En eet, dans un parseur avec analyse descendante (top down), la portion du programme devant lire la catégorie expr va devoir d'abord faire appel à la portion du programme qui doit lire la catégorie expr ...
Réécrire la grammaire de manière à éviter cette récursion à gauche.
2