Index of /publis/ocaml-mots-cles-en-francais

[ICO]NameLast modifiedSizeDescription
[PARENTDIR]Parent Directory  -  
[DIR]ocaml-sources/2021-03-10 09:18 -  
[   ].gitignore2021-03-10 08:43 9.2K 
[IMG]Exemple_avec_factorielle.png2021-03-10 08:43 169K 
[IMG]Exemple_avec_plein_de_mots_cles.png2021-03-10 08:43 170K 
[   ]LICENSE2021-03-10 08:43 1.1K 
[TXT]README.md2021-03-10 08:43 11K 
[IMG]Une_petite_demonstration_en_vidéo.gif2021-03-10 08:43 328K 
[TXT]example_fact.ml2021-03-10 08:43 929  
[TXT]example_keywords.ml2021-03-10 08:43 763  
[   ]exemple_factorielle.frml2021-03-10 08:43 1.3K 
[   ]exemple_motscles.frml2021-03-10 08:43 1.0K 
[   ]frocaml2021-03-10 08:43 172  

Petite expérience sur le code source de OCaml

Voir cette discussion en anglais : https://discuss.ocaml.org/t/what-files-to-modify-in-ocaml-ocaml-source-code-to-have-a-parser-accepting-keywords-in-french-traduire-mots-cles-en-francais/7400/3. Si besoin, voir le code source de OCaml, dont ce dossier est une minuscule bifurcation ("fork") avec juste quelques lignes modifiées.

Objectifs

À des fins pédagogiques, j'ai voulu modifier une version locale du code source de @ocaml/ocaml, et changer l'analyseur lexicale pour pouvoir recompiler OCaml, afin que ses programmes ocaml (le "toplevel", et les deux compilateurs ocamlc et ocamlopt) acceptent de lire le code OCaml où (certains) des mots-clés sont traduits en français.

Par exemple, j'aimerais pouvoir lire et exécuter (ou compiler) un petit programme comme celui-ci :

soit recursive factorielle (n : entier) =
    filtrer n avec
    | n quand n < 0 -> echoueavec "Erreur : n doit être >= 0 pour factorielle."
    | 0 -> 1
    | n -> n * (factorielle (n-1))
;;

Qui est la version "francisée" du (vrai) code OCaml suivant :

let rec fact (n : int) =
    match n with
    | n when n < 0 -> failwith "Error: n has to be >= 0 for fact."
    | 0 -> 1
    | n -> n * (fact (n-1))
;;

Vous remarquerez que la coloration syntaxique du premier code ne détecte pas les mots clés traduits en français, et c'est normal. Mais par contre, avec quelques petites modifications, on arrive à recompiler l'ensemble des programmes OCaml (ocaml, ocamlc etc) pour qu'ils acceptent cette syntaxe étendue et "traduite". Ce n'est pas si compliqué, cf les explications plus bas !

Démonstration intéractive

Une petite démonstration en vidéo (un GIF de 1min30 qui montre l'utilisation du toplevel OCaml acceptant les mots clés en français)

Avec ce script frocaml.


Traduction des mots clés

La table ci-dessous précise la traduction de tous les mots clés usuels de OCaml.

Anglais Français
and et
assert impose
begin debut
do faire
done fait
downto jusquadecroissant
else sinon
end fin
false faux
for pour
if si
in dans
let soit
match filtre
open ouvre
or ou
rec recursif
then alors
to jusqua
true vrai
try essayer
when quand
while tantque
with avec

Quelques remarques :


Exemples

Dans ces deux fichiers en OCaml normal, avec les mots clés en anglais, avec l'extension .ml, se trouvent des tests :

Et dans les deux fichiers avec l'extension .frml (choisie pour s'amuser, elle ne sera pas reconnue par votre système d'exploitation, ou votre éditeur) :

Tests avec la factorielle

Tests avec la factorielle

Tests avec tous les mots clés

Tests avec tous les mots clés


Modifications à faire pour obtenir cela

Pour reproduire cette expérience chez vous, il vous faut : un ordinateur sous GNU/Linux (Ubuntu c'est très bien), avec gcc, git et GNU Make.

cd ~/un/sous/dossier/qui/va/bien/
git clone https://github.com/Naereen/ocaml-mots-cles-en-francais/
cd ocaml-mots-cles-en-francais/ocaml-sources/
./configure --prefix=/home/nomutilisateur/un/sous/dossier/qui/va/bien/ocaml-mots-cles-en-francais/

Soyez bien prudent et choisissez un dossier local et pas votre /usr/ ou /usr/local/, dans l'appel à ./configure, pour être sûr de ne pas aller polluer votre installation globale de OCaml avec ces nouveaux binaires "polyglottes".

Ensuite, voici un aperçu des modifications à effectuer dans le fichier [parser/lexer.mll], qui contrôle le lexer (analyse lexicale) de tout le reste des binaires OCaml :

  1. augmenter la taille let keyword_table = create_hashtable 181 : on peut augmenter de beaucoup sans risque ;
  2. pour chaque mot clé que l'on souhaite traduire, il suffit d'ajouter une ligne avec sa traduction : (voir ce commit : cc2feb0a5).
 diff --git a/parsing/lexer.mll b/parsing/lexer.mll
 index 89d687630..fe1cad73e 100644
 --- a/parsing/lexer.mll
 +++ b/parsing/lexer.mll
 @@ -38,57 +38,88 @@ exception Error of error * Location.t;;
  (* The table of keywords *)

  let keyword_table =
 -  create_hashtable 149 [
 +  create_hashtable 181 [
    "and", AND;
+      "et", AND;  (* DONE: French by @Naereen *)
    "assert", ASSERT;
+    "impose", ASSERT;  (* DONE: French by @Naereen *)
  1. ensuite, lors de la recompilation de l'ensemble (avec un simple make, précédé d'un premier appel à ./configure), vous aurez quelques erreurs parce que certains mots clés français comme et, de, si sont utilisés à quelques endroits de certains fichiers. Ma solution a été naïve mais efficace : renommer ces noms de variables, en ettt, deee et siii (voir ce commit : 3dd32d17b) ;
diff --git a/asmcomp/split.ml b/asmcomp/split.ml
index 55fe38c34..931537737 100644
--- a/asmcomp/split.ml
+++ b/asmcomp/split.ml
@@ -100,12 +100,12 @@ let merge_subst_array subv instr =
     if i >= Array.length subv then None else begin
       match subv.(i) with
         None -> find_one_subst (i+1)
-      | Some si as sub ->
+      | Some siii as sub ->
           for j = i+1 to Array.length subv - 1 do
             match subv.(j) with
               None -> ()
             | Some sj ->
-                Reg.Set.iter (identify_sub si sj)
+                Reg.Set.iter (identify_sub siii sj)
  1. enfin, dans la librairie standard (stdlib/stdlib.ml et son fichier d'interface stdlib/stdlib.mli), on peut rajouter des versions françaises de certaines fonctions. Je ne l'ai fait que pour failwith traduit en echoueavec, pour montrer que c'était facile. (voir ce commit : 1f6de8285).
diff --git a/stdlib/stdlib.ml b/stdlib/stdlib.ml
index 5daaf0867..f658dd090 100644
--- a/stdlib/stdlib.ml
+++ b/stdlib/stdlib.ml
@@ -27,6 +27,7 @@ external raise : exn -> 'a = "%raise"
 external raise_notrace : exn -> 'a = "%raise_notrace"

 let failwith s = raise(Failure s)
+let echoueavec = failwith
 let invalid_arg s = raise(Invalid_argument s)
diff --git a/stdlib/stdlib.mli b/stdlib/stdlib.mli
index 28c1381eb..5b098d476 100644
--- a/stdlib/stdlib.mli
+++ b/stdlib/stdlib.mli
@@ -41,6 +41,9 @@ val invalid_arg : string -> 'a
 val failwith : string -> 'a
 (** Raise exception [Failure] with the given string. *)

+val echoueavec : string -> 'a
+(** Declenchez l'exception [Failure] avec la chaine donnee. *)
  1. Les modifications complètes que j'avais effectuées sont lisibles dans ce fichier modification_to_codebase.diff, et dans les trois commits cités plus hauts.

À propos de ce dossier

Je ne suis PAS l'auteur de 99.99999% de ce code !

:scroll: Licence ? GitHub licence

Ce document README.md ainsi que les fichiers d'exemples en OCaml anglais et FrOCaml français sont en accès libre selon les conditions de la licence MIT (cf le fichier LICENSE en anglais). © Lilian Besson, 2021.

Le reste du projet OCaml est sous licence LGPL et est copyright de INRIA et d'autres subtilités.

made-with-OCaml Bash Shell HitCount

Maintenance Demandez moi n'importe quoi ! ForTheBadge uses-badges ForTheBadge uses-git ForTheBadge built-with-swag