TODO 14.2 KB
Newer Older
POTTIER Francois's avatar
POTTIER Francois committed
1
2
* Error.signal should call error_message?

3
* Document --list-errors --interpret-error --compile-errors --compare-errors --update-errors
POTTIER Francois's avatar
POTTIER Francois committed
4
    explain that any production that contains [error] is ignored by --list-errors
POTTIER Francois's avatar
POTTIER Francois committed
5
6
  Should --list-errors also print the sentence in concrete form? (as a comment)
    requires knowing the concrete form of every token
POTTIER Francois's avatar
POTTIER Francois committed
7
  document the .messages file format
POTTIER Francois's avatar
POTTIER Francois committed
8
9
    likely pitfall: if Menhir says, "foo" is not a valid nonterminal symbol,
    then look for a blank line, higher up, between two sentences.
10
    explain the meaning of the spurious reductions warning
POTTIER Francois's avatar
POTTIER Francois committed
11
  document the workflow
12
  collect performance data
POTTIER Francois's avatar
POTTIER Francois committed
13
14
    correlate with star size and alphabet size, etc.
    create separate graphs for 3 modes: --lalr, pager, --canonical
POTTIER Francois's avatar
POTTIER Francois committed
15
  remove lr.csv when done
POTTIER Francois's avatar
POTTIER Francois committed
16
  Could --interpret-error obey --trace?
POTTIER Francois's avatar
POTTIER Francois committed
17
18
19
20
21
  Auto-comment: show the shape of the stack (invariant).
  Idea: allow the user to make assertions about
    the known shape of the stack,
    the known lhs of all items in the state,
    the possible continuations...?
POTTIER Francois's avatar
POTTIER Francois committed
22
23
  Idea: investigate the use of placeholders (in the message)
        that could be filled with dynamic information!
POTTIER Francois's avatar
POTTIER Francois committed
24

POTTIER Francois's avatar
POTTIER Francois committed
25
26
* Dans les avantages de Menhir versus ocamlyacc (dans la doc et
  sur la page Web), ajouter le back-end Coq, l'API incrémentale
POTTIER Francois's avatar
POTTIER Francois committed
27
28
  et l'API d'inspection, les règles anonymes, la gestion fine des
  erreurs de syntaxe...
POTTIER Francois's avatar
POTTIER Francois committed
29

30
31
32
33
* BUG dans ErrorReporting si l'erreur se produit dans l'état
  initial. Pénible que l'API d'inspection ne donne pas accès
  à l'état courant lorsque la pile est vide (état initial donc).
  Pourrait-on exposer cet état? Polymorphe? incoming_symbol
POTTIER Francois's avatar
POTTIER Francois committed
34
  devrait alors produit une option. Et le cas Nil du type
35
  stream devrait contenir l'état initial...
POTTIER Francois's avatar
POTTIER Francois committed
36
  attention, car si on lui applique la fonction items, on va
37
38
39
40
  obtenir un item spécial S' -> S # qui va poser problème.
  Exposer l'état initial avec un type différent lr1initial?
  De toute façon il faudra compliquer la notion de explanation
  qui ne pourra plus toujours être basée sur un item...
POTTIER Francois's avatar
POTTIER Francois committed
41

42
* Gabriel veut pouvoir inclure MenhirLib dans le parser engendré
POTTIER Francois's avatar
POTTIER Francois committed
43

44
45
46
* gros BUG à corriger: il ne faut pas exiger le prochain token
  AVANT une réduction par défaut. Il faut suivre ocamlyacc et
  bison. Réfléchir... et corriger les deux back-ends. Attention
47
48
  toutefois, c'est un changement incompatible. Option de ligne
  de commande?
49
  Réfléchir à l'impact sur les positions.
POTTIER Francois's avatar
POTTIER Francois committed
50
  Il faut aussi revisiter la notion de conflit end-of-stream.
51
52
53
54
  - si réduction par défaut, alors pas de conflit possible!
  - si conflit, alors pourquoi on le résoud en éliminant la
    réduction sur #? on pourrait faire aussi le choix opposé,
    à savoir éliminer toutes les autres actions. Que fait
POTTIER Francois's avatar
POTTIER Francois committed
55
    ocamlyacc?
56

POTTIER Francois's avatar
POTTIER Francois committed
57
58
* autoriser %token FOO "foo"
  pour pouvoir afficher les tokens sous forme plus lisible
59
  et auto-générer une fonction (ou une table) print_terminal
POTTIER Francois's avatar
POTTIER Francois committed
60

POTTIER Francois's avatar
POTTIER Francois committed
61
* autoriser %token FOO (unused)
62
63
  (syntaxe concrète à déterminer)
  équivalent à --unused-token FOO sur la ligne de commande.
POTTIER Francois's avatar
POTTIER Francois committed
64

65
* Produce well-chosen (predictable) names for anonymous rules?
POTTIER Francois's avatar
POTTIER Francois committed
66

67
68
* In the standard library, possibly rename "anonymous" and "embedded" and
  document them. The non-inline version allows embedding an action in the
69
  middle of a rule.
70

POTTIER Francois's avatar
POTTIER Francois committed
71
72
* ErrorReporting: experiment with merging several symbols
  so as to reduce the noise (e.g. operators, expressions,
POTTIER Francois's avatar
POTTIER Francois committed
73
74
  etc.). Or just print the same way, but don't quotient
  internally, as the locations are not the same.
POTTIER Francois's avatar
POTTIER Francois committed
75

POTTIER Francois's avatar
POTTIER Francois committed
76
77
  Also, sort the explanations by a certain measure of
  complexity. E.g., those that go back to a "higher" non-terminal
POTTIER Francois's avatar
POTTIER Francois committed
78
79
80
81
82
83
84
  symbol should be preferred. Or those that go back further away
  in the buffer?

  Think about HTML output with mouse-over. Or mouse-click.
  Find a way of solving the scrolling problems.
    <pre> and <table> side by side, each with its scroll bar,
    would be nice.
POTTIER Francois's avatar
POTTIER Francois committed
85

POTTIER Francois's avatar
POTTIER Francois committed
86
87
* Add left-recursive lists to the standard library.

POTTIER Francois's avatar
POTTIER Francois committed
88
89
90
91
* Define [print_result].
  Define a printer that shows the states in the stack.
  Try computing a set of expected symbols in the current state.

POTTIER Francois's avatar
POTTIER Francois committed
92
* Generate default printers for terminal and nonterminal.
POTTIER Francois's avatar
POTTIER Francois committed
93
94
  Using modular implicits, generate terminal2token and
  nonterminal2value.
POTTIER Francois's avatar
POTTIER Francois committed
95

POTTIER Francois's avatar
POTTIER Francois committed
96
97
98
99
* document that --depend may produce inaccurate dependencies
  for parser.cmi and that it is recommended to use --raw-depend
  --ocamldep "ocamldep -modules" and work from there (which is
  what ocamlbuild does).
100

POTTIER Francois's avatar
POTTIER Francois committed
101
* Confirm and understand why the code back-end slows down by 50%
POTTIER Francois's avatar
POTTIER Francois committed
102
103
  between 4.01.0 and 4.02.1. Use the tag last309 for this purpose,
  or the master branch.
POTTIER Francois's avatar
POTTIER Francois committed
104

105
106
107
* Suite des patchs de Frédéric Bour.
    API d'inspection complète.
      Exposer le nombre d'états (pour la mémoisation) et une conversion état -> entier.
POTTIER Francois's avatar
POTTIER Francois committed
108
      Idem pour les productions.
POTTIER Francois's avatar
POTTIER Francois committed
109
110
      Fonctions d'affichage pour les types terminal, nonterminal, etc.?
      Fonctions d'isomorphisme entre token et 'a terminal * 'a?
POTTIER Francois's avatar
POTTIER Francois committed
111
    Librairie(s) pour la gestion des erreurs.
112
    Librairie pour la complétion du parsing.
POTTIER Francois's avatar
POTTIER Francois committed
113
      Need a way of feeding the parser a nonterminal symbol.
POTTIER Francois's avatar
POTTIER Francois committed
114
      Or a way of applying a semantic action to a vector of semantic values.
115
116

* Meilleurs messages d'erreur de syntaxe.
117
118
119
120
121
    Revenir en arrière après une erreur, car l'erreur
    n'est détectée qu'après quelques réductions. Une fois que l'on est
    revenu, on peut examiner les items de l'état courant et donner des
    positions de début d'item qui devraient être intéressantes.    
  Possibilité de coloriser ce qu'on a lu en indiquant ce qu'on a compris
POTTIER Francois's avatar
POTTIER Francois committed
122
  (sortie HTML).
POTTIER Francois's avatar
POTTIER Francois committed
123

POTTIER Francois's avatar
POTTIER Francois committed
124
125
126
* Test and document --lalr (maybe). Explain that it is (probably)
  incompatible in principle with --explain. Modify the code to fail
  gracefully when the problem arises.
POTTIER Francois's avatar
POTTIER Francois committed
127

128
129
130
* les positions fournies par menhir ne sont pas les mêmes fournies par
  ocamlyacc (voir messages de Tiphaine Turpin à partir du 30/08/2011).
  Est-ce un problème? Peut-on documenter quelles sont les
POTTIER Francois's avatar
POTTIER Francois committed
131
  positions fournies par Menhir? En particulier, pour une production
132
133
134
135
136
137
138
139
  vide, Menhir utilise _menhir_env.lexer.lex_start_p, c'est-à-dire le
  début du dernier token lu par le lexer; en principe c'est le token
  de lookahead donc ça va, mais ça pourrait donner un résultat bizarre
  si on réduit par défaut une production vide (on a alors pour position
  le début du token précédent?) (BUG?). Par ailleurs, il faut être
  conscient que si l'action ocamllex se rappelle récursivement, alors
  _menhir_env.lexer.lex_start_p n'est pas le début du token mais une
  position quelque part à l'intérieur du token (e.g. après des espaces
POTTIER Francois's avatar
POTTIER Francois committed
140
141
142
143
  blancs). SUGGESTION DE SOLUTION: au lieu de paires (startpos, endpos),
  utiliser un type abstrait d'intervalles, avec un traitement particulier
  de l'intervalle vide. (Voir mon message du 15/09/2011.)

144
145
146
147
148
* Tirer au clair la sémantique des $startpos/$endpos sur les productions vides.
    Jacques-Henri dit que $startpos devrait toujours être $endpos du symbole précédent plus les blancs,
    et symétriquement pour $endpos. Mais pour implémenter ça il faut consulter la pile?
  BUG: %inline ne préserve pas la sémantique de $startpos/$endpos.
    C'est vrai pour les productions epsilon (forcément)
POTTIER Francois's avatar
POTTIER Francois committed
149
    mais aussi pour des productions non-epsilon
150
151
      car $startpos de la production inlinée est changée en $endpos(x) où x est le symbole précédent!
  Si on gérait les positions par macro-expansion *avant* de faire l'inlining
POTTIER Francois's avatar
POTTIER Francois committed
152
153
  alors la passe d'inlining n'aurait pas besoin de s'en occuper (et serait
  correcte par construction).
POTTIER Francois's avatar
POTTIER Francois committed
154
155
156

* Tenter une minimisation a posteriori de l'automate. Sur la grammaire
  OCaml on devrait retrouver l'automate LALR, non?
157
158
159
  Faire cette minimisation *après* la résolution des conflits afin que
  la minimisation n'affecte pas le comportement de l'automate, même en
  présence de directives de priorité. Du coup si on combine --canonical
POTTIER Francois's avatar
POTTIER Francois committed
160
161
162
163
164
  et --minimize alors on devrait obtenir un automate correct, proche de
  IELR, voir Denny et Malloy. Confirmer.

* Pourquoi --canonical --table ne marche pas sur une grosse grammaire?
  (3m57 pour ocaml.mly versus 16s sans --table)
165
  Afficher combien de temps est passé à comprimer les tables.
POTTIER Francois's avatar
POTTIER Francois committed
166
167

* TableBackend en principe ne devrait pas avoir besoin de Invariant?
168
  Gain de temps/simplicité possible.
POTTIER Francois's avatar
POTTIER Francois committed
169

170
171
* Could we avoid listing the contents of MenhirLib in 4 different files?

POTTIER Francois's avatar
POTTIER Francois committed
172
173
174
* bundle the Coq library with menhir, and add demos/calc-coq
  to show how it is used

POTTIER Francois's avatar
POTTIER Francois committed
175
176
* Clarifier si ocamlbuild doit recevoir -use-ocamlfind, -no-ocamlfind,
  ou rien; tester en particulier sous Windows?
POTTIER Francois's avatar
POTTIER Francois committed
177
  Modifier la doc pour recommander ocamlfind.
POTTIER Francois's avatar
POTTIER Francois committed
178

179
180
* ajouter une possibilité de désactiver certains warnings (utile pour
  le cours de compilation où on démarre avec une grammaire à trous),
fpottier's avatar
fpottier committed
181
182
  par exemple les non-terminaux inaccessibles

fpottier's avatar
fpottier committed
183
* move to a new license (GPL V2?), as per Hongbo Zhang's request.
184
* Les fichiers dans demos/ ne devraient pas être sous QPL mais libres...
fpottier's avatar
fpottier committed
185

fpottier's avatar
fpottier committed
186
187
* _stage2/menhir.native --interpret fancy-parser.mly
  crashes with Stack_overflow when the input is just "grammar:\n"
POTTIER Francois's avatar
POTTIER Francois committed
188
  ... it seems to loop now ...
189

190
* BUG: la directive $type<...> nt donne lieu à un message d'erreur bizarre
191
192
  si le non-terminal nt n'existe pas. (Jacques-Henri.)

193
194
195
* On pourrait rendre moins restrictif le critère qui garantit la terminaison
  de l'expansion des non-terminaux paramétrés. Il suffirait de vérifier que
  les paramètres effectifs sont toujours des atomes (symboles terminaux ou
196
197
  non-terminaux), non? (Jacques-Henri.)

POTTIER Francois's avatar
POTTIER Francois committed
198
199
200
* En mode code on tire les tokens d'un lexbuf et l'utilisateur doit construire
  l'API moderne par `wrapping', s'il la souhaite. Mais en mode table l'API
  moderne est native et l'API traditionnelle est construite (par nous) par
