| summaryrefslogtreecommitdiff | 
diff options
| author | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2020-08-14 00:47:50 +0200 | 
|---|---|---|
| committer | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2020-08-14 00:47:50 +0200 | 
| commit | b35105f81f862100c274cd5899cb53244168560f (patch) | |
| tree | c12aa66984c56047bdd149a45332744c52cbe433 | |
| parent | 41c53b856944146e5cd1d1713ba11b931790978a (diff) | |
...
9 files changed, 86 insertions, 159 deletions
| diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/Compiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/Compiler.java index c88b8be..5c64cd5 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/Compiler.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/Compiler.java @@ -1,8 +1,10 @@  package tonkadur.wyrd.v1.compiler.fate.v1; -import tonkadur.wyrd.v1.compiler.util.RegisterManager; +import tonkadur.wyrd.v1.compiler.util.registers.RegisterManager;  import tonkadur.wyrd.v1.compiler.util.InstructionManager; +import tonkadur.wyrd.v1.lang.type.DictType; +  import tonkadur.wyrd.v1.lang.Register;  import tonkadur.wyrd.v1.lang.World; @@ -41,7 +43,6 @@ public class Compiler     {        this.wyrd_world = wyrd_world; -      macro_manager = new MacroManager();        registers = new RegisterManager();        assembler = new InstructionManager();     } @@ -146,9 +147,4 @@ public class Compiler     {        return assembler;     } - -   public MacroManager macros () -   { -      return macro_manager; -   }  } diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/ComputationCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/ComputationCompiler.java index ac24ae7..7d92f21 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/ComputationCompiler.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/ComputationCompiler.java @@ -1,9 +1,10 @@  package tonkadur.wyrd.v1.compiler.fate.v1; +import java.util.ArrayList; +import java.util.Collection;  import java.util.Collections; -import java.util.List;  import java.util.Iterator; -import java.util.ArrayList; +import java.util.List;  import tonkadur.error.Error; @@ -637,7 +638,7 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor                 new Size(collection_compiler.get_address()),                 collection_compiler.get_address(),                 result_as_address, -               index.get_address(); +               index.get_address()              )           ); @@ -1355,10 +1356,7 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor        final Register register;        register = -         compiler.registers().get_register -         ( -            n.get_variable().get_name() -         ); +         compiler.registers().get_context_register(n.get_variable().get_name());        result_as_address = register.get_address();        result_as_computation = register.get_value(); diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/InstructionCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/InstructionCompiler.java index 04a7bcd..a138417 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/InstructionCompiler.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/InstructionCompiler.java @@ -814,7 +814,7 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor        end_of_loop_label = compiler.assembler().generate_label("<AfterForEach>");        compiler.assembler().push_context_label("breakable", end_of_loop_label); -      compiler.registers().bind(current_value, n.get_parameter_name()); +      compiler.registers().bind(n.get_parameter_name(), current_value);        new_body.add        ( @@ -1413,7 +1413,10 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor        collection = collection_cc.get_address(); -      result.add(new SetValue(collection_size, new Size(collection))); +      result.add +      ( +         new SetValue(collection_size.get_address(), new Size(collection)) +      );        if        ( @@ -1563,13 +1566,11 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor        elem = elem_cc.get_address();        collection = collection_cc.get_address(); -      result.add(new SetValue(elem.get_address(), elem_cc.get_computation()));        result.add        (           new SetValue(collection_size.get_address(), new Size(collection))        ); -      elem_cc.release_registers();        if        ( @@ -1610,8 +1611,6 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor           );        } -      compiler.registers().release(elem); -        result.add        (           If.generate @@ -1624,7 +1623,7 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor                 compiler.registers(),                 compiler.assembler(),                 index.get_address(), -               value_of_collection_size, +               collection_size.get_value(),                 collection              )           ) @@ -1634,6 +1633,7 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor        compiler.registers().release(found);        compiler.registers().release(collection_size); +      elem_cc.release_registers();        collection_cc.release_registers();     } diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/MacroManager.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/MacroManager.java deleted file mode 100644 index e471f28..0000000 --- a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/MacroManager.java +++ /dev/null @@ -1,92 +0,0 @@ -package tonkadur.wyrd.v1.compiler.fate.v1; - -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Stack; - -import tonkadur.wyrd.v1.lang.computation.Address; - -public class MacroManager -{ -   protected final Map<String, Address> wild_parameters; -   protected final Stack<Map<String, Address>> context_stack; - -   public MacroManager () -   { -      wild_parameters = new HashMap<String, Address>(); -      context_stack = new Stack<Map<String, Address>>(); -   } - -   public void add_wild_parameter (final String name, final Address ref) -   { -      if (wild_parameters.containsKey(name)) -      { -         System.err.println("[P] duplicate wild parameter '" + name + "'."); - -         return; -      } - -      wild_parameters.put(name, ref); -   } - -   public void remove_wild_parameter (final String name) -   { -      wild_parameters.remove(name); -   } - -   public void pop () -   { -      context_stack.pop(); -   } - -   public void push -   ( -      final tonkadur.fate.v1.lang.Macro macro, -      final List<Address> parameter_refs -   ) -   { -      final Iterator<Address> pri; -      final Iterator<tonkadur.fate.v1.lang.meta.TypedEntryList.TypedEntry> pre; -      final Map<String, Address> parameters; - -      parameters = new HashMap<String, Address>(); - -      pri = parameter_refs.iterator(); -      pre = macro.get_parameters().get_entries().iterator(); - -      while (pri.hasNext()) -      { -         final String name; - -         name = pre.next().get_name(); - -         parameters.put(name, pri.next()); -      } - -      context_stack.push(parameters); -   } - -   public Address get_parameter_ref (final String parameter) -   { -      Address result; - -      result = wild_parameters.get(parameter); - -      if (result == null) -      { -         if (!context_stack.isEmpty()) -         { -            result = context_stack.peek().get(parameter); -         } - -         if (result == null) -         { -            System.err.println("[P] No such parameter '" + parameter + "'."); -         } -      } - -      return result; -   } -} diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/TypeCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/TypeCompiler.java index b433002..7013e1e 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/TypeCompiler.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/TypeCompiler.java @@ -42,7 +42,7 @@ public class TypeCompiler              );        } -      if (fate_type instanceof tonkadur.fate.v1.lang.type.AddressType) +      if (fate_type instanceof tonkadur.fate.v1.lang.type.PointerType)        {           return              new PointerType @@ -51,7 +51,7 @@ public class TypeCompiler                 (                    compiler,                    ( -                     (tonkadur.fate.v1.lang.type.AddressType) +                     (tonkadur.fate.v1.lang.type.PointerType)                       fate_type                    ).get_referenced_type()                 ) @@ -166,7 +166,7 @@ public class TypeCompiler           return MapType.MAP_TO_RICH_TEXT;        } -      if (fate_content_type instanceof tonkadur.fate.v1.lang.type.AddressType) +      if (fate_content_type instanceof tonkadur.fate.v1.lang.type.PointerType)        {           return              new MapType @@ -177,7 +177,7 @@ public class TypeCompiler                    (                       compiler,                       ( -                        (tonkadur.fate.v1.lang.type.AddressType) +                        (tonkadur.fate.v1.lang.type.PointerType)                          fate_content_type                       ).get_referenced_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 index 1689231..3c45e83 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/util/registers/RegisterContext.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/util/registers/RegisterContext.java @@ -16,7 +16,7 @@ class RegisterContext     protected final String name;     protected final Map<String, Register> register_by_name;     protected final Map<String, Register> aliased_registers; -   protected final Map<Type, Register> anonymous_register_by_type; +   protected final Map<Type, List<Register>> anonymous_register_by_type;     protected int generated_registers;     public RegisterContext (final String name) @@ -25,7 +25,7 @@ class RegisterContext        register_by_name = new HashMap<String, Register>();        aliased_registers = new HashMap<String, Register>(); -      anonymous_register_by_type = new HashMap<Type, Register>(); +      anonymous_register_by_type = new HashMap<Type, List<Register>>();        generated_registers = 0;     } @@ -50,9 +50,9 @@ class RegisterContext           anonymous_register_by_type.put(t, list);        } -      for (final register r: list) +      for (final Register r: list)        { -         if (!entry.get_is_in_use()) +         if (!r.get_is_in_use())           {              r.set_is_in_use(true); @@ -62,7 +62,7 @@ class RegisterContext        name = (name_prefix + Integer.toString(generated_registers++)); -      result = create_register(t, "local", name); +      result = create_register(t, name);        result.set_is_in_use(true); @@ -73,11 +73,11 @@ class RegisterContext        return result;     } -   public Register reserve (final Type t, final String scope, final String name) +   public Register reserve (final Type t, final String name)     {        final Register result; -      result = create_register(t, scope, name); +      result = create_register(t, name);        if (register_by_name.get(name) != null)        { @@ -96,7 +96,7 @@ class RegisterContext        return result;     } -   public void bind (final Register reg, final String name) +   public void bind (final String name, final Register reg)     {        if (aliased_registers.containsKey(name))        { @@ -137,13 +137,8 @@ class RegisterContext        r.set_is_in_use(false);     } -   protected Register create_register -   ( -      final Type t, -      final String scope, -      final String name -   ) +   protected Register create_register (final Type t, final String name)     { -      return new Register(t, scope, name); +      return new Register(t, name);     }  } 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 index dffb52a..88f3eeb 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/util/registers/RegisterManager.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/util/registers/RegisterManager.java @@ -1,21 +1,25 @@  package tonkadur.wyrd.v1.compiler.util.registers; -import java.util.Map; -import java.util.HashMap; +import java.util.ArrayDeque; +import java.util.ArrayList;  import java.util.Collection; +import java.util.Deque; +import java.util.HashMap;  import java.util.List; -import java.util.ArrayList; +import java.util.Map;  import tonkadur.functional.Cons;  import tonkadur.wyrd.v1.lang.Register;  import tonkadur.wyrd.v1.lang.meta.Computation; +import tonkadur.wyrd.v1.lang.meta.Instruction;  import tonkadur.wyrd.v1.lang.computation.Address;  import tonkadur.wyrd.v1.lang.computation.Constant;  import tonkadur.wyrd.v1.lang.type.Type; +import tonkadur.wyrd.v1.lang.type.DictType;  public class RegisterManager @@ -30,7 +34,7 @@ public class RegisterManager     {        base_context = new RegisterContext("base context"); -      context_by_name = new HashMap<String, RegisterContext>(); +      context_by_name = new HashMap<String, StackableRegisterContext>();        context = new ArrayDeque<RegisterContext>();        created_contexts = 0; @@ -39,7 +43,7 @@ public class RegisterManager     public Register reserve (final Type t)     { -      context.peekFirst().reserve(t); +      return context.peekFirst().reserve(t);     }     public void release (final Register r) @@ -56,14 +60,19 @@ public class RegisterManager     {        final StackableRegisterContext result; -      result = StackableRegisterContext.generate(base_context, context_name); +      result = new StackableRegisterContext(base_context, context_name); + +      if (context_by_name.containsKey(context_name)) +      { +         System.err.println("[P] Duplicate context '" + context_name +"'."); +      } -      context_by_name.put(result); +      context_by_name.put(context_name, result);     } -   public void register (final Type t, final String register_name) +   public Register register (final Type t, final String name)     { -      context.peekFirst().reserve(t, name); +      return context.peekFirst().reserve(t, name);     }     public void bind (final String name, final Register register) @@ -76,7 +85,7 @@ public class RegisterManager        context.peekFirst().unbind(name);     } -   public Register get_context_register (final String register_name) +   public Register get_context_register (final String name)     {        final Register result; @@ -110,9 +119,9 @@ public class RegisterManager     {        final Collection<DictType> result; -      result = new ArrayList<Type>(); +      result = new ArrayList<DictType>(); -      for (final StackableRegisterContext src: register_by_name.values()) +      for (final StackableRegisterContext src: context_by_name.values())        {           result.add(src.get_structure_type());        } 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 index 193315b..e8f79a8 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/util/registers/StackableRegisterContext.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/util/registers/StackableRegisterContext.java @@ -8,14 +8,20 @@ import java.util.ArrayList;  import tonkadur.functional.Cons; -import tonkadur.wyrd.v1.lang.Variable; +import tonkadur.wyrd.v1.lang.Register;  import tonkadur.wyrd.v1.lang.meta.Computation; +import tonkadur.wyrd.v1.lang.meta.Instruction;  import tonkadur.wyrd.v1.lang.computation.Address; +import tonkadur.wyrd.v1.lang.computation.RelativeAddress;  import tonkadur.wyrd.v1.lang.computation.Constant; +import tonkadur.wyrd.v1.lang.computation.Cast;  import tonkadur.wyrd.v1.lang.type.Type; +import tonkadur.wyrd.v1.lang.type.PointerType; +import tonkadur.wyrd.v1.lang.type.MapType; +import tonkadur.wyrd.v1.lang.type.DictType;  class StackableRegisterContext extends RegisterContext @@ -55,16 +61,11 @@ class StackableRegisterContext extends RegisterContext     }     @Override -   protected Register generate_register -   ( -      final Type t, -      final String scope, -      final String name -   ) +   protected Register create_register (final Type t, final String name)     {        final Register result; -      if (context_structure.get(name) != null) +      if (context_structure.get_fields().get(name) != null)        {           System.err.println           ( @@ -76,7 +77,7 @@ class StackableRegisterContext extends RegisterContext           );        } -      context_structure.put(name, t); +      context_structure.get_fields().put(name, t);        return           new Register @@ -88,11 +89,22 @@ class StackableRegisterContext extends RegisterContext                 t              ),              t, -            scope,              name           );     } +   public List<Instruction> get_enter_instructions () +   { +      /* TODO */ +      return new ArrayList<>(); +   } + +   public List<Instruction> get_leave_instructions () +   { +      /* TODO */ +      return new ArrayList<>(); +   } +     public DictType get_structure_type ()     {        return context_structure; diff --git a/src/core/src/tonkadur/wyrd/v1/lang/Register.java b/src/core/src/tonkadur/wyrd/v1/lang/Register.java index 4f1c671..4dfbf23 100644 --- a/src/core/src/tonkadur/wyrd/v1/lang/Register.java +++ b/src/core/src/tonkadur/wyrd/v1/lang/Register.java @@ -10,35 +10,34 @@ import tonkadur.wyrd.v1.lang.meta.Computation;  public class Register  {     protected final Type type; -   protected final String scope;     protected final String name;     protected final Address address;     protected final Computation value; +   protected boolean is_in_use; -   public Register (final Type type, final String scope, final String name) +   public Register (final Type type, final String name)     {        this.name = name; -      this.scope = scope;        this.type = type;        address = new Address(new Constant(Type.STRING, name), type);        value = new ValueOf(address); +      is_in_use = false;     }     public Register     (        final Address address,        final Type type, -      final String scope,        final String name     )     {        this.address = address;        this.name = name; -      this.scope = scope;        this.type = type;        value = new ValueOf(address); +      is_in_use = false;     }     public Type get_type () @@ -65,4 +64,14 @@ public class Register     {        return value;     } + +   public boolean get_is_in_use () +   { +      return is_in_use; +   } + +   public void set_is_in_use (final boolean val) +   { +      is_in_use = val; +   }  } | 


