Mantis Bug Tracker

View Issue Details Jump to Notes ] Issue History ] Print ]
IDProjectCategoryView StatusDate SubmittedLast Update
0003238OCamlOCaml generalpublic2004-10-26 16:412004-11-02 11:48
Reporteradministrator 
Assigned To 
PrioritynormalSeverityfeatureReproducibilityalways
StatusacknowledgedResolutionopen 
PlatformOSOS Version
Product Version 
Target VersionFixed in Version 
Summary0003238: documentation Lexing.position
DescriptionFull_Name: Jean-Christophe Filliâtre
Version: ocaml 3.08.1
OS: Linux
Submission from: pc8-142.lri.fr (129.175.8.142)



Bonjour,

Je me permets de vous faire remonter une (petite) critique, issue de
notre utilisation d'ocaml avec les étudiants de maîtrise d'Orsay.

Comme chaque année ils écrivent un compilateur en ocaml, et comme
chaque année nous exigeons d'eux que leur compilateur affiche des
messages d'erreurs bien localisés, i.e. donnant la ligne et la colonne
conernées. Pendant des années, cette petite exigeance a été une vraie
souffrance pour les étudiants (qui torturaient leur lexeur, écrivaient
une recherche de la ligne a posteriori, etc.)

Heureusement, depuis ocaml 3.07 il y a le type Lexing.position. Merci
pour cela.

Malheureusement, le comportement d'ocamllex vis-à-vis de ce type est
peu spécifié.

D'une part le commentaire expliquant que seul le champ pos_cnum est
mis à jour n'est pas très bien placé : en effet si on lit seulement la
documentation de lexeme_start_p et du type position alors on loupe
cette info essentielle et pourtant on a bien lu tout ce dont on avait
besoin (il n'est pas nécessaire d'aller comprendre ce qu'est le type
lexbuf a priori).

Mais surtout il n'est expliqué nulle part (je ferai mon mea culpa si
j'ai tord) que la machinerie d'ocamllex copie la valeur de tous les
champs autres que pos_cnum (probablement par une construction with,
comme on l'imagine facilement). Du coup il n'est pas évident qu'il
suffit de mettre à jour les champs pos_lnum et pos_bol à chaque
retour-chariot seulement.

Bien entendu, il suffit de lire les sources d'ocaml pour voir qu'une
petite fonction du genre

======================================================================
  let newline lexbuf =
    let pos = lexbuf.lex_curr_p in
    lexbuf.lex_curr_p <-
      { pos with pos_lnum = pos.pos_lnum + 1; pos_bol = pos.pos_cnum }
======================================================================

appelée à chaque retour-chariot suffit (ce qui est un net progrès par
rapports aux anciennes manières de procéder), mais nos étudiants n'ont
pas le réflexe d'aller lire les sources d'ocaml :-)

Bref, ne prenez pas mal cette petite critique, mais un peu plus de
documentation à cet endroit-là aiderait (une petite illustration dans
la doc du module Lexing, avec la fonction ci-dessus donnée par
exemple, serait parfait).

Une autre critique que font souvent nos étudiants : certains messages
d'erreur d'ocamlyacc sont affichés dans un format incompatible avec la
fonction next-error d'Emacs. C'est vraiment pénible...

Cordialement,
--
Jean-Christophe

TagsNo tags attached.
Attached Files

- Relationships

-  Notes
(0000236)
administrator (administrator)
2004-11-02 11:48

messages d'erreur ocamlyacc: fait

- Issue History
Date Modified Username Field Change
2005-11-18 10:13 administrator New Issue


Copyright © 2000 - 2011 MantisBT Group
Powered by Mantis Bugtracker