You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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
The text was updated successfully, but these errors were encountered:
This issue has been open one year with no activity. Consequently, it is being marked with the "stale" label. What this means is that the issue will be automatically closed in 30 days unless more comments are added or the "stale" label is removed. Comments that provide new information on the issue are especially welcome: is it still reproducible? did it appear in other contexts? how critical is it? etc.
Original bug ID: 3238
Reporter: administrator
Status: acknowledged
Resolution: open
Priority: normal
Severity: feature
Category: documentation
Bug description
Full_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
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
The text was updated successfully, but these errors were encountered: