summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2020-07-31 15:27:53 +0200
committerNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2020-07-31 15:27:53 +0200
commitb86a4839a7cea666cf7ab52a45ee6f66c783f435 (patch)
tree1ffe889aaf97c79c67c9afba33662efca1ee4e32
parent196f09811d8acae6447c9430ba33cd6620cf3231 (diff)
That should cover the current Fate language.
-rw-r--r--src/core/src/tonkadur/Main.java12
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/CondValue.java5
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/CountOperator.java10
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/IsMemberOperator.java10
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/Operator.java9
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/meta/Computation.java2
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/meta/Instruction.java2
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/ComputationCompiler.java612
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/InstructionCompiler.java2
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/MacroManager.java19
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/SequenceCompiler.java9
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/util/AnonymousVariableManager.java24
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/util/BinarySearch.java20
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/util/Clear.java8
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/util/CountOccurrences.java110
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/util/IfElse.java8
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/util/InsertAt.java8
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/util/InstructionManager.java5
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/util/IterativeSearch.java10
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/util/RemoveAllOf.java21
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/util/RemoveAt.java7
-rw-r--r--src/core/src/tonkadur/wyrd/v1/lang/World.java5
-rw-r--r--src/core/src/tonkadur/wyrd/v1/lang/computation/AddRichTextEffect.java30
-rw-r--r--src/core/src/tonkadur/wyrd/v1/lang/computation/Cast.java17
-rw-r--r--src/core/src/tonkadur/wyrd/v1/lang/computation/Constant.java23
-rw-r--r--src/core/src/tonkadur/wyrd/v1/lang/computation/IfElseComputation.java19
-rw-r--r--src/core/src/tonkadur/wyrd/v1/lang/computation/New.java15
-rw-r--r--src/core/src/tonkadur/wyrd/v1/lang/computation/Newline.java7
-rw-r--r--src/core/src/tonkadur/wyrd/v1/lang/computation/Operation.java91
-rw-r--r--src/core/src/tonkadur/wyrd/v1/lang/computation/Ref.java15
-rw-r--r--src/core/src/tonkadur/wyrd/v1/lang/computation/RelativeRef.java27
-rw-r--r--src/core/src/tonkadur/wyrd/v1/lang/computation/RichText.java27
-rw-r--r--src/core/src/tonkadur/wyrd/v1/lang/computation/Size.java15
-rw-r--r--src/core/src/tonkadur/wyrd/v1/lang/computation/ValueOf.java15
-rw-r--r--src/core/src/tonkadur/wyrd/v1/lang/instruction/AddChoice.java17
-rw-r--r--src/core/src/tonkadur/wyrd/v1/lang/instruction/Assert.java15
-rw-r--r--src/core/src/tonkadur/wyrd/v1/lang/instruction/Display.java15
-rw-r--r--src/core/src/tonkadur/wyrd/v1/lang/instruction/EventCall.java22
-rw-r--r--src/core/src/tonkadur/wyrd/v1/lang/instruction/Remove.java15
-rw-r--r--src/core/src/tonkadur/wyrd/v1/lang/instruction/ResolveChoices.java7
-rw-r--r--src/core/src/tonkadur/wyrd/v1/lang/instruction/SetPC.java15
-rw-r--r--src/core/src/tonkadur/wyrd/v1/lang/instruction/SetValue.java17
-rw-r--r--src/core/src/tonkadur/wyrd/v1/lang/type/DictType.java14
-rw-r--r--src/core/src/tonkadur/wyrd/v1/lang/type/MapType.java6
-rw-r--r--src/core/src/tonkadur/wyrd/v1/lang/type/Type.java6
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;
+ }
}