| 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; + } } |


