diff --git a/LeBernard.uml b/LeBernard.uml
index a34d1c7..f01fe78 100644
--- a/LeBernard.uml
+++ b/LeBernard.uml
@@ -1,265 +1,363 @@
-
-
-
- umbrello uml modeller http://umbrello.kde.org
- 1.6.10
- UnicodeUTF8
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/com/bernard/bernard/fonctions/FonctionAffichage.java b/src/com/bernard/bernard/fonctions/FonctionAffichage.java
new file mode 100644
index 0000000..8a097f3
--- /dev/null
+++ b/src/com/bernard/bernard/fonctions/FonctionAffichage.java
@@ -0,0 +1,20 @@
+package com.bernard.bernard.fonctions;
+
+import com.bernard.bernard.reflet.FonctionSimple;
+import com.bernard.bernard.runtime.Arguments;
+import com.bernard.bernard.runtime.GardeRef;
+import com.bernard.bernard.runtime.Reference;
+
+public class FonctionAffichage implements FonctionSimple {
+
+ @Override
+ public Reference execute(Arguments args) {
+
+ Reference toPrint = args.get(0);
+
+ System.out.println(GardeRef.get(toPrint).getData());
+
+ return null;
+ }
+
+}
diff --git a/src/com/bernard/bernard/fonctions/FonctionConstante.java b/src/com/bernard/bernard/fonctions/FonctionConstante.java
new file mode 100644
index 0000000..720f30b
--- /dev/null
+++ b/src/com/bernard/bernard/fonctions/FonctionConstante.java
@@ -0,0 +1,26 @@
+package com.bernard.bernard.fonctions;
+
+import com.bernard.bernard.reflet.FonctionSimple;
+import com.bernard.bernard.runtime.Arguments;
+import com.bernard.bernard.runtime.GardeRef;
+import com.bernard.bernard.runtime.Reference;
+import com.bernard.bernard.runtime.Truc;
+
+public class FonctionConstante implements FonctionSimple{
+
+ Truc valeur;
+
+ public FonctionConstante(Truc valeur) {
+ this.valeur = valeur;
+ }
+
+ @Override
+ public Reference execute(Arguments args) {
+ return GardeRef.register(valeur);
+ }
+
+
+
+
+
+}
diff --git a/src/com/bernard/bernard/lecteur/Registry.java b/src/com/bernard/bernard/lecteur/Registry.java
new file mode 100644
index 0000000..ce2795e
--- /dev/null
+++ b/src/com/bernard/bernard/lecteur/Registry.java
@@ -0,0 +1,63 @@
+package com.bernard.bernard.lecteur;
+
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Function;
+import java.util.regex.Pattern;
+
+import com.bernard.bernard.fonctions.FonctionAffichage;
+import com.bernard.bernard.fonctions.FonctionConstante;
+import com.bernard.bernard.reflet.Boiboite;
+import com.bernard.bernard.reflet.Fonction;
+import com.bernard.bernard.runtime.Truc;
+
+public class Registry {
+
+ public static final Map TYPES = new HashMap<>();
+ public static final Map> TYPES_LISIBLES = new HashMap<>();
+
+ public static final Map FONCTIONS = new HashMap<>();
+
+ private static final void type(String s,Boiboite f) {TYPES.put(s, f);}
+ private static final void typeLisible(String s,Function f) {TYPES_LISIBLES.put(s, f);}
+ private static final void fonction(String s,Fonction f) {FONCTIONS.put(s, f);}
+
+ public static final Boiboite type(String s) {return TYPES.get(s);}
+ public static final Function typeLisible(String s) {return TYPES_LISIBLES.get(s);}
+ public static final Fonction fonction(String s) {return FONCTIONS.get(s);}
+
+
+ private static final Pattern isBooleanTrue = Pattern.compile("[Tt]rue|[Vv]rai|OK|1");
+ static {
+ type("Chaine",new Boiboite());
+ type("Entier",new Boiboite());
+ type("Booleen",new Boiboite());
+ type("Decimal",new Boiboite());
+ typeLisible("Booleen",s -> new byte[] {(byte) ((isBooleanTrue.matcher(s).matches())?1:0)});
+ typeLisible("Chaine", String::getBytes);
+ typeLisible("Entier",s->new BigInteger(s).toByteArray());
+ typeLisible("Decimal",s->{
+ BigDecimal v = new BigDecimal(s);
+ byte[] mantisse = v.unscaledValue().toByteArray();
+ byte[] data = new byte[4 + mantisse.length];
+ System.arraycopy(new byte[] {(byte) (0xFF & (v.scale()<<24)),(byte) (0xFF & (v.scale()<<16)),(byte) (0xFF & (v.scale()<<8)),(byte) (0xFF & v.scale())}, 0, data, 0, 4);
+ System.arraycopy(mantisse, 0, data, 4, mantisse.length);
+ return data;
+ });
+ //TODO Create typeLisible for Decimal et Booléen et ENtier (basés pour l'instant sur le code du java).
+ fonction("affiche", new FonctionAffichage());
+ fonction("pi", new FonctionConstante(Truc.fromBytes(type("Decimal"), typeLisible("Decimal").apply("3.141592653"))));
+ }
+
+ public static final byte[] toByteArray(List list) {
+ byte[] ret = new byte[list.size()];
+ byte i = 0;
+ for (Byte e : list)
+ ret[i++] = e;
+ return ret;
+ }
+
+}
diff --git a/src/com/bernard/bernard/reflet/Boiboite.java b/src/com/bernard/bernard/reflet/Boiboite.java
new file mode 100644
index 0000000..4caff2b
--- /dev/null
+++ b/src/com/bernard/bernard/reflet/Boiboite.java
@@ -0,0 +1,5 @@
+package com.bernard.bernard.reflet;
+
+public class Boiboite {
+
+}
diff --git a/src/com/bernard/bernard/reflet/Fonction.java b/src/com/bernard/bernard/reflet/Fonction.java
new file mode 100644
index 0000000..67178c8
--- /dev/null
+++ b/src/com/bernard/bernard/reflet/Fonction.java
@@ -0,0 +1,10 @@
+package com.bernard.bernard.reflet;
+
+import com.bernard.bernard.runtime.Arguments;
+import com.bernard.bernard.runtime.Reference;
+
+public interface Fonction {
+
+ public Reference execute(Arguments args);
+
+}
diff --git a/src/com/bernard/bernard/reflet/FonctionComplexe.java b/src/com/bernard/bernard/reflet/FonctionComplexe.java
new file mode 100644
index 0000000..20bd671
--- /dev/null
+++ b/src/com/bernard/bernard/reflet/FonctionComplexe.java
@@ -0,0 +1,33 @@
+package com.bernard.bernard.reflet;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+import com.bernard.bernard.runtime.Arguments;
+import com.bernard.bernard.runtime.Reference;
+
+public class FonctionComplexe implements Fonction{
+
+ List composants;
+ List> argsPos;//
+
+ public boolean verify() {
+ for (int i = 0; i < argsPos.size(); i++)
+ if(argsPos.get(i).stream().mapToInt(j->j).max().orElse(-1) < i)
+ return false;
+ return true;
+ }
+
+ @Override
+ public Reference execute(Arguments args) {
+
+ Reference[] outputs = new Reference[composants.size()];
+ for(int i = 0;i argsToPass = argsPos.get(i).stream().map(j->(j>=0)?outputs[j]:args.get(-j)).collect(Collectors.toList());
+ outputs[i] = composants.get(i).execute(new Arguments(argsToPass));
+ }
+ return outputs[outputs.length-1];
+ }
+
+}
diff --git a/src/com/bernard/bernard/reflet/FonctionSimple.java b/src/com/bernard/bernard/reflet/FonctionSimple.java
new file mode 100644
index 0000000..bb178a2
--- /dev/null
+++ b/src/com/bernard/bernard/reflet/FonctionSimple.java
@@ -0,0 +1,5 @@
+package com.bernard.bernard.reflet;
+
+public interface FonctionSimple extends Fonction{
+
+}
diff --git a/src/com/bernard/bernard/runtime/Arguments.java b/src/com/bernard/bernard/runtime/Arguments.java
new file mode 100644
index 0000000..f295482
--- /dev/null
+++ b/src/com/bernard/bernard/runtime/Arguments.java
@@ -0,0 +1,29 @@
+package com.bernard.bernard.runtime;
+
+import java.util.Arrays;
+import java.util.List;
+
+public class Arguments {
+
+ List args;
+
+ public Arguments(Reference... refs) {
+ args = Arrays.asList(refs);
+ }
+
+
+ public Arguments(List args) {
+ this.args = args;
+ }
+
+
+
+ public Reference get(int pos) {
+ try {
+ return args.get(pos);
+ }catch(IndexOutOfBoundsException e) {
+ return null;
+ }
+ }
+
+}
diff --git a/src/com/bernard/bernard/runtime/GardeMemoire.java b/src/com/bernard/bernard/runtime/GardeMemoire.java
new file mode 100644
index 0000000..e60f111
--- /dev/null
+++ b/src/com/bernard/bernard/runtime/GardeMemoire.java
@@ -0,0 +1,22 @@
+package com.bernard.bernard.runtime;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class GardeMemoire {
+
+ private static Map memory = new HashMap<>();//TODO Change to byte array
+
+ public static byte get(long index) {
+ return memory.get(index);
+ }
+
+ public static void setByte(long index,byte value) {
+ memory.put(index, value);
+ }
+
+ public static long getMax() {
+ return memory.keySet().stream().reduce(0L, (l,m)->(l>m)?l:m);
+ }
+
+}
diff --git a/src/com/bernard/bernard/runtime/GardeRef.java b/src/com/bernard/bernard/runtime/GardeRef.java
new file mode 100644
index 0000000..f8f6b63
--- /dev/null
+++ b/src/com/bernard/bernard/runtime/GardeRef.java
@@ -0,0 +1,30 @@
+package com.bernard.bernard.runtime;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class GardeRef {
+
+ private static final Truc NEANT = new Truc(null, new long[] {});
+ private static Map memoire = new HashMap<>();
+ private static Map refs = new HashMap<>();
+
+ public static Truc get(Reference r) {
+ return refs.containsKey(r)?memoire.get(refs.get(r)):NEANT;
+ }
+
+ public static Reference register(Truc truc) {
+ Reference ref = new Reference();
+ int newIndex = memoire.keySet().stream().mapToInt(i->i).max().orElse(0);
+ memoire.put(newIndex, truc);
+ refs.put(ref, newIndex);
+ return ref;
+ }
+
+ public static Reference anotherRef(Reference ref) {
+ Reference newRef = new Reference();
+ if(refs.containsKey(ref))refs.put(newRef, refs.get(ref));
+ return newRef;
+ }
+
+}
diff --git a/src/com/bernard/bernard/runtime/Reference.java b/src/com/bernard/bernard/runtime/Reference.java
new file mode 100644
index 0000000..165f03c
--- /dev/null
+++ b/src/com/bernard/bernard/runtime/Reference.java
@@ -0,0 +1,10 @@
+package com.bernard.bernard.runtime;
+
+import java.util.UUID;
+
+public class Reference {
+ UUID id;
+ public Reference() {
+ id = UUID.randomUUID();
+ }
+}
diff --git a/src/com/bernard/bernard/runtime/Truc.java b/src/com/bernard/bernard/runtime/Truc.java
new file mode 100644
index 0000000..6d44037
--- /dev/null
+++ b/src/com/bernard/bernard/runtime/Truc.java
@@ -0,0 +1,34 @@
+package com.bernard.bernard.runtime;
+
+import java.util.Arrays;
+import java.util.stream.Collectors;
+
+import com.bernard.bernard.reflet.Boiboite;
+
+public class Truc {
+
+
+
+ public Truc(Boiboite type, long[] dataRef) {
+ this.type = type;
+ this.dataRef = dataRef;
+ }
+
+ public static Truc fromBytes(Boiboite type,byte[] data) {
+ long startIndex = GardeMemoire.getMax();
+ long[] dataRef = new long[data.length];
+ for (int i = 0; i < data.length; i++) {
+ GardeMemoire.setByte(startIndex+i, data[i]);
+ dataRef[i] = startIndex+i;
+ }
+ return new Truc(type,dataRef);
+ }
+
+ Boiboite type;
+ long[] dataRef;
+
+ public String getData() {
+ return Arrays.stream(dataRef).mapToObj(GardeMemoire::get).map(b->Character.valueOf((char)b.byteValue())).map(c->c.toString()).collect(Collectors.joining());
+ }
+
+}
diff --git a/src/com/bernard/bernard/test/FTests.java b/src/com/bernard/bernard/test/FTests.java
new file mode 100644
index 0000000..ad32e80
--- /dev/null
+++ b/src/com/bernard/bernard/test/FTests.java
@@ -0,0 +1,37 @@
+package com.bernard.bernard.test;
+
+import com.bernard.bernard.fonctions.FonctionAffichage;
+import com.bernard.bernard.reflet.Boiboite;
+import com.bernard.bernard.reflet.Fonction;
+import com.bernard.bernard.runtime.Arguments;
+import com.bernard.bernard.runtime.GardeMemoire;
+import com.bernard.bernard.runtime.GardeRef;
+import com.bernard.bernard.runtime.Reference;
+import com.bernard.bernard.runtime.Truc;
+
+public class FTests {
+
+ public static void main(String[] a) {
+ Fonction f = new FonctionAffichage();
+
+ GardeMemoire.setByte(0L, (byte) 72);
+ GardeMemoire.setByte(1L, (byte) 101);
+ GardeMemoire.setByte(2L, (byte) 108);
+ GardeMemoire.setByte(3L, (byte) 108);
+ GardeMemoire.setByte(4L, (byte) 111);
+ GardeMemoire.setByte(5L, (byte) 32);
+ GardeMemoire.setByte(6L, (byte) 0x42);
+ GardeMemoire.setByte(7L, (byte) 101);
+ GardeMemoire.setByte(8L, (byte) 114);
+ GardeMemoire.setByte(9L, (byte) 110);
+ GardeMemoire.setByte(10L, (byte) 97);
+ GardeMemoire.setByte(11L, (byte) 114);
+ GardeMemoire.setByte(12L, (byte) 100);
+ Truc aAff = new Truc(new Boiboite(), new long[] {0,1,2,3,4,5,6,7,8,9,10,11,12});
+
+ Reference ref = GardeRef.register(aAff);
+ Arguments args = new Arguments(ref);
+ f.execute(args);
+ }
+
+}
diff --git a/src/module-info.java b/src/module-info.java
index 9698be8..be1d629 100644
--- a/src/module-info.java
+++ b/src/module-info.java
@@ -1,9 +1,2 @@
-/**
- *
- */
-/**
- * @author mysaa
- *
- */
-module LeBernard {
+module bernard {
}
\ No newline at end of file
diff --git a/src/testCode.bernard b/src/testCode.bernard
new file mode 100644
index 0000000..3b26211
--- /dev/null
+++ b/src/testCode.bernard
@@ -0,0 +1,10 @@
+let Chaine x = Hello Bernard
+let Entier y = 42
+let Booleen z = Vrai
+let Booleen a = Faux
+
+afficher x
+afficher y
+let b = binEt z a
+let c = binOu b z
+afficher b