| summaryrefslogtreecommitdiff | 
diff options
| author | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2020-08-11 16:05:23 +0200 | 
|---|---|---|
| committer | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2020-08-11 16:05:23 +0200 | 
| commit | 72098e4e6e509e050f8b2f8031ccda72ba4021fe (patch) | |
| tree | 9a0009537e2cf071ec0cb8df054a562273620b9f /src | |
| parent | 00887ec8349cd51e3253dfb578fe72403abb1d41 (diff) | |
Testing out a solution to implement functions.
Diffstat (limited to 'src')
5 files changed, 441 insertions, 60 deletions
| diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/util/AnonymousVariableManager.java b/src/core/src/tonkadur/wyrd/v1/compiler/util/AnonymousVariableManager.java index 8bec40a..12fde67 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/util/AnonymousVariableManager.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/util/AnonymousVariableManager.java @@ -18,96 +18,130 @@ import tonkadur.wyrd.v1.lang.computation.Constant;  import tonkadur.wyrd.v1.lang.type.Type; -public class AnonymousVariableManager +public class RegisterManager  {     protected static final String name_prefix = ".anon."; +   protected final Map<String, RegisterContext> context_by_name; +   protected final Deque<RegisterContext> context; +   protected final RegisterContext base_context; -   protected final Map<String, Cons<Boolean, Variable>> by_name; -   protected final Map<Type, List<Cons<Boolean, Variable>>> by_type; -   protected int generated_variables; - -   public AnonymousVariableManager () +   public RegisterManager ()     { -      by_name = new HashMap<String, Cons<Boolean, Variable>>(); -      by_type = new HashMap<Type, List<Cons<Boolean, Variable>>>(); -      generated_variables = 0; -   } +      base_context = new RegisterContext("base context", false); -   public Collection<Variable> get_all_variables () -   { -      final Collection<Variable> result; +      context_by_name = new HashMap<String, RegisterContext>(); +      context = new ArrayDeque<RegisterContext>(); -      result = new ArrayList<Variable>(); - -      for (final Cons<Boolean, Variable> variable: by_name.values()) -      { -         result.add(variable.get_cdr()); -      } - -      return result; +      context_by_name.put("base context", base_context); +      context.push(base_context);     }     public Ref reserve (final Type t)     { -      final String name; -      final Ref result; -      final Variable new_variable; -      final Cons<Boolean, Variable> status; -      List<Cons<Boolean, Variable>> list; -      list = by_type.get(t); +   } + +   protected static class RegisterContext +   { +      protected final String name; +      protected final boolean is_stackable; +      protected final Map<String, Register> register_by_name; +      protected final Map<Type, Register> register_by_type; +      protected int generated_variables; -      if (list == null) +      public RegisterContext (final String name, final boolean is_stackable)        { -         list = new ArrayList<Cons<Boolean, Variable>>(); +         this.name = name; +         this.is_stackable = is_stackable; + +         register_by_name = new HashMap<String, Register>(); +         register_by_type = new HashMap<Type, Register>(); -         by_type.put(t, list); +         generated_variables = 0;        } -      for (final Cons<Boolean, Variable> entry: list) +      public Collection<Variable> get_all_variables ()        { -         if (!entry.get_car()) -         { -            result = entry.get_cdr().get_ref(); +         final Collection<Variable> result; -            entry.set_car(Boolean.TRUE); +         result = new ArrayList<Variable>(); -            return result; +         for (final Cons<Boolean, Variable> variable: by_name.values()) +         { +            result.add(variable.get_cdr());           } + +         return result;        } -      name = (name_prefix + Integer.toString(generated_variables++)); -      new_variable = new Variable(name, "local", t); -      status = new Cons(Boolean.TRUE, new_variable); +      public Ref reserve (final Type t) +      { +         final String name; +         final Ref result; +         final Variable new_variable; +         final Cons<Boolean, Variable> status; +         List<Cons<Boolean, Variable>> list; -      list.add(status); +         list = by_type.get(t); -      by_name.put(name, status); +         if (list == null) +         { +            list = new ArrayList<Cons<Boolean, Variable>>(); -      return new_variable.get_ref(); -   } +            by_type.put(t, list); +         } -   public void release (final Ref r) -   { -      final Computation c; -      final String name; +         for (final Cons<Boolean, Variable> entry: list) +         { +            if (!entry.get_car()) +            { +               result = entry.get_cdr().get_ref(); -      c = r.get_address(); +               entry.set_car(Boolean.TRUE); -      if (!(c instanceof Constant)) -      { -         System.err.println -         ( -            "[P] Anonymous Variable '" -            + r.toString() -            + "' is not at constant address." -         ); - -         return; +               return result; +            } +         } + +         name = (name_prefix + Integer.toString(generated_variables++)); +         new_variable = new Variable(name, "local", t); +         status = new Cons(Boolean.TRUE, new_variable); + +         list.add(status); + +         by_name.put(name, status); + +         return new_variable.get_ref();        } -      name = ((Constant) c).get_as_string(); +      public void release (final Ref r) +      { +         final Computation c; +         final String name; + +         c = r.get_address(); + +         if (!(c instanceof Constant)) +         { +            System.err.println +            ( +               "[P] Anonymous Variable '" +               + r.toString() +               + "' is not at constant address." +            ); + +            return; +         } + +         name = ((Constant) c).get_as_string(); -      by_name.get(name).set_car(Boolean.FALSE); +         by_name.get(name).set_car(Boolean.FALSE); +      } + +      protected static class Register +      { +         protected boolean is_in_use; +         protected Variable variable; +      }     }  } diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/util/FunctionContext.java b/src/core/src/tonkadur/wyrd/v1/compiler/util/FunctionContext.java new file mode 100644 index 0000000..7b9dbc2 --- /dev/null +++ b/src/core/src/tonkadur/wyrd/v1/compiler/util/FunctionContext.java @@ -0,0 +1,9 @@ +package tonkadur.wyrd.v1.compiler.util; + +public class FunctionContext +{ +   protected final List<Ref> registers; +   protected final Map<String, Ref> parameters; +   protected final Type result_type; + +} diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/util/registers/RegisterContext.java b/src/core/src/tonkadur/wyrd/v1/compiler/util/registers/RegisterContext.java new file mode 100644 index 0000000..06ca608 --- /dev/null +++ b/src/core/src/tonkadur/wyrd/v1/compiler/util/registers/RegisterContext.java @@ -0,0 +1,97 @@ +package tonkadur.wyrd.v1.compiler.util; + +import java.util.Map; +import java.util.HashMap; +import java.util.Collection; +import java.util.List; +import java.util.ArrayList; + +import tonkadur.functional.Cons; + +import tonkadur.wyrd.v1.lang.Variable; + +import tonkadur.wyrd.v1.lang.meta.Computation; + +import tonkadur.wyrd.v1.lang.computation.Ref; +import tonkadur.wyrd.v1.lang.computation.Constant; + +import tonkadur.wyrd.v1.lang.type.Type; + + +public class RegisterManager +{ +   protected static final String name_prefix = ".anon."; +   protected final String name; +   protected final Map<String, Register> register_by_name; +   protected final Map<Type, Register> register_by_type; +   protected int generated_variables; + +   public RegisterContext (final String name) +   { +      this.name = name; + +      register_by_name = new HashMap<String, Register>(); +      register_by_type = new HashMap<Type, Register>(); + +      generated_variables = 0; +   } + +   public Collection<Variable> get_all_variables () +   { +      final Collection<Variable> result; + +      result = new ArrayList<Variable>(); + +      for (final Cons<Boolean, Variable> variable: by_name.values()) +      { +         result.add(variable.get_cdr()); +      } + +      return result; +   } + +   public Register reserve (final Type t) +   { +      final String name; +      final Register result; +      final Variable new_variable; +      final Cons<Boolean, Variable> status; +      List<Cons<Boolean, Variable>> list; + +      list = by_type.get(t); + +      if (list == null) +      { +         list = new ArrayList<Cons<Boolean, Variable>>(); + +         by_type.put(t, list); +      } + +      for (final Cons<Boolean, Variable> entry: list) +      { +         if (!entry.get_car()) +         { +            result = entry.get_cdr().get_ref(); + +            entry.set_car(Boolean.TRUE); + +            return result; +         } +      } + +      name = (name_prefix + Integer.toString(generated_variables++)); +      new_variable = new Variable(name, "local", t); +      status = new Cons(Boolean.TRUE, new_variable); + +      list.add(status); + +      by_name.put(name, status); + +      return new_variable.get_ref(); +   } + +   public void release (final Register r) +   { +      r.set_is_in_use(false); +   } +} diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/util/registers/RegisterManager.java b/src/core/src/tonkadur/wyrd/v1/compiler/util/registers/RegisterManager.java new file mode 100644 index 0000000..1519f01 --- /dev/null +++ b/src/core/src/tonkadur/wyrd/v1/compiler/util/registers/RegisterManager.java @@ -0,0 +1,94 @@ +package tonkadur.wyrd.v1.compiler.util; + +import java.util.Map; +import java.util.HashMap; +import java.util.Collection; +import java.util.List; +import java.util.ArrayList; + +import tonkadur.functional.Cons; + +import tonkadur.wyrd.v1.lang.Variable; + +import tonkadur.wyrd.v1.lang.meta.Computation; + +import tonkadur.wyrd.v1.lang.computation.Ref; +import tonkadur.wyrd.v1.lang.computation.Constant; + +import tonkadur.wyrd.v1.lang.type.Type; + + +public class RegisterManager +{ +   protected final Map<String, RegisterContext> context_by_name; +   protected final Deque<RegisterContext> context; +   protected final RegisterContext base_context; + +   public RegisterManager () +   { +      base_context = new RegisterContext("base context", false); + +      context_by_name = new HashMap<String, RegisterContext>(); +      context = new ArrayDeque<RegisterContext>(); + +      context_by_name.put("base context", base_context); +      context.push(base_context); +   } + +   public Register reserve (final Type t) +   { +      context.peekFirst().reserve(t); +   } + +   public void release (final Register r) +   { +      context.peekFirst().release(r); +   } + +   public void create_stackable_context (final String context_name) +   { +      final StackableRegisterContext result; + +      result = StackableRegisterContext.generate(base_context, context_name); + +      context_by_name.put(result); +   } + +   public void add_context_variable (final Type t, final String variable_name) +   { +      context.peekFirst().reserve(t, name); +   } + +   public Register get_context_variable (final String variable_name) +   { +      context.peekFirst().get_variable(name); +   } + +   public List<Instruction> get_enter_context_instructions +   ( +      final String context_name +   ) +   { +      return context_by_name.get(context_name).get_enter_instructions(); +   } + +   public List<Instruction> get_leave_context_instructions +   ( +      final String context_name +   ) +   { +      return context_by_name.get(context_name).get_leave_instructions(); +   } + +   public Collection<Type> get_generated_types () +   { +      /* TODO */ +      return null; +   } + +   public Collection<Variable> get_generated_variables () +   { +      /* TODO */ +      return null; +   } +} diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/util/registers/StackableRegisterContext.java b/src/core/src/tonkadur/wyrd/v1/compiler/util/registers/StackableRegisterContext.java new file mode 100644 index 0000000..12fde67 --- /dev/null +++ b/src/core/src/tonkadur/wyrd/v1/compiler/util/registers/StackableRegisterContext.java @@ -0,0 +1,147 @@ +package tonkadur.wyrd.v1.compiler.util; + +import java.util.Map; +import java.util.HashMap; +import java.util.Collection; +import java.util.List; +import java.util.ArrayList; + +import tonkadur.functional.Cons; + +import tonkadur.wyrd.v1.lang.Variable; + +import tonkadur.wyrd.v1.lang.meta.Computation; + +import tonkadur.wyrd.v1.lang.computation.Ref; +import tonkadur.wyrd.v1.lang.computation.Constant; + +import tonkadur.wyrd.v1.lang.type.Type; + + +public class RegisterManager +{ +   protected static final String name_prefix = ".anon."; +   protected final Map<String, RegisterContext> context_by_name; +   protected final Deque<RegisterContext> context; +   protected final RegisterContext base_context; + +   public RegisterManager () +   { +      base_context = new RegisterContext("base context", false); + +      context_by_name = new HashMap<String, RegisterContext>(); +      context = new ArrayDeque<RegisterContext>(); + +      context_by_name.put("base context", base_context); +      context.push(base_context); +   } + +   public Ref reserve (final Type t) +   { + +   } + +   protected static class RegisterContext +   { +      protected final String name; +      protected final boolean is_stackable; +      protected final Map<String, Register> register_by_name; +      protected final Map<Type, Register> register_by_type; +      protected int generated_variables; + +      public RegisterContext (final String name, final boolean is_stackable) +      { +         this.name = name; +         this.is_stackable = is_stackable; + +         register_by_name = new HashMap<String, Register>(); +         register_by_type = new HashMap<Type, Register>(); + +         generated_variables = 0; +      } + +      public Collection<Variable> get_all_variables () +      { +         final Collection<Variable> result; + +         result = new ArrayList<Variable>(); + +         for (final Cons<Boolean, Variable> variable: by_name.values()) +         { +            result.add(variable.get_cdr()); +         } + +         return result; +      } + +      public Ref reserve (final Type t) +      { +         final String name; +         final Ref result; +         final Variable new_variable; +         final Cons<Boolean, Variable> status; +         List<Cons<Boolean, Variable>> list; + +         list = by_type.get(t); + +         if (list == null) +         { +            list = new ArrayList<Cons<Boolean, Variable>>(); + +            by_type.put(t, list); +         } + +         for (final Cons<Boolean, Variable> entry: list) +         { +            if (!entry.get_car()) +            { +               result = entry.get_cdr().get_ref(); + +               entry.set_car(Boolean.TRUE); + +               return result; +            } +         } + +         name = (name_prefix + Integer.toString(generated_variables++)); +         new_variable = new Variable(name, "local", t); +         status = new Cons(Boolean.TRUE, new_variable); + +         list.add(status); + +         by_name.put(name, status); + +         return new_variable.get_ref(); +      } + +      public void release (final Ref r) +      { +         final Computation c; +         final String name; + +         c = r.get_address(); + +         if (!(c instanceof Constant)) +         { +            System.err.println +            ( +               "[P] Anonymous Variable '" +               + r.toString() +               + "' is not at constant address." +            ); + +            return; +         } + +         name = ((Constant) c).get_as_string(); + +         by_name.get(name).set_car(Boolean.FALSE); +      } + +      protected static class Register +      { +         protected boolean is_in_use; +         protected Variable variable; +      } +   } +} | 


