From 5b6ed1165f9006fd091dfc29016566da5fd38574 Mon Sep 17 00:00:00 2001 From: Mysaa Date: Mon, 24 May 2021 18:41:25 +0200 Subject: [PATCH] =?UTF-8?q?Une=20nouvelle=20structure=20de=20classes=20dan?= =?UTF-8?q?s=20com.bernard.bernard=20(le=20nom=20est=20quand=20m=C3=AAme?= =?UTF-8?q?=20plus=20rigolo=20...)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- LeBernard.uml | 626 ++++++++++-------- .../bernard/fonctions/FonctionAffichage.java | 20 + .../bernard/fonctions/FonctionConstante.java | 26 + src/com/bernard/bernard/lecteur/Registry.java | 63 ++ src/com/bernard/bernard/reflet/Boiboite.java | 5 + src/com/bernard/bernard/reflet/Fonction.java | 10 + .../bernard/reflet/FonctionComplexe.java | 33 + .../bernard/reflet/FonctionSimple.java | 5 + .../bernard/bernard/runtime/Arguments.java | 29 + .../bernard/bernard/runtime/GardeMemoire.java | 22 + src/com/bernard/bernard/runtime/GardeRef.java | 30 + .../bernard/bernard/runtime/Reference.java | 10 + src/com/bernard/bernard/runtime/Truc.java | 34 + src/com/bernard/bernard/test/FTests.java | 37 ++ src/module-info.java | 9 +- src/testCode.bernard | 10 + 16 files changed, 697 insertions(+), 272 deletions(-) create mode 100644 src/com/bernard/bernard/fonctions/FonctionAffichage.java create mode 100644 src/com/bernard/bernard/fonctions/FonctionConstante.java create mode 100644 src/com/bernard/bernard/lecteur/Registry.java create mode 100644 src/com/bernard/bernard/reflet/Boiboite.java create mode 100644 src/com/bernard/bernard/reflet/Fonction.java create mode 100644 src/com/bernard/bernard/reflet/FonctionComplexe.java create mode 100644 src/com/bernard/bernard/reflet/FonctionSimple.java create mode 100644 src/com/bernard/bernard/runtime/Arguments.java create mode 100644 src/com/bernard/bernard/runtime/GardeMemoire.java create mode 100644 src/com/bernard/bernard/runtime/GardeRef.java create mode 100644 src/com/bernard/bernard/runtime/Reference.java create mode 100644 src/com/bernard/bernard/runtime/Truc.java create mode 100644 src/com/bernard/bernard/test/FTests.java create mode 100644 src/testCode.bernard 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