next up previous contents
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 -> ...;

next up previous contents
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