Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

documentation Lexing.position #3238

Closed
vicuna opened this issue Oct 26, 2004 · 3 comments
Closed

documentation Lexing.position #3238

vicuna opened this issue Oct 26, 2004 · 3 comments

Comments

@vicuna
Copy link

vicuna commented Oct 26, 2004

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

  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

@vicuna
Copy link
Author

vicuna commented Nov 2, 2004

Comment author: administrator

messages d'erreur ocamlyacc: fait

@github-actions
Copy link

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.

@github-actions github-actions bot added the Stale label May 18, 2020
@nojb
Copy link
Contributor

nojb commented May 18, 2020

Duplicate of #3930, fixed in 3.11 a16126b

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants