Salut,
Ceux qui ont déjà touché à sexp.ml connaissent peut-être `empty_args_are_not_args`.
https://gitlab.com/monnier/typer/-/blob/3d63f5e0e1f861b7957902e091fb776d37c8...
C'est une « configuration » qui permet de désactiver un mode plus permissif où une liste peut être terminée par son délimiteur. Par exemple, on peut écrire `a; b;`, qui a la même sémantique que `a; b`. D'après l'historique dans git, cette configuration a toujours été à `false`. Il n'y a pas de mécanisme pour la mettre à `true`, soit par une option en ligne de commande ou une variable d'environnement.
J'écris ce courriel, parce qu'il y a deux `if` dans la fonction `parce_sexp` qui dépendent de cette valeur. À ma connaissance, les branches `true` n'ont pas été exécutés depuis des années, mais il faut quand même les modifier pour que le code compile. Je les ai moi même modifiés quelques fois, mais je n'est aucune confiance qu'elles fonctionnent, justement parce qu'elles n'ont pas été testés depuis si longtemps.
La solution évidente est simplement de fixer `empty_args_are_not_args` à false et de supprimer les branches `true`. Par contre, je ne pense pas que ce soit la bonne solution. En effet, il dont y avoir une raison pour laquelle cette configuration a été introduite.
Prenons cet exemple.
1 + 2 + 3 +
Est-ce que Typer devrait l'accepter? Je crois non et c'est bien le cas, mais regardons le message d'erreur.
expected: Int but expression has type: Unit
Typer considère tous les opérateurs binaires comme des séparateurs et il insère donc un nœud vide comme 4e argument. Il l’interprète comme une valeur de type Unit.
Ma proposition est d'ajouter à la grammaire une colonne qui indique si un opérateur est un séparateur pour continuer à accepter correctement `a; b`, mais aussi rejeter `a + b +` avec un bon message. Essentiellement, `empty_args_are_not_args` devient une propriété de l'opérateur plutôt que configuration globale.
Qu'est-ce que vous en pensez? Simon