201
202
203
204
  `wrapping', d'où risque de `double wrapping' pour un utilisateur qui veut
  alterner entre code et table. On devrait exposer nous-mêmes les deux API.
  En profiter pour laisser l'utilisateur contrôler comment un token doit
  être emballé en `fat token' (token + range).
POTTIER Francois's avatar
POTTIER Francois committed
205

206
207
208
* %inline pourrait-il fonctionner quand les productions à inliner ont un %prec?
    (ça aurait un sens au moins quand on inline dans une production unité?)
    (ou plus généralement quand on inline en dernière position?)
POTTIER Francois's avatar
POTTIER Francois committed
209

210
* Reconnaître les directives # n "foo" dans le fichier .mly et en tenir
POTTIER Francois's avatar
POTTIER Francois committed
211
212
  compte dans les locations.

213
214
215
216
217
* BUG: message de Valentin Gatien-Baron du 09/01/2010: le bug de --explain
  est-il bien le bug connu? peut-on le corriger? ne suffirait-il pas de
  passer sous silence les conflits qui ont lieu dans une partie inaccessible
  de l'automate?

218
219
* BUG: message de Valentin Gatien-Baron du 09/01/2010: le warning erroné à
  propos d'un %prec inutile peut-il être évité?
220

221
222
223
* Implémenter un test de détection de boucles. Si la grammaire contient une
  boucle, elle est infiniment ambiguë. Pour le test, calculer tous les
  nullables, ajouter une production unité A -> B dès qu'il existe une
224
  production A -> alpha B beta avec alpha et beta nullables, et regarder
225
  ensuite s'il existe un cycle de productions unité.
226

POTTIER Francois's avatar
POTTIER Francois committed
227
* Permettre une trace avec autre chose que fprintf stderr. Cela permettrait
228
229
230
  au programmeur (par exemple) de décider à runtime s'il veut afficher ou
  non la trace. (En mode --trace.) Et si possible, donner accès depuis
  l'extérieur à la fonction print_token qui est engendrée.
231

232
* (petit) BUG: --follow-construction n'affiche pas le contenu des états
233
234
235
  initiaux (r0)

* relire la preuve de Pager et comprendre si ce que fait Lr1.grow est correct
236
  ou pas; faut-il faire grossir les états existants, ou bien (par exemple) les
237
238
239
240
  supprimer et recommencer leur construction?

* que fait/que doit faire la combinaison --tokens-only --depend?

241
* Préserver dirname/ dans les directives #line émises.
242

243
244
* BUG: Boris (1.- bouclage parser sur une entrée erronée 2.- une lecture
  trop loin dans le stream, également liée à error).
245

246
247
* éviter "Warning: 22 conflicts ..." car emacs prend "Warning" pour un
  nom de fichier; d'après Damien, il devrait suffire que la phrase après
248
249
  les deux points ne commence pas par un nombre.

250
* ajouter une option -q pour désactiver tous les warnings
251

252
253
* si une variable est inutilisée dans une action sémantique, le
  warning est affiché dans le code produit.
254

255
256
257
258
* si une parenthèse est mal fermée dans une action sémantique,
  l'erreur de syntaxe peut être détectée par OCaml en dehors
  des actions sémantiques. Bétonner en mettant une séquence
  improbable de begin/end/parenthèseses autour de l'action?
259
260
261

* BUG: solving a shift/reduce conflict in favor of reduction can
  cut a path that was required in order to explain another conflict.
POTTIER Francois's avatar
POTTIER Francois committed
262
263
  (see e.g. belloeil.mly) (et le reduced_parser.mly d'Adrien Guatto)
  Or just give up on explaining the conflict in this case.
264
265
266
  Take priorities into account *during* the construction of the
  automaton? Is it feasible? Compatible with Pager?

267
268
* BUG: cutdown.mly

269
270
271
272
* le fichier .conflicts devrait etre supprime par --explain s'il
  n'y a aucun conflit

* dans le dump de l'automate, rajouter les transitions qui ont
POTTIER Francois's avatar
POTTIER Francois committed
273
  ete supprimees par resolution de conflits. Afficher aussi les
274
  réductions par défaut?
275
276
277

* expliquer aussi les conflits end-of-stream

278
* Documenter l'emploi d'ocamlbuild.
279

280
* Lorsqu'on crée un pseudo-lexème pour utiliser dans les
281
  directives %prec, la question de savoir s'il est associatif
282
  à gauche ou à droite ou pas du tout ne se posera jamais. Donc,
283
  pour faire propre, on ne devrait pas autoriser l'emploi de
284
285
  %left, %right, %nonassoc (sauf pour compatibilité arrière,
  avec warning) mais introduire un nouveau mot-clé %fictitious
286
287
  ou %pseudo ou whatever.

288
289
290
291
* Autre remarque du même tonneau, si on souhaite choisir un
  niveau mais pas un statut d'associativité (parce qu'on pense
  qu'il est inutile), il faudrait pouvoir déclarer %neutral
  (whatever) et obtenir un niveau au statut non-spécifié (d'où
292
293
  erreur si on tente de consulter ce statut).

294
295
296
* Prévoir une sortie --ocamlyacc qui affiche la grammaire sans
  les liaisons des valeurs sémantiques et sans les actions
  sémantiques?
297

298
299
300
301
302
* Faire le nécessaire pour empêcher les warnings d'ocaml 3.09
  sur les valeurs sémantiques nommées et non utilisées? Le
  problème est que l'erreur est forcément rapportée dans le
  fichier .ml engendré. Et ça résoudrait le problème du cas
  où on n'utilise que $startpos(v) et pas v.
303
304

* Il faudrait activer le warning qui recommande d'utiliser --infer
305
306
  dès que la librairie standard est utilisée (et pas seulement lorsque
  %inline est utilisé).
307