suivant: Lien avec l'interpréteur
monter: Quelques points particuliers
précédent: Table des symboles
  Table des matières
Détection des erreurs
Comme dans tout langage (de programmation ou même de description), il s'agit de réagir
correctement aux erreurs de syntaxe de l'utilisateur. En particulier, un compilateur qui ne détecterait
pas de telles erreurs n'est pas acceptable, car cela conduirait à des structures de données
incohérentes. En outre, les erreurs détectées doivent être précisément signalées à l'utilisateur afin
qu'il puisse facilement corriger son programme. Notre compilateur répond bien à cette double
contrainte. Cependant, l'exécution du compilateur se termine dès qu'une erreur est détectée, et un
code d'erreur est renvoyé. Il faut alors relancer le compilateur pour réessayer autre chose. À
l'utilisation cela se révèle assez gênant, mais pour faire mieux, il aurait notamment fallu utiliser des
structures de données intermédiaires, et surtout disposer de davantage de temps.
En outre, le compilateur n'est nullement gêné en cas de référence à un prédicat non encore
défini. Il ne signale d'ailleurs rien à l'utilisateur. Cela permet certes de s'affranchir de l'ordre de
définition des prédicats et de ne pas introduire de notion de déclaration (nécessaire par exemple
pour des prédicats mutuellement récursifs), mais le débuggage n'en est que plus difficile. En effet,
la moindre faute de frappe peut empêcher (et ne s'en prive généralement pas !) un programme
utilisateur de fonctionner, et sa détection "à la main" peut s'avérer très longue (il faut déjà envisager
un tel cas au lieu de remettre en cause les algorithmes). En ce point, notre compilateur fait donc
aussi bien que le Prolog III de PrologIA (utilisé à l'ENSSAT), mais il n'y a aucun mérite là-dedans.
Quoiqu'il en soit, les erreurs de syntaxe sont détectées à deux niveaux bien distincts. Celles
découlant directement de la grammaire sont prises en charge par Yacc (à travers le code qu'il
génère), qui appelle le cas échéant une routine que nous avons écrite (yyerror dans le fichier
gloorp.l). Les autres, qui relèvent de la syntaxe enrichie et, à ce titre, n'enfreignent pas la
grammaire, sont détectés par nos points de générations.
Dans cette première catégorie, se trouvent typiquement les suites de lexèmes incorrectes :
conc(;
plus(a, b, c) -> plus(b, a, c) -> ;
Les erreurs de la deuxième catégorie sont pour leur part plus subtiles. Il est ainsi interdit d'avoir
une partie gauche de règle réduite à une simple variable (une variable peut bien sûr apparaître
comme argument d'un prédicat situé en partie gauche). Par ailleurs, les règles d'un même paquet
doivent être consécutives, et il est interdit de compléter un paquet antérieur, comme dans :
bonjour -> ...;
bonjour -> ...;
salut -> ...;
bonjour -> ...;
suivant: Lien avec l'interpréteur
monter: Quelques points particuliers
précédent: Table des symboles
  Table des matières
Alexandre DAGAN
2000-07-07