| summaryrefslogtreecommitdiff | 
diff options
45 files changed, 1247 insertions, 121 deletions
| diff --git a/src/core/src/tonkadur/Main.java b/src/core/src/tonkadur/Main.java index 4dabacb..f1eedb0 100644 --- a/src/core/src/tonkadur/Main.java +++ b/src/core/src/tonkadur/Main.java @@ -14,7 +14,7 @@ public class Main     public static void main (final String[] args)     {        final tonkadur.fate.v1.lang.World fate_world; -      final tonkadur.wyrd.v1.lang.World wyrd_world; +      tonkadur.wyrd.v1.lang.World wyrd_world;        final Context context;        fate_world = new tonkadur.fate.v1.lang.World(); @@ -39,6 +39,7 @@ public class Main           e.printStackTrace();        } +      wyrd_world = null;        try        {           wyrd_world = @@ -51,5 +52,14 @@ public class Main           System.err.println("Compilation failed.");           e.printStackTrace();        } + +      for +      ( +         final tonkadur.wyrd.v1.lang.meta.Instruction line: +            wyrd_world.get_code() +      ) +      { +         System.out.println(line.toString()); +      }     }  } diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/CondValue.java b/src/core/src/tonkadur/fate/v1/lang/computation/CondValue.java index b8f0709..1ac1f0c 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/CondValue.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/CondValue.java @@ -127,6 +127,11 @@ public class CondValue extends Computation        cv.visit_cond_value(this);     } +   public List<Cons<Computation, Computation>> get_branches () +   { +      return branches; +   } +     /**** Misc. ****************************************************************/     @Override     public String toString () diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/CountOperator.java b/src/core/src/tonkadur/fate/v1/lang/computation/CountOperator.java index fe72543..e53f748 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/CountOperator.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/CountOperator.java @@ -124,6 +124,16 @@ public class CountOperator extends Computation     }     /**** Accessors ************************************************************/ +   public Computation get_collection () +   { +      return collection; +   } + +   public Computation get_element () +   { +      return element; +   } +     @Override     public void get_visited_by (final ComputationVisitor cv)     throws Throwable diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/IsMemberOperator.java b/src/core/src/tonkadur/fate/v1/lang/computation/IsMemberOperator.java index f7e5b57..b23fcc4 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/IsMemberOperator.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/IsMemberOperator.java @@ -131,6 +131,16 @@ public class IsMemberOperator extends Computation        cv.visit_is_member_operator(this);     } +   public Computation get_collection () +   { +      return collection; +   } + +   public Computation get_element () +   { +      return element; +   } +     /**** Misc. ****************************************************************/     @Override     public String toString () diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/Operator.java b/src/core/src/tonkadur/fate/v1/lang/computation/Operator.java index 5cda7c2..2950636 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/Operator.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/Operator.java @@ -17,6 +17,7 @@ public class Operator     public static final Operator MINUS;     public static final Operator TIMES;     public static final Operator DIVIDE; +   public static final Operator MODULO;     public static final Operator POWER;     public static final Operator RANDOM; @@ -41,6 +42,7 @@ public class Operator        TIMES = new Operator("*", 2, 0, Type.NUMBER_TYPES, null);        DIVIDE = new Operator("/", 2, 2, Type.NUMBER_TYPES, null);        POWER = new Operator("^", 2, 2, Type.NUMBER_TYPES, null); +      MODULO = new Operator("%", 2, 2, Collections.singleton(Type.INT), null);        RANDOM =           new Operator("rand", 2, 2, Collections.singleton(Type.INT), null); @@ -109,6 +111,11 @@ public class Operator        return valid_input_types;     } +   public String get_name () +   { +      return name; +   } +     public int get_minimum_arity ()     {        return min_arity; @@ -132,6 +139,6 @@ public class Operator     @Override     public String toString ()     { -      return name; +      return get_name();     }  } diff --git a/src/core/src/tonkadur/fate/v1/lang/meta/Computation.java b/src/core/src/tonkadur/fate/v1/lang/meta/Computation.java index 67aaa52..082478e 100644 --- a/src/core/src/tonkadur/fate/v1/lang/meta/Computation.java +++ b/src/core/src/tonkadur/fate/v1/lang/meta/Computation.java @@ -29,7 +29,7 @@ public abstract class Computation extends Node     public void get_visited_by (final ComputationVisitor cv)     throws Throwable     { - +      System.err.println("Unable to visit: " + toString());     }     public Type get_type () diff --git a/src/core/src/tonkadur/fate/v1/lang/meta/Instruction.java b/src/core/src/tonkadur/fate/v1/lang/meta/Instruction.java index 7782a97..e7415ea 100644 --- a/src/core/src/tonkadur/fate/v1/lang/meta/Instruction.java +++ b/src/core/src/tonkadur/fate/v1/lang/meta/Instruction.java @@ -27,7 +27,7 @@ public abstract class Instruction extends Node     public void get_visited_by (final InstructionVisitor iv)     throws Throwable     { - +      System.err.println("Unable to visit: " + toString());     }     /**** Misc. ****************************************************************/ 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 52d92bc..4766e73 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 @@ -2,10 +2,13 @@ package tonkadur.wyrd.v1.compiler.fate.v1;  import java.util.Collections;  import java.util.List; +import java.util.Iterator;  import java.util.ArrayList;  import tonkadur.error.Error; +import tonkadur.functional.Cons; +  import tonkadur.wyrd.v1.lang.meta.Computation;  import tonkadur.wyrd.v1.lang.meta.Instruction; @@ -13,7 +16,11 @@ import tonkadur.wyrd.v1.lang.type.Type;  import tonkadur.wyrd.v1.lang.instruction.SetValue; +import tonkadur.wyrd.v1.compiler.util.BinarySearch;  import tonkadur.wyrd.v1.compiler.util.IfElse; +import tonkadur.wyrd.v1.compiler.util.IterativeSearch; +import tonkadur.wyrd.v1.compiler.util.CountOccurrences; +  import tonkadur.wyrd.v1.lang.computation.*; @@ -74,6 +81,11 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor     public Ref get_ref ()     { +      if (result_as_ref == null) +      { +         System.err.println("[P] Missing generate_ref()!"); +      } +        return result_as_ref;     } @@ -157,7 +169,23 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor     )     throws Throwable     { -      /* TODO: implement */ +      final ComputationCompiler cc; +      final Type target_type; + +      cc = new ComputationCompiler(compiler); + +      n.get_parent().get_visited_by(cc); + +      target_type = TypeCompiler.compile(compiler, n.get_type()); + +      if (target_type.equals(cc.get_computation().get_type())) +      { +         result_as_computation = cc.get_computation(); +      } +      else +      { +         result_as_computation = new Cast(cc.get_computation(), target_type); +      }     }     @Override @@ -167,7 +195,130 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor     )     throws Throwable     { -      /* TODO: implement */ +      final List<Cons<ComputationCompiler, ComputationCompiler>> cc_list; +      boolean is_safe; + +      cc_list = new ArrayList<Cons<ComputationCompiler, ComputationCompiler>>(); +      is_safe = true; + +      for +      ( +         final Cons +         < +            tonkadur.fate.v1.lang.meta.Computation, +            tonkadur.fate.v1.lang.meta.Computation +         > +         branch: +            n.get_branches() +      ) +      { +         final ComputationCompiler cond_cc, val_cc; + +         cond_cc = new ComputationCompiler(compiler); +         val_cc = new ComputationCompiler(compiler); + +         branch.get_car().get_visited_by(cond_cc); +         branch.get_cdr().get_visited_by(val_cc); + +         is_safe = is_safe && !cond_cc.has_init() && !val_cc.has_init(); + +         reserved_variables.addAll(cond_cc.reserved_variables); +         reserved_variables.addAll(val_cc.reserved_variables); + +         cc_list.add(new Cons(cond_cc, val_cc)); +      } + +      Collections.reverse(cc_list); + +      if (is_safe) +      { +         final Iterator<Cons<ComputationCompiler, ComputationCompiler>> it; + +         it = cc_list.iterator(); + +         result_as_computation = it.next().get_cdr().get_computation(); + +         while (it.hasNext()) +         { +            final Cons<ComputationCompiler, ComputationCompiler> next; + +            next = it.next(); + +            result_as_computation = +               new IfElseComputation +               ( +                  next.get_car().get_computation(), +                  next.get_cdr().get_computation(), +                  result_as_computation +               ); +         } +      } +      else +      { +         final Iterator<Cons<ComputationCompiler, ComputationCompiler>> it; +         final Ref result; +         Cons<ComputationCompiler, ComputationCompiler> next; +         List<Instruction> new_value, new_cond; +         Instruction prev_branch; + + +         it = cc_list.iterator(); +         next = it.next(); + +         result = reserve(next.get_cdr().get_computation().get_type()); + +         new_value = new ArrayList<Instruction>(); + +         if (next.get_cdr().has_init()) +         { +            new_value.add(next.get_cdr().get_init()); +         } + +         new_value.add(new SetValue(result, next.get_cdr().get_computation())); + +         prev_branch = compiler.assembler().merge(new_value); + +         while (it.hasNext()) +         { +            next = it.next(); + +            new_value = new ArrayList<Instruction>(); +            new_cond = new ArrayList<Instruction>(); + +            if (next.get_car().has_init()) +            { +               new_cond.add(next.get_car().get_init()); +            } + +            if (next.get_cdr().has_init()) +            { +               new_value.add(next.get_cdr().get_init()); +            } + +            new_value.add +            ( +               new SetValue(result, next.get_cdr().get_computation()) +            ); + +            new_cond.add +            ( +               IfElse.generate +               ( +                  compiler.anonymous_variables(), +                  compiler.assembler(), +                  next.get_car().get_computation(), +                  compiler.assembler().merge(new_value), +                  prev_branch +               ) +            ); + +            prev_branch = compiler.assembler().merge(new_cond); +         } + +         init_instructions.add(prev_branch); + +         result_as_computation = new ValueOf(result); +      }     }     @Override @@ -192,7 +343,85 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor     )     throws Throwable     { -      /* TODO: implement */ +      final ComputationCompiler collection_compiler, element_compiler; + +      collection_compiler = new ComputationCompiler(compiler); +      element_compiler = new ComputationCompiler(compiler); + +      n.get_collection().get_visited_by(collection_compiler); +      n.get_element().get_visited_by(element_compiler); + +      collection_compiler.generate_ref(); + +      assimilate(collection_compiler); +      assimilate(element_compiler); + +      if +      ( +         ( +            (tonkadur.fate.v1.lang.type.CollectionType) +               n.get_collection().get_type() +         ).is_set() +      ) +      { +         final Ref was_found, index, element; + +         was_found = reserve(Type.BOOLEAN); +         index = reserve(Type.INT); +         element = reserve(element_compiler.get_computation().get_type()); + +         init_instructions.add +         ( +            new SetValue(element, element_compiler.get_computation()) +         ); +         init_instructions.add +         ( +            BinarySearch.generate +            ( +               compiler.anonymous_variables(), +               compiler.assembler(), +               new ValueOf(element), +               new Size(collection_compiler.get_ref()), +               collection_compiler.get_ref(), +               was_found, +               index +            ) +         ); + +         result_as_computation = +            new IfElseComputation +            ( +               new ValueOf(was_found), +               Constant.ONE, +               Constant.ZERO +            ); +      } +      else +      { +         final Ref element; + +         result_as_ref = reserve(Type.INT); + +         element = reserve(element_compiler.get_computation().get_type()); + +         init_instructions.add +         ( +            new SetValue(element, element_compiler.get_computation()) +         ); +         init_instructions.add +         ( +            CountOccurrences.generate +            ( +               compiler.anonymous_variables(), +               compiler.assembler(), +               new ValueOf(element), +               new Size(collection_compiler.get_ref()), +               collection_compiler.get_ref(), +               result_as_ref +            ) +         ); +         result_as_computation = new ValueOf(result_as_ref); +      }     }     @Override @@ -219,9 +448,9 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor              (                 compiler,                 ( -                  (tonkadur.fate.v1.lang.type.RefType) +                  (tonkadur.fate.v1.lang.type.DictType)                       n.get_parent().get_type() -               ).get_referenced_type() +               ).get_field_type(null, n.get_field_name())              )           );     } @@ -333,7 +562,83 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor     )     throws Throwable     { -      /* TODO: implement */ +      final ComputationCompiler collection_compiler, element_compiler; + +      collection_compiler = new ComputationCompiler(compiler); +      element_compiler = new ComputationCompiler(compiler); + +      n.get_collection().get_visited_by(collection_compiler); +      n.get_element().get_visited_by(element_compiler); + +      collection_compiler.generate_ref(); + +      assimilate(collection_compiler); +      assimilate(element_compiler); + +      result_as_ref = reserve(Type.BOOLEAN); + +      if +      ( +         ( +            (tonkadur.fate.v1.lang.type.CollectionType) +               n.get_collection().get_type() +         ).is_set() +      ) +      { +         final Ref index, element; + +         index = reserve(Type.INT); +         element = reserve(element_compiler.get_computation().get_type()); + +         init_instructions.add +         ( +            new SetValue(element, element_compiler.get_computation()) +         ); +         init_instructions.add +         ( +            BinarySearch.generate +            ( +               compiler.anonymous_variables(), +               compiler.assembler(), +               new ValueOf(element), +               new Size(collection_compiler.get_ref()), +               collection_compiler.get_ref(), +               result_as_ref, +               index +            ) +         ); + +         result_as_computation = new ValueOf(result_as_ref); +      } +      else +      { +         final Ref index, element; + +         index = reserve(Type.INT); +         element = reserve(element_compiler.get_computation().get_type()); + +         result_as_ref = reserve(Type.BOOLEAN); + +         init_instructions.add +         ( +            new SetValue(element, element_compiler.get_computation()) +         ); +         init_instructions.add +         ( +            IterativeSearch.generate +            ( +               compiler.anonymous_variables(), +               compiler.assembler(), +               new ValueOf(element), +               new Size(collection_compiler.get_ref()), +               collection_compiler.get_ref(), +               result_as_ref, +               index +            ) +         ); + +         result_as_computation = new ValueOf(result_as_ref); +      }     }     @Override @@ -343,7 +648,32 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor     )     throws Throwable     { -      /* TODO: implement */ +      final List<Ref> parameters; + +      parameters = new ArrayList<Ref>(); + +      for +      ( +         final tonkadur.fate.v1.lang.meta.Computation fate_computation: +            n.get_parameters() +      ) +      { +         final ComputationCompiler cc; + +         cc = new ComputationCompiler(compiler); + +         fate_computation.get_visited_by(cc); + +         cc.generate_ref(); + +         assimilate(cc); + +         parameters.add(cc.get_ref()); +      } + +      compiler.macros().push(n.get_macro(), parameters); +      n.get_actual_value_node().get_visited_by(this); +      compiler.macros().pop();     }     @Override @@ -363,8 +693,270 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor     )     throws Throwable     { -      /* TODO */ -      result_as_computation = new Constant(Type.INT, "0"); +      final String fate_op_name; +      final List<Computation> operands; + +      operands = new ArrayList<Computation>(); + +      for (final tonkadur.fate.v1.lang.meta.Computation x: n.get_operands()) +      { +         final ComputationCompiler cc; + +         cc = new ComputationCompiler(compiler); + +         x.get_visited_by(cc); + +         assimilate(cc); + +         operands.add(cc.get_computation()); +      } + +      fate_op_name = n.get_operator().get_name(); + +      if +      ( +         fate_op_name.equals(tonkadur.fate.v1.lang.computation.Operator.PLUS.get_name()) +      ) +      { +         final Iterator<Computation> operands_it; + +         operands_it = operands.iterator(); + +         result_as_computation = operands_it.next(); + +         while (operands_it.hasNext()) +         { +            result_as_computation = +               Operation.plus(operands_it.next(), result_as_computation); +         } +      } +      else if +      ( +         fate_op_name.equals(tonkadur.fate.v1.lang.computation.Operator.MINUS.get_name()) +      ) +      { +         final Iterator<Computation> operands_it; +         Computation sum; + +         operands_it = operands.iterator(); + +         result_as_computation = operands_it.next(); +         sum = operands_it.next(); + +         while (operands_it.hasNext()) +         { +            sum = Operation.plus(operands_it.next(), sum); +         } + +         result_as_computation = Operation.minus(result_as_computation, sum); +      } +      else if +      ( +         fate_op_name.equals(tonkadur.fate.v1.lang.computation.Operator.TIMES.get_name()) +      ) +      { +         final Iterator<Computation> operands_it; + +         operands_it = operands.iterator(); + +         result_as_computation = operands_it.next(); + +         while (operands_it.hasNext()) +         { +            result_as_computation = +               Operation.times(operands_it.next(), result_as_computation); +         } +      } +      else if +      ( +         fate_op_name.equals +         ( +            tonkadur.fate.v1.lang.computation.Operator.DIVIDE.get_name() +         ) +      ) +      { +         result_as_computation = +            Operation.divide(operands.get(0), operands.get(1)); +      } +      else if +      ( +         fate_op_name.equals +         ( +            tonkadur.fate.v1.lang.computation.Operator.MODULO.get_name() +         ) +      ) +      { +         result_as_computation = +            Operation.modulo(operands.get(0), operands.get(1)); +      } +      else if +      ( +         fate_op_name.equals(tonkadur.fate.v1.lang.computation.Operator.POWER.get_name()) +      ) +      { +         result_as_computation = +            Operation.power(operands.get(0), operands.get(1)); +      } +      else if +      ( +         fate_op_name.equals +         ( +            tonkadur.fate.v1.lang.computation.Operator.RANDOM.get_name() +         ) +      ) +      { +         result_as_computation = +            Operation.rand(operands.get(0), operands.get(1)); +      } +      else if +      ( +         fate_op_name.equals(tonkadur.fate.v1.lang.computation.Operator.AND.get_name()) +      ) +      { +         final Iterator<Computation> operands_it; + +         operands_it = operands.iterator(); + +         result_as_computation = operands_it.next(); + +         while (operands_it.hasNext()) +         { +            result_as_computation = +               Operation.and(operands_it.next(), result_as_computation); +         } +      } +      else if +      ( +         fate_op_name.equals(tonkadur.fate.v1.lang.computation.Operator.OR.get_name()) +      ) +      { +         final Iterator<Computation> operands_it; + +         operands_it = operands.iterator(); + +         result_as_computation = operands_it.next(); + +         while (operands_it.hasNext()) +         { +            result_as_computation = +               Operation.or(operands_it.next(), result_as_computation); +         } +      } +      else if +      ( +         fate_op_name.equals(tonkadur.fate.v1.lang.computation.Operator.NOT.get_name()) +      ) +      { +         result_as_computation = Operation.not(operands.get(0)); +      } +      else if +      ( +         fate_op_name.equals +         ( +            tonkadur.fate.v1.lang.computation.Operator.IMPLIES.get_name() +         ) +      ) +      { +         result_as_computation = +            Operation.implies(operands.get(0), operands.get(1)); +      } +      else if +      ( +         fate_op_name.equals +         ( +            tonkadur.fate.v1.lang.computation.Operator.ONE_IN.get_name() +         ) +      ) +      { +         final Iterator<Computation> operand_it; + +         operand_it = operands.iterator(); + +         result_as_computation = +            new IfElseComputation +            ( +               operand_it.next(), +               Constant.ONE, +               Constant.ZERO +            ); + +         while (operand_it.hasNext()) +         { +            result_as_computation = +               Operation.plus +               ( +                  new IfElseComputation +                  ( +                     operand_it.next(), +                     Constant.ONE, +                     Constant.ZERO +                  ), +                  result_as_computation +               ); +         } + +         result_as_computation = +            Operation.equals(result_as_computation, Constant.ONE); +      } +      else if +      ( +         fate_op_name.equals +         ( +            tonkadur.fate.v1.lang.computation.Operator.EQUALS.get_name() +         ) +      ) +      { +         result_as_computation = +            Operation.equals(operands.get(0), operands.get(1)); +      } +      else if +      ( +         fate_op_name.equals +         ( +            tonkadur.fate.v1.lang.computation.Operator.LOWER_THAN.get_name() +         ) +      ) +      { +         result_as_computation = +            Operation.less_than(operands.get(0), operands.get(1)); +      } +      else if +      ( +         fate_op_name.equals +         ( +            tonkadur.fate.v1.lang.computation.Operator.LOWER_EQUAL_THAN.get_name() +         ) +      ) +      { +         result_as_computation = +            Operation.less_equal_than(operands.get(0), operands.get(1)); +      } +      else if +      ( +         fate_op_name.equals +         ( +            tonkadur.fate.v1.lang.computation.Operator.GREATER_EQUAL_THAN.get_name() +         ) +      ) +      { +         result_as_computation = +            Operation.greater_equal_than(operands.get(0), operands.get(1)); +      } +      else if +      ( +         fate_op_name.equals +         ( +            tonkadur.fate.v1.lang.computation.Operator.GREATER_THAN.get_name() +         ) +      ) +      { +         result_as_computation = +            Operation.greater_than(operands.get(0), operands.get(1)); +      } +      else +      { +         System.err.println("[P] Unknown Fate operator '" + fate_op_name+ "'."); +      }     }     @Override @@ -479,7 +1071,7 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor        n.get_value().get_visited_by(this);        result_as_computation = -         new RichText(Collections.singletonList(result_as_computation)); +         new RichText(Collections.singletonList(get_computation()));     }     @Override 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 8ed0c87..d0b3711 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 @@ -631,6 +631,8 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor           fate_computation.get_visited_by(cc); +         cc.generate_ref(); +           if (cc.has_init())           {              result.add(cc.get_init()); 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 index 7cb839a..085524a 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/MacroManager.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/MacroManager.java @@ -39,12 +39,27 @@ public class MacroManager        while (pri.hasNext())        { -         parameters.put(pre.next().get_name(), pri.next()); +         final String name; + +         name = pre.next().get_name(); + +         parameters.put(name, pri.next());        } + +      context_stack.push(parameters);     }     public Ref get_parameter_ref (final String parameter)     { -      return context_stack.peek().get(parameter); +      final Ref result; + +      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/SequenceCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/SequenceCompiler.java index 8e12966..b397dd2 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/SequenceCompiler.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/SequenceCompiler.java @@ -24,6 +24,13 @@ public class SequenceCompiler        compiler.assembler().add_fixed_name_label(fate_sequence.get_name()); +      System.out.println +      ( +         "[D] Compiling sequence '" +         + fate_sequence.get_name() +         + "'..." +      ); +        fate_sequence.get_root().get_visited_by(ic);        compiler.world().add_sequence_label @@ -54,6 +61,8 @@ public class SequenceCompiler        ic = new InstructionCompiler(compiler); +      System.out.println("[D] Compiling main sequence..."); +        for        (           final tonkadur.fate.v1.lang.meta.Instruction fate_instruction: 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 bedf5e1..4a8ee82 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/util/AnonymousVariableManager.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/util/AnonymousVariableManager.java @@ -34,8 +34,10 @@ public class AnonymousVariableManager     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); @@ -59,15 +61,13 @@ public class AnonymousVariableManager           }        } -      new_variable = -         new Variable -         ( -            (name_prefix + Integer.toString(generated_variables)), -            "local", -            t -         ); +      name = (name_prefix + Integer.toString(generated_variables++)); +      new_variable = new Variable(name, "local", t); +      status = new Cons(Boolean.TRUE, new_variable); -      list.add(new Cons(Boolean.TRUE, new_variable)); +      list.add(status); + +      by_name.put(name, status);        return new_variable.get_ref();     } @@ -77,10 +77,16 @@ public class AnonymousVariableManager        final Computation c;        final String name; -      c = r.get_accesses().get(0); +      c = r.get_address();        if (!(c instanceof Constant))        { +         System.err.println +         ( +            "[P] Anonymous Variable '" +            + r.toString() +            + "' is not at constant address." +         );           /* TODO: error */           return; diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/util/BinarySearch.java b/src/core/src/tonkadur/wyrd/v1/compiler/util/BinarySearch.java index b6e7a4b..f2c8572 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/util/BinarySearch.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/util/BinarySearch.java @@ -105,17 +105,13 @@ public class BinarySearch        value_of_midval = new ValueOf(midval);        result.add(new SetValue(result_was_found, Constant.FALSE)); -      result.add(new SetValue(bot, new Constant(Type.INT, "0"))); +      result.add(new SetValue(bot, Constant.ZERO));        result.add        (           new SetValue           (              top, -            Operation.minus -            ( -               collection_size, -               new Constant(Type.INT, "1") -            ) +            Operation.minus(collection_size, Constant.ONE)           )        ); @@ -202,11 +198,7 @@ public class BinarySearch              new SetValue              (                 bot, -               Operation.plus -               ( -                  value_of_result_index, -                  new Constant(Type.INT, "1") -               ) +               Operation.plus(value_of_result_index, Constant.ONE)              ),              IfElse.generate              ( @@ -216,11 +208,7 @@ public class BinarySearch                 new SetValue                 (                    top, -                  Operation.minus -                  ( -                     value_of_result_index, -                     new Constant(Type.INT, "1") -                  ) +                  Operation.minus(value_of_result_index, Constant.ONE)                 ),                 new SetValue(result_was_found, Constant.TRUE)              ) diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/util/Clear.java b/src/core/src/tonkadur/wyrd/v1/compiler/util/Clear.java index d63e8fb..f28f229 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/util/Clear.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/util/Clear.java @@ -70,7 +70,7 @@ public class Clear           new SetValue           (              iterator, -            Operation.minus(value_of_iterator, new Constant(Type.INT, "1")) +            Operation.minus(value_of_iterator, Constant.ONE)           )        ); @@ -94,11 +94,7 @@ public class Clear           (              anonymous_variables,              assembler, -            Operation.greater_than -            ( -               value_of_iterator, -               new Constant(Type.INT, "0") -            ), +            Operation.greater_than(value_of_iterator, Constant.ZERO),              assembler.merge(while_body)           )        ); diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/util/CountOccurrences.java b/src/core/src/tonkadur/wyrd/v1/compiler/util/CountOccurrences.java new file mode 100644 index 0000000..5987c61 --- /dev/null +++ b/src/core/src/tonkadur/wyrd/v1/compiler/util/CountOccurrences.java @@ -0,0 +1,110 @@ +package tonkadur.wyrd.v1.compiler.util; + +import java.util.List; +import java.util.ArrayList; + +import tonkadur.wyrd.v1.lang.type.Type; + +import tonkadur.wyrd.v1.lang.meta.Computation; +import tonkadur.wyrd.v1.lang.meta.Instruction; + +import tonkadur.wyrd.v1.lang.computation.Cast; +import tonkadur.wyrd.v1.lang.computation.Constant; +import tonkadur.wyrd.v1.lang.computation.Operation; +import tonkadur.wyrd.v1.lang.computation.Ref; +import tonkadur.wyrd.v1.lang.computation.RelativeRef; +import tonkadur.wyrd.v1.lang.computation.ValueOf; + +import tonkadur.wyrd.v1.lang.instruction.SetValue; + +public class CountOccurrences +{ + +   /* Utility Class */ +   private CountOccurrences () {} + +   /* +    * (Computation <E> target) +    * (Computation int collection_size) +    * (declare_variable global <List E> collection) +    * (declare_variable global int count) +    * +    * (declare_variable int .index) +    * +    * (set count 0) +    * (set .index collection_size) +    * +    * <while (> (var .index) 0) +    *    (set .index (- (var index) 1)) +    *    <if +    *       (= (var collection[.index]) target) +    * +    *       (set count (+ (var count) 1)) +    *    > +    * > +    */ +   public static Instruction generate +   ( +      final AnonymousVariableManager anonymous_variables, +      final InstructionManager assembler, +      final Computation target, +      final Computation collection_size, +      final Ref collection, +      final Ref count +   ) +   { +      final List<Instruction> result, while_body; +      final Type target_type; +      final Ref index; +      final Computation value_of_index; + +      result = new ArrayList<Instruction>(); +      while_body = new ArrayList<Instruction>(); + +      target_type = target.get_type(); + +      index = anonymous_variables.reserve(Type.INT); + +      value_of_index = new ValueOf(index); + +      result.add(new SetValue(count, Constant.ZERO)); +      result.add(new SetValue(index, collection_size)); + +      while_body.add(new SetValue(index, Operation.minus(index, Constant.ONE))); +      while_body.add +      ( +         If.generate +         ( +            anonymous_variables, +            assembler, +            Operation.equals +            ( +               new ValueOf +               ( +                  new RelativeRef +                  ( +                     collection, +                     new Cast(value_of_index, Type.STRING), +                     target_type +                  ) +               ), +               target +            ), +            new SetValue(count, Operation.plus(count, Constant.ONE)) +         ) +      ); + +      result.add +      ( +         While.generate +         ( +            anonymous_variables, +            assembler, +            Operation.greater_than(value_of_index, Constant.ZERO), +            assembler.merge(while_body) +         ) +      ); + +      return assembler.merge(result); +   } +} diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/util/IfElse.java b/src/core/src/tonkadur/wyrd/v1/compiler/util/IfElse.java index b52bffc..a4ac2e2 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/util/IfElse.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/util/IfElse.java @@ -63,14 +63,6 @@ public class IfElse              if_false_label           )        ); -      result.add -      ( -         assembler.mark_after -         ( -            new SetPC(assembler.get_label_constant(end_label)), -            if_false_label -         ) -      );        result.add(assembler.mark_after(if_false, end_label));        return assembler.merge(result); diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/util/InsertAt.java b/src/core/src/tonkadur/wyrd/v1/compiler/util/InsertAt.java index 5484e8a..48debc0 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/util/InsertAt.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/util/InsertAt.java @@ -77,11 +77,7 @@ public class InsertAt        /* (set .prev (- (val .end) 1)) */        while_body.add        ( -         new SetValue -         ( -            prev, -            Operation.minus(value_of_end, new Constant(Type.INT, "1")) -         ) +         new SetValue(prev, Operation.minus(value_of_end, Constant.ONE))        );        /* (set collection[.end] (val collection[.prev])) */ @@ -123,7 +119,7 @@ public class InsertAt           (              anonymous_variables,              assembler, -            Operation.minus(value_of_index, value_of_end), +            Operation.greater_than(value_of_index, value_of_end),              assembler.merge(while_body)           )        ); diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/util/InstructionManager.java b/src/core/src/tonkadur/wyrd/v1/compiler/util/InstructionManager.java index 74fe200..bac8d8a 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/util/InstructionManager.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/util/InstructionManager.java @@ -177,6 +177,11 @@ public class InstructionManager     protected void register_label (final String name, final Integer location)     { +      if (label_locations.containsKey(name)) +      { +         System.err.println("[P] Multiple locations for label '" + name + "'"); +      } +        label_locations.put(name, location);        for (final Label label: unresolved_labels.get(name)) diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/util/IterativeSearch.java b/src/core/src/tonkadur/wyrd/v1/compiler/util/IterativeSearch.java index dabec5a..4098b19 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/util/IterativeSearch.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/util/IterativeSearch.java @@ -76,7 +76,7 @@ public class IterativeSearch           new SetValue           (              result_index, -            Operation.minus(collection_size, new Constant(Type.INT, "0")) +            Operation.minus(collection_size, Constant.ONE)           )        ); @@ -92,7 +92,7 @@ public class IterativeSearch                 Operation.greater_equal_than                 (                    value_of_result_index, -                  new Constant(Type.INT, "0") +                  Constant.ZERO                 )              ),              /* @@ -125,11 +125,7 @@ public class IterativeSearch                 new SetValue                 (                    result_index, -                  Operation.minus -                  ( -                     value_of_result_index, -                     new Constant(Type.INT, "1") -                  ) +                  Operation.minus(value_of_result_index, Constant.ONE)                 )              )           ) diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/util/RemoveAllOf.java b/src/core/src/tonkadur/wyrd/v1/compiler/util/RemoveAllOf.java index bd9bb1e..bd30ff1 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/util/RemoveAllOf.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/util/RemoveAllOf.java @@ -74,7 +74,7 @@ public class RemoveAllOf        final Type element_type;        final Ref index, found, end;        final Computation value_of_index, value_of_found, value_of_end; -      final Computation const_0, const_1, value_of_found_greater_than_0; +      final Computation value_of_found_greater_than_0;        final Ref collection_at_index;        result = new ArrayList<Instruction>(); @@ -94,11 +94,8 @@ public class RemoveAllOf        value_of_found = new ValueOf(found);        value_of_end = new ValueOf(end); -      const_0 = new Constant(Type.INT, "0"); -      const_1 = new Constant(Type.INT, "1"); -        value_of_found_greater_than_0 = -         Operation.greater_than(value_of_found, const_0); +         Operation.greater_than(value_of_found, Constant.ZERO);        collection_at_index =           new RelativeRef @@ -109,14 +106,14 @@ public class RemoveAllOf           );        /* (set .index 0) */ -      result.add(new SetValue(index, const_0)); +      result.add(new SetValue(index, Constant.ZERO));        /* (set .found 0) */ -      result.add(new SetValue(found, const_0)); +      result.add(new SetValue(found, Constant.ZERO));        /* (set .end (- (collection_size) 1) */        result.add        ( -         new SetValue(end, Operation.minus(collection_size, const_1)) +         new SetValue(end, Operation.minus(collection_size, Constant.ONE))        );        /* @@ -127,11 +124,11 @@ public class RemoveAllOf         */        if_false_true_body.add        ( -         new SetValue(found, Operation.plus(value_of_found, const_1)) +         new SetValue(found, Operation.plus(value_of_found, Constant.ONE))        );        if_false_true_body.add        ( -         new SetValue(found, Operation.minus(value_of_found, const_1)) +         new SetValue(found, Operation.minus(value_of_found, Constant.ONE))        );        if_false_body.add @@ -182,7 +179,7 @@ public class RemoveAllOf        while_body0.add        ( -         new SetValue(index, Operation.plus(value_of_index, const_1)) +         new SetValue(index, Operation.plus(value_of_index, Constant.ONE))        );        result.add @@ -214,7 +211,7 @@ public class RemoveAllOf        );        while_body1.add        ( -         new SetValue(found, Operation.minus(value_of_found, const_1)) +         new SetValue(found, Operation.minus(value_of_found, Constant.ONE))        );        result.add diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/util/RemoveAt.java b/src/core/src/tonkadur/wyrd/v1/compiler/util/RemoveAt.java index 050a8c6..55f5f02 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/util/RemoveAt.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/util/RemoveAt.java @@ -57,7 +57,6 @@ public class RemoveAt        final Ref next, end;        final Computation value_of_index;        final Computation value_of_next, value_of_end; -      final Computation const_1;        final Ref collection_at_index;        result = new ArrayList<Instruction>(); @@ -74,8 +73,6 @@ public class RemoveAt        value_of_next = new ValueOf(next);        value_of_end = new ValueOf(end); -      const_1 = new Constant(Type.INT, "1"); -        collection_at_index =           new RelativeRef           ( @@ -87,13 +84,13 @@ public class RemoveAt        /* (set .end (- (collection_size) 1) */        result.add        ( -         new SetValue(end, Operation.minus(collection_size, const_1)) +         new SetValue(end, Operation.minus(collection_size, Constant.ONE))        );        /* (set .next (+ (val index) 1)) */        while_body.add        ( -         new SetValue(next, Operation.plus(value_of_end, const_1)) +         new SetValue(next, Operation.plus(value_of_end, Constant.ONE))        );        /* (set collection[index] (val collection[.next])) */ diff --git a/src/core/src/tonkadur/wyrd/v1/lang/World.java b/src/core/src/tonkadur/wyrd/v1/lang/World.java index 48edd73..39e6485 100644 --- a/src/core/src/tonkadur/wyrd/v1/lang/World.java +++ b/src/core/src/tonkadur/wyrd/v1/lang/World.java @@ -78,4 +78,9 @@ public class World     {        return new Integer(code.size());     } + +   public List<Instruction> get_code () +   { +      return code; +   }  } diff --git a/src/core/src/tonkadur/wyrd/v1/lang/computation/AddRichTextEffect.java b/src/core/src/tonkadur/wyrd/v1/lang/computation/AddRichTextEffect.java index 74f967a..e159b5f 100644 --- a/src/core/src/tonkadur/wyrd/v1/lang/computation/AddRichTextEffect.java +++ b/src/core/src/tonkadur/wyrd/v1/lang/computation/AddRichTextEffect.java @@ -41,4 +41,34 @@ public class AddRichTextEffect extends RichText     {        return effect_parameters;     } + +   /**** Misc. ****************************************************************/ +   @Override +   public String toString () +   { +      final StringBuilder sb; + +      sb = new StringBuilder(); + +      sb.append("(AddRichTextEffect ("); +      sb.append(effect_name); + +      for (final Computation param: effect_parameters) +      { +         sb.append(" "); +         sb.append(param.toString()); +      } + +      sb.append(")"); + +      for (final Computation text: content) +      { +         sb.append(" "); +         sb.append(text.toString()); +      } + +      sb.append(")"); + +      return sb.toString(); +   }  } diff --git a/src/core/src/tonkadur/wyrd/v1/lang/computation/Cast.java b/src/core/src/tonkadur/wyrd/v1/lang/computation/Cast.java index a84e77e..8235dfb 100644 --- a/src/core/src/tonkadur/wyrd/v1/lang/computation/Cast.java +++ b/src/core/src/tonkadur/wyrd/v1/lang/computation/Cast.java @@ -27,4 +27,21 @@ public class Cast extends Computation     {        return parent;     } + +   /**** Misc. ****************************************************************/ +   @Override +   public String toString () +   { +      final StringBuilder sb; + +      sb = new StringBuilder(); + +      sb.append("(Cast "); +      sb.append(parent.toString()); +      sb.append(" "); +      sb.append(type.toString()); +      sb.append(")"); + +      return sb.toString(); +   }  } diff --git a/src/core/src/tonkadur/wyrd/v1/lang/computation/Constant.java b/src/core/src/tonkadur/wyrd/v1/lang/computation/Constant.java index c54923d..e871ecc 100644 --- a/src/core/src/tonkadur/wyrd/v1/lang/computation/Constant.java +++ b/src/core/src/tonkadur/wyrd/v1/lang/computation/Constant.java @@ -9,10 +9,16 @@ public class Constant extends Computation     public static final Constant TRUE;     public static final Constant FALSE; +   public static final Constant ZERO; +   public static final Constant ONE; +     static     {        TRUE = new Constant(Type.BOOLEAN, "true");        FALSE = new Constant(Type.BOOLEAN, "false"); + +      ZERO = new Constant(Type.INT, "0"); +      ONE = new Constant(Type.INT, "1");     }     /***************************************************************************/ @@ -36,4 +42,21 @@ public class Constant extends Computation     {        return as_string;     } + +   /**** Misc. ****************************************************************/ +   @Override +   public String toString () +   { +      final StringBuilder sb; + +      sb = new StringBuilder(); + +      sb.append("(Constant "); +      sb.append(type.toString()); +      sb.append(" "); +      sb.append(get_as_string()); +      sb.append(")"); + +      return sb.toString(); +   }  } diff --git a/src/core/src/tonkadur/wyrd/v1/lang/computation/IfElseComputation.java b/src/core/src/tonkadur/wyrd/v1/lang/computation/IfElseComputation.java index ef3cf06..6848251 100644 --- a/src/core/src/tonkadur/wyrd/v1/lang/computation/IfElseComputation.java +++ b/src/core/src/tonkadur/wyrd/v1/lang/computation/IfElseComputation.java @@ -46,4 +46,23 @@ public class IfElseComputation extends Computation     {        return if_false;     } + +   /**** Misc. ****************************************************************/ +   @Override +   public String toString () +   { +      final StringBuilder sb; + +      sb = new StringBuilder(); + +      sb.append("(IfElse "); +      sb.append(condition.toString()); +      sb.append(" "); +      sb.append(if_true.toString()); +      sb.append(" "); +      sb.append(if_false.toString()); +      sb.append(")"); + +      return sb.toString(); +   }  } diff --git a/src/core/src/tonkadur/wyrd/v1/lang/computation/New.java b/src/core/src/tonkadur/wyrd/v1/lang/computation/New.java index e7b3ba1..552362f 100644 --- a/src/core/src/tonkadur/wyrd/v1/lang/computation/New.java +++ b/src/core/src/tonkadur/wyrd/v1/lang/computation/New.java @@ -29,4 +29,19 @@ public class New extends Computation     {        return target_type;     } + +   /**** Misc. ****************************************************************/ +   @Override +   public String toString () +   { +      final StringBuilder sb; + +      sb = new StringBuilder(); + +      sb.append("(New "); +      sb.append(target_type.toString()); +      sb.append(")"); + +      return sb.toString(); +   }  } diff --git a/src/core/src/tonkadur/wyrd/v1/lang/computation/Newline.java b/src/core/src/tonkadur/wyrd/v1/lang/computation/Newline.java index bd3fbe5..2cffe91 100644 --- a/src/core/src/tonkadur/wyrd/v1/lang/computation/Newline.java +++ b/src/core/src/tonkadur/wyrd/v1/lang/computation/Newline.java @@ -16,4 +16,11 @@ public class Newline extends RichText     {        super(new ArrayList());     } + +   /**** Misc. ****************************************************************/ +   @Override +   public String toString () +   { +      return "(Newline)"; +   }  } diff --git a/src/core/src/tonkadur/wyrd/v1/lang/computation/Operation.java b/src/core/src/tonkadur/wyrd/v1/lang/computation/Operation.java index 6d6f6d6..78cac66 100644 --- a/src/core/src/tonkadur/wyrd/v1/lang/computation/Operation.java +++ b/src/core/src/tonkadur/wyrd/v1/lang/computation/Operation.java @@ -11,6 +11,7 @@ public class Operation extends Computation     /* Math operations *********************************************************/     public static final String DIVIDE = "divide";     public static final String MINUS = "minus"; +   public static final String MODULO = "modulo";     public static final String PLUS = "plus";     public static final String POWER = "power";     public static final String RAND = "rand"; @@ -18,16 +19,11 @@ public class Operation extends Computation     /* Logic operations ********************************************************/     public static final String AND = "and"; -   public static final String OR = "or";     public static final String NOT = "not"; -   public static final String IMPLIES = "implies";     /* Comparison operations ***************************************************/     public static final String LESS_THAN = "less_than"; -   public static final String LESS_EQUAL_THAN = "less_equal_than";     public static final String EQUALS = "equals"; -   public static final String GREATER_EQUAL_THAN = "greater_equal_than"; -   public static final String GREATER_THAN = "greather_than";     public static Operation divide     ( @@ -47,6 +43,15 @@ public class Operation extends Computation        return new Operation(MINUS, param_a.get_type(), param_a, param_b);     } +   public static Operation modulo +   ( +      final Computation param_a, +      final Computation param_b +   ) +   { +      return new Operation(MODULO, param_a.get_type(), param_a, param_b); +   } +     public static Operation plus     (        final Computation param_a, @@ -86,79 +91,79 @@ public class Operation extends Computation     /* Logic operations ********************************************************/     public static Operation and     ( -      final Computation param_a, -      final Computation param_b +      final Computation a, +      final Computation b     )     { -      return new Operation(AND, Type.BOOLEAN, param_a, param_b); +      return new Operation(AND, Type.BOOLEAN, a, b);     }     public static Operation or     ( -      final Computation param_a, -      final Computation param_b +      final Computation a, +      final Computation b     )     { -      return new Operation(OR, Type.BOOLEAN, param_a, param_b); +      return not(and(not(a), not(b)));     } -   public static Operation not (final Computation param_a) +   public static Operation not (final Computation a)     { -      return new Operation(NOT, Type.BOOLEAN, param_a, null); +      return new Operation(NOT, Type.BOOLEAN, a, null);     }     public static Operation implies     ( -      final Computation param_a, -      final Computation param_b +      final Computation a, +      final Computation b     )     { -      return new Operation(IMPLIES, Type.BOOLEAN, param_a, param_b); +      return not(and(a, not(b)));     }     /* Comparison operations ***************************************************/     public static Operation less_than     ( -      final Computation param_a, -      final Computation param_b +      final Computation a, +      final Computation b     )     { -      return new Operation(LESS_THAN, Type.BOOLEAN, param_a, param_b); +      return new Operation(LESS_THAN, Type.BOOLEAN, a, b);     }     public static Operation less_equal_than     ( -      final Computation param_a, -      final Computation param_b +      final Computation a, +      final Computation b     )     { -      return new Operation(LESS_EQUAL_THAN, Type.BOOLEAN, param_a, param_b); +      return or(less_than(a, b), equals(a, b));     }     public static Operation equals     ( -      final Computation param_a, -      final Computation param_b +      final Computation a, +      final Computation b     )     { -      return new Operation(EQUALS, Type.BOOLEAN, param_a, param_b); +      return new Operation(EQUALS, Type.BOOLEAN, a, b);     }     public static Operation greater_than     ( -      final Computation param_a, -      final Computation param_b +      final Computation a, +      final Computation b     )     { -      return new Operation(GREATER_THAN, Type.BOOLEAN, param_a, param_b); +      return less_than(b, a);     }     public static Operation greater_equal_than     ( -      final Computation param_a, -      final Computation param_b +      final Computation a, +      final Computation b     )     { -      return new Operation(GREATER_EQUAL_THAN, Type.BOOLEAN, param_a, param_b); +      return or(greater_than(a, b), Operation.equals(a, b));     }     /***************************************************************************/ @@ -197,4 +202,28 @@ public class Operation extends Computation     {        return param_b;     } + +   /**** Misc. ****************************************************************/ +   @Override +   public String toString () +   { +      final StringBuilder sb; + +      sb = new StringBuilder(); + +      sb.append("("); +      sb.append(operator); +      sb.append(" "); +      sb.append(param_a.toString()); + +      if (param_b != null) +      { +         sb.append(" "); +         sb.append(param_b.toString()); +      } + +      sb.append(")"); + +      return sb.toString(); +   }  } diff --git a/src/core/src/tonkadur/wyrd/v1/lang/computation/Ref.java b/src/core/src/tonkadur/wyrd/v1/lang/computation/Ref.java index 006a2ea..c303288 100644 --- a/src/core/src/tonkadur/wyrd/v1/lang/computation/Ref.java +++ b/src/core/src/tonkadur/wyrd/v1/lang/computation/Ref.java @@ -34,4 +34,19 @@ public class Ref extends Computation     {        return target_type;     } + +   /**** Misc. ****************************************************************/ +   @Override +   public String toString () +   { +      final StringBuilder sb; + +      sb = new StringBuilder(); + +      sb.append("(Ref "); +      sb.append(address.toString()); +      sb.append(")"); + +      return sb.toString(); +   }  } diff --git a/src/core/src/tonkadur/wyrd/v1/lang/computation/RelativeRef.java b/src/core/src/tonkadur/wyrd/v1/lang/computation/RelativeRef.java index 2ab63cc..56f8281 100644 --- a/src/core/src/tonkadur/wyrd/v1/lang/computation/RelativeRef.java +++ b/src/core/src/tonkadur/wyrd/v1/lang/computation/RelativeRef.java @@ -9,7 +9,7 @@ public class RelativeRef extends Ref     /***************************************************************************/     /**** MEMBERS **************************************************************/     /***************************************************************************/ -   protected final Ref parent; +   protected final Computation member;     /***************************************************************************/     /**** PUBLIC ***************************************************************/ @@ -22,14 +22,31 @@ public class RelativeRef extends Ref        final Type target_type     )     { -      super(member, target_type); +      super(parent, target_type); -      this.parent = parent; +      this.member = member;     }     /**** Accessors ************************************************************/ -   public Ref get_parent () +   public Computation get_member ()     { -      return parent; +      return member; +   } + +   /**** Misc. ****************************************************************/ +   @Override +   public String toString () +   { +      final StringBuilder sb; + +      sb = new StringBuilder(); + +      sb.append("(RelativeRef "); +      sb.append(address.toString()); +      sb.append("."); +      sb.append(member.toString()); +      sb.append(")"); + +      return sb.toString();     }  } diff --git a/src/core/src/tonkadur/wyrd/v1/lang/computation/RichText.java b/src/core/src/tonkadur/wyrd/v1/lang/computation/RichText.java index a82b7ab..3a0d3e8 100644 --- a/src/core/src/tonkadur/wyrd/v1/lang/computation/RichText.java +++ b/src/core/src/tonkadur/wyrd/v1/lang/computation/RichText.java @@ -29,4 +29,31 @@ public class RichText extends Computation     {        return content;     } + +   /**** Misc. ****************************************************************/ +   @Override +   public String toString () +   { +      final StringBuilder sb; + +      sb = new StringBuilder(); + +      sb.append("(RichText "); + +      for (final Computation text: content) +      { +         if (text == null) +         { +            sb.append("<null?!>"); +         } +         else +         { +            sb.append(text.toString()); +         } +      } + +      sb.append(")"); + +      return sb.toString(); +   }  } diff --git a/src/core/src/tonkadur/wyrd/v1/lang/computation/Size.java b/src/core/src/tonkadur/wyrd/v1/lang/computation/Size.java index 5559d0a..ff41060 100644 --- a/src/core/src/tonkadur/wyrd/v1/lang/computation/Size.java +++ b/src/core/src/tonkadur/wyrd/v1/lang/computation/Size.java @@ -27,4 +27,19 @@ public class Size extends Computation     {        return collection;     } + +   /**** Misc. ****************************************************************/ +   @Override +   public String toString () +   { +      final StringBuilder sb; + +      sb = new StringBuilder(); + +      sb.append("(Size "); +      sb.append(collection.toString()); +      sb.append(")"); + +      return sb.toString(); +   }  } diff --git a/src/core/src/tonkadur/wyrd/v1/lang/computation/ValueOf.java b/src/core/src/tonkadur/wyrd/v1/lang/computation/ValueOf.java index c48c4e5..f8abf6b 100644 --- a/src/core/src/tonkadur/wyrd/v1/lang/computation/ValueOf.java +++ b/src/core/src/tonkadur/wyrd/v1/lang/computation/ValueOf.java @@ -34,4 +34,19 @@ public class ValueOf extends Computation     {        return parent;     } + +   /**** Misc. ****************************************************************/ +   @Override +   public String toString () +   { +      final StringBuilder sb; + +      sb = new StringBuilder(); + +      sb.append("(ValueOf "); +      sb.append(parent.toString()); +      sb.append(")"); + +      return sb.toString(); +   }  } diff --git a/src/core/src/tonkadur/wyrd/v1/lang/instruction/AddChoice.java b/src/core/src/tonkadur/wyrd/v1/lang/instruction/AddChoice.java index 8353b4e..4f33f8c 100644 --- a/src/core/src/tonkadur/wyrd/v1/lang/instruction/AddChoice.java +++ b/src/core/src/tonkadur/wyrd/v1/lang/instruction/AddChoice.java @@ -31,4 +31,21 @@ public class AddChoice extends Instruction     {        return effect;     } + +   /**** Misc. ****************************************************************/ +   @Override +   public String toString () +   { +      final StringBuilder sb; + +      sb = new StringBuilder(); + +      sb.append("(AddChoice "); +      sb.append(label.toString()); +      sb.append(" "); +      sb.append(effect.toString()); +      sb.append(")"); + +      return sb.toString(); +   }  } diff --git a/src/core/src/tonkadur/wyrd/v1/lang/instruction/Assert.java b/src/core/src/tonkadur/wyrd/v1/lang/instruction/Assert.java index 2ec3869..393494c 100644 --- a/src/core/src/tonkadur/wyrd/v1/lang/instruction/Assert.java +++ b/src/core/src/tonkadur/wyrd/v1/lang/instruction/Assert.java @@ -24,4 +24,19 @@ public class Assert extends Instruction     {        return condition;     } + +   /**** Misc. ****************************************************************/ +   @Override +   public String toString () +   { +      final StringBuilder sb; + +      sb = new StringBuilder(); + +      sb.append("(Assert "); +      sb.append(condition.toString()); +      sb.append(")"); + +      return sb.toString(); +   }  } diff --git a/src/core/src/tonkadur/wyrd/v1/lang/instruction/Display.java b/src/core/src/tonkadur/wyrd/v1/lang/instruction/Display.java index 0256416..81ef31f 100644 --- a/src/core/src/tonkadur/wyrd/v1/lang/instruction/Display.java +++ b/src/core/src/tonkadur/wyrd/v1/lang/instruction/Display.java @@ -24,4 +24,19 @@ public class Display extends Instruction     {        return content;     } + +   /**** Misc. ****************************************************************/ +   @Override +   public String toString () +   { +      final StringBuilder sb; + +      sb = new StringBuilder(); + +      sb.append("(Display "); +      sb.append(content.toString()); +      sb.append(")"); + +      return sb.toString(); +   }  } diff --git a/src/core/src/tonkadur/wyrd/v1/lang/instruction/EventCall.java b/src/core/src/tonkadur/wyrd/v1/lang/instruction/EventCall.java index 0dabde8..4f27f35 100644 --- a/src/core/src/tonkadur/wyrd/v1/lang/instruction/EventCall.java +++ b/src/core/src/tonkadur/wyrd/v1/lang/instruction/EventCall.java @@ -33,4 +33,26 @@ public class EventCall extends Instruction     {        return parameters;     } + +   /**** Misc. ****************************************************************/ +   @Override +   public String toString () +   { +      final StringBuilder sb; + +      sb = new StringBuilder(); + +      sb.append("(EventCall "); +      sb.append(name); + +      for (final Computation param: parameters) +      { +         sb.append(" "); +         sb.append(param.toString()); +      } + +      sb.append(")"); + +      return sb.toString(); +   }  } diff --git a/src/core/src/tonkadur/wyrd/v1/lang/instruction/Remove.java b/src/core/src/tonkadur/wyrd/v1/lang/instruction/Remove.java index f6c3aaf..28a2046 100644 --- a/src/core/src/tonkadur/wyrd/v1/lang/instruction/Remove.java +++ b/src/core/src/tonkadur/wyrd/v1/lang/instruction/Remove.java @@ -25,4 +25,19 @@ public class Remove extends Instruction     {        return reference;     } + +   /**** Misc. ****************************************************************/ +   @Override +   public String toString () +   { +      final StringBuilder sb; + +      sb = new StringBuilder(); + +      sb.append("(Remove "); +      sb.append(reference.toString()); +      sb.append(")"); + +      return sb.toString(); +   }  } diff --git a/src/core/src/tonkadur/wyrd/v1/lang/instruction/ResolveChoices.java b/src/core/src/tonkadur/wyrd/v1/lang/instruction/ResolveChoices.java index 9963a05..e0f13c1 100644 --- a/src/core/src/tonkadur/wyrd/v1/lang/instruction/ResolveChoices.java +++ b/src/core/src/tonkadur/wyrd/v1/lang/instruction/ResolveChoices.java @@ -15,4 +15,11 @@ public class ResolveChoices extends Instruction     public ResolveChoices ()     {     } + +   /**** Misc. ****************************************************************/ +   @Override +   public String toString () +   { +      return "(ResolveChoices)"; +   }  } diff --git a/src/core/src/tonkadur/wyrd/v1/lang/instruction/SetPC.java b/src/core/src/tonkadur/wyrd/v1/lang/instruction/SetPC.java index 1ed71c6..d02fcfd 100644 --- a/src/core/src/tonkadur/wyrd/v1/lang/instruction/SetPC.java +++ b/src/core/src/tonkadur/wyrd/v1/lang/instruction/SetPC.java @@ -24,4 +24,19 @@ public class SetPC extends Instruction     {        return value;     } + +   /**** Misc. ****************************************************************/ +   @Override +   public String toString () +   { +      final StringBuilder sb; + +      sb = new StringBuilder(); + +      sb.append("(SetPC "); +      sb.append(value.toString()); +      sb.append(")"); + +      return sb.toString(); +   }  } diff --git a/src/core/src/tonkadur/wyrd/v1/lang/instruction/SetValue.java b/src/core/src/tonkadur/wyrd/v1/lang/instruction/SetValue.java index 783be4c..35656d7 100644 --- a/src/core/src/tonkadur/wyrd/v1/lang/instruction/SetValue.java +++ b/src/core/src/tonkadur/wyrd/v1/lang/instruction/SetValue.java @@ -33,4 +33,21 @@ public class SetValue extends Instruction     {        return value;     } + +   /**** Misc. ****************************************************************/ +   @Override +   public String toString () +   { +      final StringBuilder sb; + +      sb = new StringBuilder(); + +      sb.append("(SetValue "); +      sb.append(reference.toString()); +      sb.append(" "); +      sb.append(value.toString()); +      sb.append(")"); + +      return sb.toString(); +   }  } diff --git a/src/core/src/tonkadur/wyrd/v1/lang/type/DictType.java b/src/core/src/tonkadur/wyrd/v1/lang/type/DictType.java index 064e412..239fa0c 100644 --- a/src/core/src/tonkadur/wyrd/v1/lang/type/DictType.java +++ b/src/core/src/tonkadur/wyrd/v1/lang/type/DictType.java @@ -17,4 +17,18 @@ public class DictType extends Type     {        return fields;     } + +   @Override +   public String toString () +   { +      final StringBuilder sb; + +      sb = new StringBuilder(); + +      sb.append("(DictType "); +      sb.append(name); +      sb.append(")"); + +      return sb.toString(); +   }  } diff --git a/src/core/src/tonkadur/wyrd/v1/lang/type/MapType.java b/src/core/src/tonkadur/wyrd/v1/lang/type/MapType.java index c80a78a..a8d79b4 100644 --- a/src/core/src/tonkadur/wyrd/v1/lang/type/MapType.java +++ b/src/core/src/tonkadur/wyrd/v1/lang/type/MapType.java @@ -30,4 +30,10 @@ public class MapType extends Type     {        return member_type;     } + +   @Override +   public String toString () +   { +      return name; +   }  } diff --git a/src/core/src/tonkadur/wyrd/v1/lang/type/Type.java b/src/core/src/tonkadur/wyrd/v1/lang/type/Type.java index 8bb2aa8..ed377cc 100644 --- a/src/core/src/tonkadur/wyrd/v1/lang/type/Type.java +++ b/src/core/src/tonkadur/wyrd/v1/lang/type/Type.java @@ -33,4 +33,10 @@ public class Type     {        return name;     } + +   @Override +   public String toString () +   { +      return name; +   }  } | 


