Corrigé de l'exercice 2
Le barème indiqué (total pour l'exercice : 8 points) est sur 30 points, et la note finale (sur 20) est obtenue par une règle de trois.
Arbres de dérivation (3 points / 30) : ces arbres (non reproduits ici) montrent que l'expression *p++ est équivalente à *(p++) : l'opérateur d'incrémentation porte sur p et non sur *p.
Note : il est raisonnable de considérer que ++ forme une seule unité lexicale.
Commentaire (2 points / 30) : tout programmeur C est censé connaître la sémantique de l'expression *p++, qui désigne la valeur pointée par p, avec incrémentation ultérieure de p.
On constate que très peu d'étudiant(e)s sont capables de formuler ce commentaire sans dire de bêtise : dire que l'opérateur d'incrémentation porte sur p n'équivaut pas à dire que l'incrémentation est antérieure au déréférencement (tout le monde est censé connaître la différence entre p++ et ++p) ! Certain(e)s regrettent que l'enseignement de maîtrise soit trop théorique, mais très peu obtiennent les deux points attribués à ce commentaire pour programmeur de bon sens.
Analyse LL(1) (3 points / 30) :
premier (postfixe) = premier (primaire) = { identificateur, ( }
donc le caractère * n'appartient pas à premier (postfixe), et le choix entre
unaire -> * unaire et unaire -> postfixe
est déterministe. Comme premier (postfixe) = premier (primaire) le choix entre
postfixe -> postfixe ++ et postfixe -> primaire
n'est pas déterministe, et le nombre d'unités lexicales à lire avant de pouvoir effectuer le bon choix n'est pas borné. Cet argument est parfois remplacé dans les copies par un argument stupide sur la longueur non bornée des identificateurs (alors qu'un identificateur constitue toujours une seule unité lexicale). Enfin les parties droites des règles
primaire -> identificateur et primaire -> ( expression )
débutent par des unités lexicales différentes, et le choix est à nouveau déterministe.