CSI 3525 - Devoir #1

Elements de correction

I. Preliminaires et historique

    Pas de problemes majeurs dans cette partie. Les reponses suivantes ne sont bien sur pas des references absolues mais juste un recueil des idees que l'on pouvait extraire du manuel de cours.

    1. Orthogonalite

Toute combinaison de primitives de base est legale et a un sens.

Des avantages de l'orthogonalite sont donc :

Des inconvenients de l'orthogonalite sont : La lisibilite est la facilite avec laquelle les programmes peuvent etre lus et compris. La fiabilite est une mesure de la correspondance entre ce que fait reellement un programme et ses specifications.

Il etait ici important d'evoquer l'importance de la phase de maintenance dans le "cycle de vie" d'un logiciel. C'est en grande partie dans cette phase que la lisibilite va trouver toute son importance surtout si ce n'est pas le concepteur original qui en est charge.

Les caracteristiques ameliorant la lisibilite sont les suivantes :

3. Algol 60 / Fortran

Algol 60 est ne du desir de creer un langage universel et libre (Fortran appartenait a IBM).

Ses buts :

Les innovations d'Algol 60 : Apres quelques hesitations, IBM decide de ne pas soutenir Algol, se souvenant des difficultes pour developper un compilateur efficace pour Fortran. Cette decision est probablement a l'origine de l'echec d'Algol, avec le fait que la forme BNF etait alors difficile a comprendre.

Mais Algol a ete accepte dans la publication et a donc fait evoluer enormement la conception des langages. C'est pourquoi nombreux sont les langages posterieurs qui lui doivent beaucoup : PL/I, SIMULA 67, ALGOL 68, C, Pascal, Ada et C++ sont les plus importants...
 
 

II. Analyse syntaxique

1. Trouver une grammaire...

Probablement la question la plus difficile du devoir.
Les bonnes idees : le cas difficile est celui des crochets et on ne peut mettre le meme element a gauche et a droite (c'est precisement ce qui differencie A et Z), les caracteres x et y doivent etre traites a part et doivent pouvoir etre generes par la grammaire...
Et les mauvaises : dissocier les crochets [ et ] en les faisant apparaitre avec les caracteres x et y, reproduire la meme formule dans plusieurs non-terminaux (cela genere tres souvent des ambiguites), utiliser plus de deux non-terminaux en plus des caracteres...

La reponse ideale etait probablement :

<chaine> -> (<chaine>) | [(<chaine>),<chaine>] | [<caractere>,<chaine>] | <caractere>
<caractere> -> x | y

La variante suivante etait egalement acceptable et meme plus lisible :

<chaine> ->  <element> | [<element>,<chaine>]
<element> -> (<chaine>) | <caractere>
<caractere> -> x | y
 

2. Derivation

La question etait relativement facile donc la correction a ete relativement peu tolerante. Comme aucune derivation particuliere n'etait imposee, toutes les formes ont ete acceptees.

abag
S -> aA
    -> abA
    -> abCg
    -> abag

aabg
S -> Bg
    -> CBg
    -> aBg
    -> aCbg
    -> aabg

                                S
                               /  \
                             B   g
                            /  \
                          C   B
                          |    /  \
                         a  C   b
                              |
                             a
 

3. Ambiguite

La seule demonstration valable et rigoureuse de l'ambiguite etait d'utiliser un exemple. Prenons a * b *a.

                                 S
                                 |
                                X
                               / | \
                            X  * X
                           / | \      |
                         X *X   Y
                          |     |     |
                         Y   Y    a
                          |     |
                         a     b

                                S
                                 |
                                X
                               / | \
                            X  * X
                             |     / | \
                            Y  X *X
                             |    |     |
                            a   Y   Y
                                  |     |
                                  b    a

On obtient donc deux arbres differents pour la meme expression, la grammaire est ambigue.

Les propositions suivantes etaient valables :
S -> X
X -> X * Y | Y
Y -> a | b | c

S -> X
X -> Y*X | Y
Y -> a | b | c

S -> Y*S | Y
Y -> a | b | c
 
 
 
 

rigouste@site.uottawa.ca