| summaryrefslogtreecommitdiff | 
diff options
| author | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2021-08-30 23:50:54 +0200 | 
|---|---|---|
| committer | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2021-08-30 23:50:54 +0200 | 
| commit | 535eabb82e49f94f51189823f6ee78b9103ed226 (patch) | |
| tree | 8d9af3be7957fcc9fbcd9760eee5eddb09eceabe /src/core | |
| parent | 746329272fcab689d0fa2f0594f7914c8cc497b0 (diff) | |
Adds the missing Wyrd Generic Instruction compilers & fixes a few issues.
Diffstat (limited to 'src/core')
13 files changed, 665 insertions, 715 deletions
| diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/GenericComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/GenericComputation.java index 8bf5e8d..d2a5ef0 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/GenericComputation.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/GenericComputation.java @@ -94,7 +94,9 @@ public abstract class GenericComputation extends Computation              (                 "[E] Unknown Generic Fate Computation '"                 + name -               + "'." +               + "' at " +               + origin +               + "."              );        } diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/Paragraph.java b/src/core/src/tonkadur/fate/v1/lang/computation/Paragraph.java index c0392c9..5bfe6bd 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/Paragraph.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/Paragraph.java @@ -32,7 +32,7 @@ public class Paragraph extends Computation     )     throws Throwable     { -      for (int i = content.size(); i > 0; i--) +      for (int i = content.size() - 1; i >= 0; i--)        {           final Computation c; diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/GenericInstruction.java b/src/core/src/tonkadur/fate/v1/lang/instruction/GenericInstruction.java index 850dc73..29a0bd0 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/GenericInstruction.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/GenericInstruction.java @@ -95,10 +95,14 @@ public abstract class GenericInstruction extends Instruction              (                 "[E] Unknown Generic Fate Instruction '"                 + name -               + "'." +               + "' at " +               + origin +               + "."              );        } +      System.out.println("Resolving GenericInstruction " + name + "..."); +        return           (Instruction) computation_class.getDeclaredMethod           ( diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/SetValue.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/SetValue.java index 2102743..d712715 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/SetValue.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/SetValue.java @@ -36,14 +36,34 @@ public class SetValue extends GenericInstruction     public static Instruction build     (        final Origin origin, +      final Computation reference, +      final Computation value +   ) +   throws Throwable +   { +      reference.expect_non_string(); + +      RecurrentChecks.handle_expected_type_propagation +      ( +         value, +         reference.get_type() +      ); + +      RecurrentChecks.assert_can_be_used_as(value, reference); + +      reference.use_as_reference(); + +      return new SetValue(origin, value, reference); +   } + +   public static Instruction build +   ( +      final Origin origin,        final String _alias,        final List<Computation> call_parameters     )     throws Throwable     { -      final Computation reference; -      final Computation value; -        if (call_parameters.size() != 2)        {           // TODO: Error. @@ -56,22 +76,7 @@ public class SetValue extends GenericInstruction           return null;        } -      reference = call_parameters.get(0); -      value = call_parameters.get(1); - -      reference.expect_non_string(); - -      RecurrentChecks.handle_expected_type_propagation -      ( -         value, -         reference.get_type() -      ); - -      RecurrentChecks.assert_can_be_used_as(value, reference); - -      reference.use_as_reference(); - -      return new SetValue(origin, value, reference); +      return build(origin, call_parameters.get(0), call_parameters.get(1));     }     /***************************************************************************/ diff --git a/src/core/src/tonkadur/fate/v1/parser/FateLexer.g4 b/src/core/src/tonkadur/fate/v1/parser/FateLexer.g4 index 3934170..0cbe9f5 100644 --- a/src/core/src/tonkadur/fate/v1/parser/FateLexer.g4 +++ b/src/core/src/tonkadur/fate/v1/parser/FateLexer.g4 @@ -19,8 +19,6 @@ IMP_MARKER: IMP;  FATE_VERSION_KW: L_PAREN 'fate'US'version' SEP+; - -  DECLARE_ALIAS_TYPE_KW:     L_PAREN        ((('declare'|('def''ine'?))US(('sub'|'alias')US)?'type')|'typedef') @@ -58,34 +56,24 @@ DECLARE_LOCAL_VARIABLE_KW: L_PAREN 'local' SEP+; - -DICT_KW: L_PAREN 'dict'('ionary'?) SEP+; -LIST_KW: L_PAREN 'list' SEP+; - +VARIABLE_KW: L_PAREN ('variable'|'var') SEP+;  ENABLE_TEXT_EFFECT_KW: L_PAREN 'text'US'effect' SEP+; -NEWLINE_KW: L_PAREN 'newline' SEP* R_PAREN;  TEXT_KW: L_PAREN 'text' SEP+; - -CONS_KW: L_PAREN 'cons' SEP+; -  COND_KW: L_PAREN 'cond' SEP+;  DO_WHILE_KW: L_PAREN 'do'US'while' SEP+;  FOR_KW: L_PAREN 'for' SEP+;  FOR_EACH_KW: L_PAREN 'for'US'each' SEP+;  WHILE_KW: L_PAREN 'while' SEP+;  SWITCH_KW: L_PAREN 'switch' SEP+; -IMP_BREAK_KW: L_PAREN 'break'('!'?) SEP* R_PAREN; -IMP_CONTINUE_KW: L_PAREN 'continue'('!'?) SEP* R_PAREN; - +// FIXME: this hides generic if_else and if.  IF_ELSE_KW: L_PAREN 'if'US'else' SEP+;  IF_KW: L_PAREN 'if' SEP+; -  STRING_KW: L_PAREN 'string' SEP+; @@ -100,10 +88,9 @@ IGNORE_ERROR_KW: L_PAREN 'ignore'US('error'|'warning') SEP+; -EXTENSION_FIRST_LEVEL_KW: L_PAREN '@'; -EXTRA_INSTRUCTION_KW: L_PAREN '#'; -EXTRA_COMPUTATION_KW: L_PAREN '$'; - +//EXTENSION_FIRST_LEVEL_KW: L_PAREN '@'; +//EXTRA_INSTRUCTION_KW: L_PAREN '#'; +//EXTRA_COMPUTATION_KW: L_PAREN '$';  FIELD_ACCESS_KW: L_PAREN 'struct:get'(US'field')? SEP+; @@ -123,30 +110,10 @@ PROMPT_INTEGER_KW: L_PAREN 'prompt'US'int''eger'?'!' SEP+;  LET_KW: L_PAREN 'let' SEP+; -REF_KW: -   L_PAREN -      ( -         ((('ref''erence'?)|'ptr'|'pointer')(US'to')?) -         |('addr''ess'?(US'of')?) -      ) -   SEP+; - -VARIABLE_KW: L_PAREN 'var''iable'? SEP+; -  LAMBDA_KW: L_PAREN 'lambda' SEP+;  SEQUENCE_KW: L_PAREN 'seq''uence'? SEP+; -DONE_KW: L_PAREN 'done''!'? SEP* R_PAREN; -VISIT_KW: -   L_PAREN ('call'|'visit')(US(('seq''uence'?)|('proc''edure'?)))?'!' SEP+; -CONTINUE_AS_KW: -   L_PAREN -      (('continue'US('as'|'to'|'with'))|('jump'(US'to')?)|('go'US'to')|'exec') -      (US(('seq''uence'?)|('proc''edure'?)))? -      '!' -   SEP+; -END_KW: L_PAREN 'end'('!'?) SEP* R_PAREN;  fragment IDENTIFIER_FRAG: ~([ \t\r\n()]|'!'); diff --git a/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 b/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 index 1f70545..7a1f546 100644 --- a/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 +++ b/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 @@ -42,6 +42,8 @@ options     import tonkadur.fate.v1.lang.meta.*;     import tonkadur.fate.v1.lang.type.*;     import tonkadur.fate.v1.lang.computation.*; + +   import tonkadur.fate.v1.lang.instruction.generic.SetValue;  }  @members @@ -931,7 +933,7 @@ returns [Instruction result]                 ($L_PAREN.getLine()),                 ($L_PAREN.getCharPositionInLine())              ), -            ($WORD.text), +            ($WORD.text).substring(0, (($WORD.text).length() - 1)),              ($maybe_computation_list.result)           );     } @@ -1480,15 +1482,15 @@ returns [Computation result]  {  }  : -   computation_list +   computation_list_with_explicit_spaces     {        // convert all computations to text.        // return text node.        $result =           Paragraph.build           ( -            $computation_list.result.get(0).get_origin(), -            $computation_list.result +            $computation_list_with_explicit_spaces.result.get(0).get_origin(), +            $computation_list_with_explicit_spaces.result           );     }  ; @@ -1744,13 +1746,13 @@ returns [List<Instruction> result]              SetValue.build              (                 origin, -               ($computation.result),                 VariableFromWord.generate                 (                    PARSER,                    origin,                    var_name -               ) +               ), +               ($computation.result)              )           ); @@ -1835,8 +1837,8 @@ returns [List<Instruction> result]              SetValue.build              (                 origin, -               ($computation.result), -               VariableFromWord.generate(PARSER, origin, var_name) +               VariableFromWord.generate(PARSER, origin, var_name), +               ($computation.result)              )           ); @@ -2262,6 +2264,36 @@ returns [Computation result]              ($maybe_computation_list.result)           );     } + +   | IF_KW maybe_computation_list WS* R_PAREN +   { +      $result = +         GenericComputation.build +         ( +            PARSER.get_origin_at +            ( +               ($IF_KW.getLine()), +               ($IF_KW.getCharPositionInLine()) +            ), +            ($IF_KW.text).substring(1), +            ($maybe_computation_list.result) +         ); +   } + +   | IF_ELSE_KW maybe_computation_list WS* R_PAREN +   { +      $result = +         GenericComputation.build +         ( +            PARSER.get_origin_at +            ( +               ($IF_ELSE_KW.getLine()), +               ($IF_ELSE_KW.getCharPositionInLine()) +            ), +            ($IF_ELSE_KW.text).substring(1), +            ($maybe_computation_list.result) +         ); +   }  ;  catch [final Throwable e]  { @@ -2387,6 +2419,47 @@ catch [final Throwable e]     PARSER.handle_error(e);  } +computation_list_with_explicit_spaces +returns [List<Computation> result] +@init +{ +   $result = new ArrayList<Computation>(); +} +: +   computation +   { +      ($result).add(($computation.result)); +   } +   ( +      (WS+ +         { +            ($result).add +            ( +               Constant.build_string +               ( +                  PARSER.get_origin_at +                  ( +                     ($WS.getLine()), +                     ($WS.getCharPositionInLine()) +                  ), +                  " " +               ) +            ); +         } +      )* +      computation +      { +         ($result).add(($computation.result)); +      } +   )* +   { +   } +; +catch [final Throwable e] +{ +   PARSER.handle_error(e); +} +  word returns [String result, Origin origin]:     WORD     { 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 049e343..cc30524 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 @@ -146,76 +146,6 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor        msg_cc.release_registers(result);     } -/* -   public void visit_reverse_list -   ( -      final tonkadur.fate.v1.lang.instruction.ReverseList n -   ) -   throws Throwable -   { -      final ComputationCompiler address_compiler; -      final Address collection_address; - -      address_compiler = new ComputationCompiler(compiler); - -      n.get_collection().get_visited_by(address_compiler); - -      if (address_compiler.has_init()) -      { -         result.add(address_compiler.get_init()); -      } - -      collection_address = address_compiler.get_address(); - -      result.add -      ( -         ReverseList.generate -         ( -            compiler.registers(), -            compiler.assembler(), -            new Size(collection_address), -            collection_address -         ) -      ); - -      address_compiler.release_registers(result); -   } -*/ -/* -   @Override -   public void visit_shuffle -   ( -      final tonkadur.fate.v1.lang.instruction.Shuffle n -   ) -   throws Throwable -   { -      final ComputationCompiler address_compiler; -      final Address collection_address; - -      address_compiler = new ComputationCompiler(compiler); - -      n.get_collection().get_visited_by(address_compiler); - -      if (address_compiler.has_init()) -      { -         result.add(address_compiler.get_init()); -      } - -      collection_address = address_compiler.get_address(); - -      result.add -      ( -         Shuffle.generate -         ( -            compiler.registers(), -            compiler.assembler(), -            collection_address -         ) -      ); - -      address_compiler.release_registers(result); -   } -*/     @Override     public void visit_set_fields     ( @@ -273,174 +203,6 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor        target_cc.release_registers(result);     } -/* -   @Override -   public void visit_sort -   ( -      final tonkadur.fate.v1.lang.instruction.Sort n -   ) -   throws Throwable -   { -      final ComputationCompiler lambda_cc; -      final List<Computation> params; -      final List<ComputationCompiler> param_cc_list; -      final ComputationCompiler collection_cc; -      final Register sorted_result; - -      params = new ArrayList<Computation>(); -      param_cc_list = new ArrayList<ComputationCompiler>(); - -      lambda_cc = new ComputationCompiler(compiler); - -      n.get_lambda_function().get_visited_by(lambda_cc); - -      if (lambda_cc.has_init()) -      { -         result.add(lambda_cc.get_init()); -      } - -      collection_cc = new ComputationCompiler(compiler); - -      n.get_collection().get_visited_by(collection_cc); - -      if (collection_cc.has_init()) -      { -         result.add(collection_cc.get_init()); -      } - -      for -      ( -         final tonkadur.fate.v1.lang.meta.Computation p: -            n.get_extra_parameters() -      ) -      { -         final ComputationCompiler param_cc; - -         param_cc = new ComputationCompiler(compiler); - -         p.get_visited_by(param_cc); - -         // Let's not re-compute the parameters on every iteration. -         param_cc.generate_address(); - -         if (param_cc.has_init()) -         { -            result.add(param_cc.get_init()); -         } - -         param_cc_list.add(param_cc); - -         params.add(param_cc.get_computation()); -      } - -      sorted_result = -         compiler.registers().reserve -         ( -            collection_cc.get_computation().get_type(), -            result -         ); - -      result.add -      ( -         Sort.generate -         ( -            compiler.registers(), -            compiler.assembler(), -            lambda_cc.get_computation(), -            collection_cc.get_address(), -            sorted_result.get_address(), -            params -         ) -      ); - -      result.add -      ( -         new SetValue(collection_cc.get_address(), sorted_result.get_value()) -      ); - -      compiler.registers().release(sorted_result, result); - -      collection_cc.release_registers(result); - -      for (final ComputationCompiler cc: param_cc_list) -      { -         cc.release_registers(result); -      } -   } -*/ -/* -   @Override -   public void visit_sublist -   ( -      final tonkadur.fate.v1.lang.instruction.SubList n -   ) -   throws Throwable -   { -      final ComputationCompiler address_compiler, start_compiler, end_compiler; -      final Register result_holder; - -      address_compiler = new ComputationCompiler(compiler); -      start_compiler = new ComputationCompiler(compiler); -      end_compiler = new ComputationCompiler(compiler); - -      n.get_collection().get_visited_by(address_compiler); - -      if (address_compiler.has_init()) -      { -         result.add(address_compiler.get_init()); -      } - -      n.get_start_index().get_visited_by(start_compiler); - -      if (start_compiler.has_init()) -      { -         result.add(start_compiler.get_init()); -      } - -      n.get_end_index().get_visited_by(end_compiler); - -      if (end_compiler.has_init()) -      { -         result.add(end_compiler.get_init()); -      } - -      result_holder = -         compiler.registers().reserve -         ( -            address_compiler.get_computation().get_type(), -            result -         ); - -      result.add -      ( -         SubList.generate -         ( -            compiler.registers(), -            compiler.assembler(), -            start_compiler.get_computation(), -            end_compiler.get_computation(), -            address_compiler.get_address(), -            result_holder.get_address() -         ) -      ); - -      result.add -      ( -         new SetValue -         ( -            address_compiler.get_address(), -            result_holder.get_value() -         ) -      ); - -      compiler.registers().release(result_holder, result); - -      address_compiler.release_registers(result); -      start_compiler.release_registers(result); -      end_compiler.release_registers(result); -   } -*/ -     @Override     public void visit_switch_instruction     ( @@ -1606,234 +1368,6 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor        );     } -//   @Override -//   public void visit_remove_all_of_element -//   ( -//      final tonkadur.fate.v1.lang.instruction.RemoveAllOfElement n -//   ) -//   throws Throwable -//   { -//      /* -//       * Fate: -//       * (remove_all_of element collection) -//       * -//       * Wyrd: -//       * (declare_variable <element_type> .elem) -//       * (declare_variable int .collection_size) -//       * -//       * (set .elem element) -//       * (set .collection_size (size collection)) -//       * -//       * <if collection is a list: -//       *    <remove_all (var .elem) (var .collection_size) collection> -//       * > -//       * <if collection is a set: -//       *    (declare_variable bool .found) -//       *    (declare_variable int .index) -//       * -//       *    <binary_search -//       *       (var .elem) -//       *       (var .collection_size) -//       *       collection -//       *       .found -//       *       .index -//       *    > -//       *    (ifelse (var .found) -//       *       <remove_at (var .index) (var .collection_size) collection> -//       *       (nop) -//       *    ) -//       * > -//       */ -//      final ComputationCompiler elem_cc, collection_cc; -//      final Register collection_size; -//      final Address elem, collection; -// -//      elem_cc = new ComputationCompiler(compiler); -//      collection_cc = new ComputationCompiler(compiler); -// -//      collection_size = compiler.registers().reserve(Type.INT, result); -// -//      n.get_element().get_visited_by(elem_cc); -//      n.get_collection().get_visited_by(collection_cc); -// -//      elem_cc.generate_address(); -// -//      if (elem_cc.has_init()) -//      { -//         result.add(elem_cc.get_init()); -//      } -// -//      if (collection_cc.has_init()) -//      { -//         result.add(collection_cc.get_init()); -//      } -// -//      collection = collection_cc.get_address(); -//      elem = elem_cc.get_address(); -// -//      result.add -//      ( -//         new SetValue(collection_size.get_address(), new Size(collection)) -//      ); -// -//      if -//      ( -//         ( -//            (tonkadur.fate.v1.lang.type.CollectionType) -//            n.get_collection().get_type() -//         ).is_set() -//      ) -//      { -//         final Computation value_of_elem; -//         final Register index, found; -// -//         index = compiler.registers().reserve(Type.INT, result); -//         found = compiler.registers().reserve(Type.BOOL, result); -// -//         value_of_elem = new ValueOf(elem); -// -//         result.add -//         ( -//            BinarySearch.generate -//            ( -//               compiler.registers(), -//               compiler.assembler(), -//               new ValueOf(elem), -//               collection_size.get_value(), -//               collection, -//               found.get_address(), -//               index.get_address() -//            ) -//         ); -// -//         elem_cc.release_registers(result); -// -//         result.add -//         ( -//            If.generate -//            ( -//               compiler.registers(), -//               compiler.assembler(), -//               found.get_value(), -//               RemoveAt.generate -//               ( -//                  compiler.registers(), -//                  compiler.assembler(), -//                  index.get_address(), -//                  collection_size.get_value(), -//                  collection -//               ) -//            ) -//         ); -// -//         compiler.registers().release(index, result); -//         compiler.registers().release(found, result); -//      } -//      else -//      { -//         result.add -//         ( -//            RemoveAllOf.generate -//            ( -//               compiler.registers(), -//               compiler.assembler(), -//               new ValueOf(elem), -//               collection_size.get_value(), -//               collection -//            ) -//         ); -// -//         elem_cc.release_registers(result); -//      } -// -//      collection_cc.release_registers(result); -// -//      compiler.registers().release(collection_size, result); -//   } - -//   @Override -//   public void visit_remove_element -//   ( -//      final tonkadur.fate.v1.lang.instruction.RemoveElement n -//   ) -//   throws Throwable -//   { -//      /* -//       * Fate: -//       * (remove_element element collection) -//       * -//       * Wyrd: -//       * (declare_variable <element_type> .elem) -//       * (declare_variable int .collection_size) -//       * (declare_variable boolean .found) -//       * (declare_variable int .index) -//       * -//       * (set .elem element) -//       * (set .collection_size (size collection)) -//       * -//       * <if collection is a set: -//       *    <BinarySearch -//       *       (var .elem) -//       *       (var .collection_size) -//       *       collection -//       *       .found -//       *       .index -//       *    > -//       * > -//       * <if collection is a list: -//       *    <IterativeSearch -//       *       (var .elem) -//       *       (var .collection_size) -//       *       collection -//       *       .found -//       *       .index -//       *    > -//       * > -//       * -//       * (if (var .found) -//       *    <remove_at (var index) (var .collection_size) collection> -//       *    (nop) -//       * ) -//       */ -//      final ComputationCompiler elem_cc, collection_cc; -// -//      elem_cc = new ComputationCompiler(compiler); -//      collection_cc = new ComputationCompiler(compiler); -// -//      n.get_element().get_visited_by(elem_cc); -//      n.get_collection().get_visited_by(collection_cc); -// -//      elem_cc.generate_address(); -// -//      if (elem_cc.has_init()) -//      { -//         result.add(elem_cc.get_init()); -//      } -// -//      if (collection_cc.has_init()) -//      { -//         result.add(collection_cc.get_init()); -//      } -// -//      result.add -//      ( -//         RemoveOneOf.generate -//         ( -//            compiler.registers(), -//            compiler.assembler(), -//            elem_cc.get_computation(), -//            collection_cc.get_address(), -//            ( -//               (tonkadur.fate.v1.lang.type.CollectionType) -//               n.get_collection().get_type() -//            ).is_set() -//         ) -//      ); -// -//      elem_cc.release_registers(result); -//      collection_cc.release_registers(result); -//   } -//     @Override     public void visit_sequence_call     ( @@ -1901,80 +1435,6 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor        }     } -/* -   @Override -   public void visit_sequence_variable_call -   ( -      final tonkadur.fate.v1.lang.instruction.SequenceVariableCall n -   ) -   throws Throwable -   { -      final ComputationCompiler sequence_cc; -      final List<ComputationCompiler> parameter_ccs; -      final List<Computation> parameters; - -      final String return_to_label; - -      return_to_label = -         compiler.assembler().generate_label("<seq_call#return_to>"); - -      sequence_cc = new ComputationCompiler(compiler); -      parameter_ccs = new ArrayList<ComputationCompiler>(); -      parameters = new ArrayList<Computation>(); - -      n.get_sequence().get_visited_by(sequence_cc); - -      if (sequence_cc.has_init()) -      { -         result.add(sequence_cc.get_init()); -      } - -      for -      ( -         final tonkadur.fate.v1.lang.meta.Computation param: n.get_parameters() -      ) -      { -         final ComputationCompiler cc; - -         cc = new ComputationCompiler(compiler); - -         param.get_visited_by(cc); - -         if (cc.has_init()) -         { -            result.add(cc.get_init()); -         } - -         parameters.add(cc.get_computation()); -         parameter_ccs.add(cc); -      } - -      result.addAll(compiler.registers().store_parameters(parameters)); - -      result.add -      ( -         compiler.assembler().mark_after -         ( -            compiler.assembler().merge -            ( -               compiler.registers().get_visit_context_instructions -               ( -                  sequence_cc.get_computation(), -                  compiler.assembler().get_label_constant(return_to_label) -               ) -            ), -            return_to_label -         ) -      ); - -      sequence_cc.release_registers(result); - -      for (final ComputationCompiler cc: parameter_ccs) -      { -         cc.release_registers(result); -      } -   } -*/     @Override     public void visit_sequence_jump     ( @@ -2034,113 +1494,6 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor           )        );     } -/* -   @Override -   public void visit_sequence_variable_jump -   ( -      final tonkadur.fate.v1.lang.instruction.SequenceVariableJump n -   ) -   throws Throwable -   { -      final ComputationCompiler sequence_cc; -      final List<ComputationCompiler> parameter_ccs; -      final List<Computation> parameters; - -      sequence_cc = new ComputationCompiler(compiler); -      parameter_ccs = new ArrayList<ComputationCompiler>(); -      parameters = new ArrayList<Computation>(); - -      n.get_sequence().get_visited_by(sequence_cc); - -      if (sequence_cc.has_init()) -      { -         result.add(sequence_cc.get_init()); -      } - -      for -      ( -         final tonkadur.fate.v1.lang.meta.Computation param: n.get_parameters() -      ) -      { -         final ComputationCompiler cc; - -         cc = new ComputationCompiler(compiler); - -         param.get_visited_by(cc); - -         if (cc.has_init()) -         { -            result.add(cc.get_init()); -         } - -         parameters.add(cc.get_computation()); -         parameter_ccs.add(cc); -      } - -      result.addAll(compiler.registers().store_parameters(parameters)); - -      for (final ComputationCompiler cc: parameter_ccs) -      { -         cc.release_registers(result); -      } - -      // Terminate current context -      result.addAll -      ( -         compiler.registers().get_finalize_context_instructions() -      ); - -      result.addAll -      ( -         compiler.registers().get_jump_to_context_instructions -         ( -            sequence_cc.get_computation() -         ) -      ); - -      sequence_cc.release_registers(result); -   } -*/ -/* -   @Override -   public void visit_set_value -   ( -      final tonkadur.fate.v1.lang.instruction.SetValue n -   ) -   throws Throwable -   { -      /* -       * Fate: (set_value address value) -       * Wyrd: (set_value address value) -       *//* -      final ComputationCompiler value_cc, address_cc; - -      value_cc = new ComputationCompiler(compiler); -      address_cc = new ComputationCompiler(compiler); - -      n.get_value().get_visited_by(value_cc); - -      if (value_cc.has_init()) -      { -         result.add(value_cc.get_init()); -      } - -      n.get_reference().get_visited_by(address_cc); - -      if (address_cc.has_init()) -      { -         result.add(address_cc.get_init()); -      } - -      result.add -      ( -         new SetValue(address_cc.get_address(), value_cc.get_computation()) -      ); - -      value_cc.release_registers(result); -      address_cc.release_registers(result); -   } -*/     @Override     public void visit_prompt_integer diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/SequenceVariableCallCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/SequenceVariableCallCompiler.java new file mode 100644 index 0000000..673bf71 --- /dev/null +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/SequenceVariableCallCompiler.java @@ -0,0 +1,102 @@ +package tonkadur.wyrd.v1.compiler.fate.v1.instruction.generic; + +import java.util.ArrayList; +import java.util.List; + +import tonkadur.fate.v1.lang.instruction.generic.SequenceVariableCall; + +import tonkadur.wyrd.v1.lang.meta.Computation; + +import tonkadur.wyrd.v1.compiler.fate.v1.Compiler; +import tonkadur.wyrd.v1.compiler.fate.v1.ComputationCompiler; + +import tonkadur.wyrd.v1.compiler.fate.v1.instruction.GenericInstructionCompiler; + +public class SequenceVariableCallCompiler extends GenericInstructionCompiler +{ +   public static Class get_target_class () +   { +      return SequenceVariableCall.class; +   } + +   public SequenceVariableCallCompiler (final Compiler compiler) +   { +      super(compiler); +   } + +   public void compile +   ( +      final tonkadur.fate.v1.lang.instruction.GenericInstruction instruction +   ) +   throws Throwable +   { +      final SequenceVariableCall source; +      final ComputationCompiler sequence_cc; +      final List<ComputationCompiler> parameter_ccs; +      final List<Computation> parameters; + +      final String return_to_label; + +      source = (SequenceVariableCall) instruction; + +      return_to_label = +         compiler.assembler().generate_label("<seq_call#return_to>"); + +      sequence_cc = new ComputationCompiler(compiler); +      parameter_ccs = new ArrayList<ComputationCompiler>(); +      parameters = new ArrayList<Computation>(); + +      source.get_sequence().get_visited_by(sequence_cc); + +      if (sequence_cc.has_init()) +      { +         result.add(sequence_cc.get_init()); +      } + +      for +      ( +         final tonkadur.fate.v1.lang.meta.Computation param: +            source.get_parameters() +      ) +      { +         final ComputationCompiler cc; + +         cc = new ComputationCompiler(compiler); + +         param.get_visited_by(cc); + +         if (cc.has_init()) +         { +            result.add(cc.get_init()); +         } + +         parameters.add(cc.get_computation()); +         parameter_ccs.add(cc); +      } + +      result.addAll(compiler.registers().store_parameters(parameters)); + +      result.add +      ( +         compiler.assembler().mark_after +         ( +            compiler.assembler().merge +            ( +               compiler.registers().get_visit_context_instructions +               ( +                  sequence_cc.get_computation(), +                  compiler.assembler().get_label_constant(return_to_label) +               ) +            ), +            return_to_label +         ) +      ); + +      sequence_cc.release_registers(result); + +      for (final ComputationCompiler cc: parameter_ccs) +      { +         cc.release_registers(result); +      } +   } +} diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/SequenceVariableJumpCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/SequenceVariableJumpCompiler.java new file mode 100644 index 0000000..2ba4c44 --- /dev/null +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/SequenceVariableJumpCompiler.java @@ -0,0 +1,95 @@ +package tonkadur.wyrd.v1.compiler.fate.v1.instruction.generic; + +import java.util.ArrayList; +import java.util.List; + +import tonkadur.fate.v1.lang.instruction.generic.SequenceVariableJump; + +import tonkadur.wyrd.v1.lang.meta.Computation; + +import tonkadur.wyrd.v1.compiler.fate.v1.Compiler; +import tonkadur.wyrd.v1.compiler.fate.v1.ComputationCompiler; + +import tonkadur.wyrd.v1.compiler.fate.v1.instruction.GenericInstructionCompiler; + +public class SequenceVariableJumpCompiler extends GenericInstructionCompiler +{ +   public static Class get_target_class () +   { +      return SequenceVariableJump.class; +   } + +   public SequenceVariableJumpCompiler (final Compiler compiler) +   { +      super(compiler); +   } + +   public void compile +   ( +      final tonkadur.fate.v1.lang.instruction.GenericInstruction instruction +   ) +   throws Throwable +   { +      final SequenceVariableJump source; +      final ComputationCompiler sequence_cc; +      final List<ComputationCompiler> parameter_ccs; +      final List<Computation> parameters; + +      source = (SequenceVariableJump) instruction; + +      sequence_cc = new ComputationCompiler(compiler); +      parameter_ccs = new ArrayList<ComputationCompiler>(); +      parameters = new ArrayList<Computation>(); + +      source.get_sequence().get_visited_by(sequence_cc); + +      if (sequence_cc.has_init()) +      { +         result.add(sequence_cc.get_init()); +      } + +      for +      ( +         final tonkadur.fate.v1.lang.meta.Computation param: +            source.get_parameters() +      ) +      { +         final ComputationCompiler cc; + +         cc = new ComputationCompiler(compiler); + +         param.get_visited_by(cc); + +         if (cc.has_init()) +         { +            result.add(cc.get_init()); +         } + +         parameters.add(cc.get_computation()); +         parameter_ccs.add(cc); +      } + +      result.addAll(compiler.registers().store_parameters(parameters)); + +      for (final ComputationCompiler cc: parameter_ccs) +      { +         cc.release_registers(result); +      } + +      // Terminate current context +      result.addAll +      ( +         compiler.registers().get_finalize_context_instructions() +      ); + +      result.addAll +      ( +         compiler.registers().get_jump_to_context_instructions +         ( +            sequence_cc.get_computation() +         ) +      ); + +      sequence_cc.release_registers(result); +   } +} diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/SetValueCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/SetValueCompiler.java new file mode 100644 index 0000000..122b9b7 --- /dev/null +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/SetValueCompiler.java @@ -0,0 +1,66 @@ +package tonkadur.wyrd.v1.compiler.fate.v1.instruction.generic; + +import tonkadur.fate.v1.lang.instruction.generic.SetValue; + +import tonkadur.wyrd.v1.compiler.fate.v1.Compiler; +import tonkadur.wyrd.v1.compiler.fate.v1.ComputationCompiler; + +import tonkadur.wyrd.v1.compiler.fate.v1.instruction.GenericInstructionCompiler; + +public class SetValueCompiler extends GenericInstructionCompiler +{ +   public static Class get_target_class () +   { +      return SetValue.class; +   } + +   public SetValueCompiler (final Compiler compiler) +   { +      super(compiler); +   } + +   /* +    * Fate: (set_value address value) +    * Wyrd: (set_value address value) +    */ +   public void compile +   ( +      final tonkadur.fate.v1.lang.instruction.GenericInstruction instruction +   ) +   throws Throwable +   { +      final SetValue source; +      final ComputationCompiler value_cc, address_cc; + +      source = (SetValue) instruction; + +      value_cc = new ComputationCompiler(compiler); +      address_cc = new ComputationCompiler(compiler); + +      source.get_value().get_visited_by(value_cc); + +      if (value_cc.has_init()) +      { +         result.add(value_cc.get_init()); +      } + +      source.get_reference().get_visited_by(address_cc); + +      if (address_cc.has_init()) +      { +         result.add(address_cc.get_init()); +      } + +      result.add +      ( +         new tonkadur.wyrd.v1.lang.instruction.SetValue +         ( +            address_cc.get_address(), +            value_cc.get_computation() +         ) +      ); + +      value_cc.release_registers(result); +      address_cc.release_registers(result); +   } +} diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/ShuffleCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/ShuffleCompiler.java new file mode 100644 index 0000000..d886233 --- /dev/null +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/ShuffleCompiler.java @@ -0,0 +1,59 @@ +package tonkadur.wyrd.v1.compiler.fate.v1.instruction.generic; + +import tonkadur.fate.v1.lang.instruction.generic.Shuffle; + +import tonkadur.wyrd.v1.lang.computation.Address; + +import tonkadur.wyrd.v1.compiler.fate.v1.Compiler; +import tonkadur.wyrd.v1.compiler.fate.v1.ComputationCompiler; + +import tonkadur.wyrd.v1.compiler.fate.v1.instruction.GenericInstructionCompiler; + +public class ShuffleCompiler extends GenericInstructionCompiler +{ +   public static Class get_target_class () +   { +      return Shuffle.class; +   } + +   public ShuffleCompiler (final Compiler compiler) +   { +      super(compiler); +   } + +   public void compile +   ( +      final tonkadur.fate.v1.lang.instruction.GenericInstruction instruction +   ) +   throws Throwable +   { +      final Shuffle source; +      final ComputationCompiler address_compiler; +      final Address collection_address; + +      source = (Shuffle) instruction; + +      address_compiler = new ComputationCompiler(compiler); + +      source.get_collection().get_visited_by(address_compiler); + +      if (address_compiler.has_init()) +      { +         result.add(address_compiler.get_init()); +      } + +      collection_address = address_compiler.get_address(); + +      result.add +      ( +         tonkadur.wyrd.v1.compiler.util.Shuffle.generate +         ( +            compiler.registers(), +            compiler.assembler(), +            collection_address +         ) +      ); + +      address_compiler.release_registers(result); +   } +} diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/SortCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/SortCompiler.java new file mode 100644 index 0000000..f31f58e --- /dev/null +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/SortCompiler.java @@ -0,0 +1,126 @@ +package tonkadur.wyrd.v1.compiler.fate.v1.instruction.generic; + +import java.util.List; +import java.util.ArrayList; + +import tonkadur.fate.v1.lang.instruction.generic.Sort; + +import tonkadur.wyrd.v1.lang.Register; + +import tonkadur.wyrd.v1.lang.meta.Computation; + +import tonkadur.wyrd.v1.lang.instruction.SetValue; + +import tonkadur.wyrd.v1.compiler.fate.v1.Compiler; +import tonkadur.wyrd.v1.compiler.fate.v1.ComputationCompiler; + +import tonkadur.wyrd.v1.compiler.fate.v1.instruction.GenericInstructionCompiler; + +public class SortCompiler extends GenericInstructionCompiler +{ +   public static Class get_target_class () +   { +      return Sort.class; +   } + +   public SortCompiler (final Compiler compiler) +   { +      super(compiler); +   } + +   public void compile +   ( +      final tonkadur.fate.v1.lang.instruction.GenericInstruction instruction +   ) +   throws Throwable +   { +      final Sort source; +      final ComputationCompiler lambda_cc; +      final List<Computation> params; +      final List<ComputationCompiler> param_cc_list; +      final ComputationCompiler collection_cc; +      final Register sorted_result; + +      source = (Sort) instruction; + +      params = new ArrayList<Computation>(); +      param_cc_list = new ArrayList<ComputationCompiler>(); + +      lambda_cc = new ComputationCompiler(compiler); + +      source.get_lambda_function().get_visited_by(lambda_cc); + +      if (lambda_cc.has_init()) +      { +         result.add(lambda_cc.get_init()); +      } + +      collection_cc = new ComputationCompiler(compiler); + +      source.get_collection().get_visited_by(collection_cc); + +      if (collection_cc.has_init()) +      { +         result.add(collection_cc.get_init()); +      } + +      for +      ( +         final tonkadur.fate.v1.lang.meta.Computation p: +            source.get_extra_parameters() +      ) +      { +         final ComputationCompiler param_cc; + +         param_cc = new ComputationCompiler(compiler); + +         p.get_visited_by(param_cc); + +         // Let's not re-compute the parameters on every iteration. +         param_cc.generate_address(); + +         if (param_cc.has_init()) +         { +            result.add(param_cc.get_init()); +         } + +         param_cc_list.add(param_cc); + +         params.add(param_cc.get_computation()); +      } + +      sorted_result = +         compiler.registers().reserve +         ( +            collection_cc.get_computation().get_type(), +            result +         ); + +      result.add +      ( +         tonkadur.wyrd.v1.compiler.util.Sort.generate +         ( +            compiler.registers(), +            compiler.assembler(), +            lambda_cc.get_computation(), +            collection_cc.get_address(), +            sorted_result.get_address(), +            params +         ) +      ); + +      result.add +      ( +         new SetValue(collection_cc.get_address(), sorted_result.get_value()) +      ); + +      compiler.registers().release(sorted_result, result); + +      collection_cc.release_registers(result); + +      for (final ComputationCompiler cc: param_cc_list) +      { +         cc.release_registers(result); +      } +   } +} diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/SubListCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/SubListCompiler.java new file mode 100644 index 0000000..af20802 --- /dev/null +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/SubListCompiler.java @@ -0,0 +1,98 @@ +package tonkadur.wyrd.v1.compiler.fate.v1.instruction.generic; + +import tonkadur.fate.v1.lang.instruction.generic.SubList; + +import tonkadur.wyrd.v1.lang.Register; + +import tonkadur.wyrd.v1.lang.instruction.SetValue; + +import tonkadur.wyrd.v1.compiler.fate.v1.Compiler; +import tonkadur.wyrd.v1.compiler.fate.v1.ComputationCompiler; + +import tonkadur.wyrd.v1.compiler.fate.v1.instruction.GenericInstructionCompiler; + +public class SubListCompiler extends GenericInstructionCompiler +{ +   public static Class get_target_class () +   { +      return SubList.class; +   } + +   public SubListCompiler (final Compiler compiler) +   { +      super(compiler); +   } + +   public void compile +   ( +      final tonkadur.fate.v1.lang.instruction.GenericInstruction instruction +   ) +   throws Throwable +   { +      final SubList source; +      final ComputationCompiler address_compiler, start_compiler, end_compiler; +      final Register result_holder; + +      source = (SubList) instruction; + +      address_compiler = new ComputationCompiler(compiler); +      start_compiler = new ComputationCompiler(compiler); +      end_compiler = new ComputationCompiler(compiler); + +      source.get_collection().get_visited_by(address_compiler); + +      if (address_compiler.has_init()) +      { +         result.add(address_compiler.get_init()); +      } + +      source.get_start_index().get_visited_by(start_compiler); + +      if (start_compiler.has_init()) +      { +         result.add(start_compiler.get_init()); +      } + +      source.get_end_index().get_visited_by(end_compiler); + +      if (end_compiler.has_init()) +      { +         result.add(end_compiler.get_init()); +      } + +      result_holder = +         compiler.registers().reserve +         ( +            address_compiler.get_computation().get_type(), +            result +         ); + +      result.add +      ( +         tonkadur.wyrd.v1.compiler.util.SubList.generate +         ( +            compiler.registers(), +            compiler.assembler(), +            start_compiler.get_computation(), +            end_compiler.get_computation(), +            address_compiler.get_address(), +            result_holder.get_address() +         ) +      ); + +      result.add +      ( +         new SetValue +         ( +            address_compiler.get_address(), +            result_holder.get_value() +         ) +      ); + +      compiler.registers().release(result_holder, result); + +      address_compiler.release_registers(result); +      start_compiler.release_registers(result); +      end_compiler.release_registers(result); +   } +} | 


