From 06d5119ca19c68c6b2f45d79e2339e82278508fd Mon Sep 17 00:00:00 2001 From: Nathanael Sensfelder Date: Mon, 27 Jul 2020 23:02:33 +0200 Subject: ... --- .../fate/v1/lang/computation/AtReference.java | 6 +- .../tonkadur/fate/v1/lang/computation/Cast.java | 6 +- .../fate/v1/lang/computation/CondValue.java | 6 +- .../fate/v1/lang/computation/Constant.java | 6 +- .../fate/v1/lang/computation/CountOperator.java | 6 +- .../fate/v1/lang/computation/FieldReference.java | 6 +- .../fate/v1/lang/computation/IfElseValue.java | 6 +- .../fate/v1/lang/computation/IsMemberOperator.java | 6 +- .../fate/v1/lang/computation/MacroValueCall.java | 6 +- .../tonkadur/fate/v1/lang/computation/Newline.java | 6 +- .../fate/v1/lang/computation/Operation.java | 6 +- .../fate/v1/lang/computation/Paragraph.java | 6 +- .../v1/lang/computation/ParameterReference.java | 6 +- .../fate/v1/lang/computation/RefOperator.java | 6 +- .../fate/v1/lang/computation/TextWithEffect.java | 6 +- .../fate/v1/lang/computation/ValueToRichText.java | 6 +- .../v1/lang/computation/VariableReference.java | 6 +- .../fate/v1/lang/instruction/AddElement.java | 6 +- .../tonkadur/fate/v1/lang/instruction/Assert.java | 6 +- .../tonkadur/fate/v1/lang/instruction/Clear.java | 6 +- .../fate/v1/lang/instruction/CondInstruction.java | 6 +- .../tonkadur/fate/v1/lang/instruction/Display.java | 6 +- .../fate/v1/lang/instruction/EventCall.java | 6 +- .../v1/lang/instruction/IfElseInstruction.java | 6 +- .../fate/v1/lang/instruction/IfInstruction.java | 6 +- .../fate/v1/lang/instruction/InstructionList.java | 6 +- .../fate/v1/lang/instruction/MacroCall.java | 6 +- .../fate/v1/lang/instruction/PlayerChoice.java | 6 +- .../fate/v1/lang/instruction/PlayerChoiceList.java | 6 +- .../v1/lang/instruction/RemoveAllOfElement.java | 23 +- .../fate/v1/lang/instruction/RemoveElement.java | 6 +- .../fate/v1/lang/instruction/SequenceCall.java | 6 +- .../fate/v1/lang/instruction/SetValue.java | 6 +- .../tonkadur/fate/v1/lang/meta/Computation.java | 6 + .../fate/v1/lang/meta/ComputationVisitor.java | 58 ++ .../tonkadur/fate/v1/lang/meta/Instruction.java | 6 + .../fate/v1/lang/meta/InstructionVisitor.java | 55 ++ src/core/src/tonkadur/fate/v1/lang/meta/Node.java | 6 - .../tonkadur/fate/v1/lang/meta/NodeVisitor.java | 114 ---- .../tonkadur/fate/v1/lang/type/CollectionType.java | 5 + .../v1/compiler/fate/v1/ComputationCompiler.java | 84 ++- .../wyrd/v1/compiler/fate/v1/FateVisitor.java | 298 --------- .../v1/compiler/fate/v1/InstructionCompiler.java | 709 +++++++-------------- .../wyrd/v1/compiler/fate/v1/MacroManager.java | 50 ++ .../wyrd/v1/compiler/util/BinarySearch.java | 4 +- .../wyrd/v1/compiler/util/IterativeSearch.java | 4 +- .../tonkadur/wyrd/v1/compiler/util/RemoveAll.java | 250 -------- .../wyrd/v1/compiler/util/RemoveAllOf.java | 250 ++++++++ src/core/src/tonkadur/wyrd/v1/lang/World.java | 5 + 49 files changed, 852 insertions(+), 1267 deletions(-) create mode 100644 src/core/src/tonkadur/fate/v1/lang/meta/ComputationVisitor.java create mode 100644 src/core/src/tonkadur/fate/v1/lang/meta/InstructionVisitor.java delete mode 100644 src/core/src/tonkadur/fate/v1/lang/meta/NodeVisitor.java delete mode 100644 src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/FateVisitor.java create mode 100644 src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/MacroManager.java delete mode 100644 src/core/src/tonkadur/wyrd/v1/compiler/util/RemoveAll.java create mode 100644 src/core/src/tonkadur/wyrd/v1/compiler/util/RemoveAllOf.java diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/AtReference.java b/src/core/src/tonkadur/fate/v1/lang/computation/AtReference.java index 176b50c..a26d399 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/AtReference.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/AtReference.java @@ -11,7 +11,7 @@ import tonkadur.fate.v1.error.UnknownDictionaryFieldException; import tonkadur.fate.v1.lang.Variable; -import tonkadur.fate.v1.lang.meta.NodeVisitor; +import tonkadur.fate.v1.lang.meta.ComputationVisitor; import tonkadur.fate.v1.lang.meta.Reference; import tonkadur.fate.v1.lang.type.RefType; @@ -81,10 +81,10 @@ public class AtReference extends Reference /**** Accessors ************************************************************/ @Override - public void visit (final NodeVisitor nv) + public void get_visited_by (final ComputationVisitor cv) throws Throwable { - nv.visit_at_reference(this); + cv.visit_at_reference(this); } public Reference get_parent () diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/Cast.java b/src/core/src/tonkadur/fate/v1/lang/computation/Cast.java index 54b5c30..98e9746 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/Cast.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/Cast.java @@ -15,7 +15,7 @@ import tonkadur.fate.v1.error.IncomparableTypeException; import tonkadur.fate.v1.lang.type.Type; -import tonkadur.fate.v1.lang.meta.NodeVisitor; +import tonkadur.fate.v1.lang.meta.ComputationVisitor; import tonkadur.fate.v1.lang.meta.Computation; public class Cast extends Computation @@ -166,10 +166,10 @@ public class Cast extends Computation /**** Accessors ************************************************************/ @Override - public void visit (final NodeVisitor nv) + public void get_visited_by (final ComputationVisitor cv) throws Throwable { - nv.visit_cast(this); + cv.visit_cast(this); } public Computation get_parent () 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 e8afd21..b8f0709 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/CondValue.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/CondValue.java @@ -15,7 +15,7 @@ import tonkadur.fate.v1.error.InvalidTypeException; import tonkadur.fate.v1.lang.type.Type; -import tonkadur.fate.v1.lang.meta.NodeVisitor; +import tonkadur.fate.v1.lang.meta.ComputationVisitor; import tonkadur.fate.v1.lang.meta.Computation; public class CondValue extends Computation @@ -121,10 +121,10 @@ public class CondValue extends Computation /**** Accessors ************************************************************/ @Override - public void visit (final NodeVisitor nv) + public void get_visited_by (final ComputationVisitor cv) throws Throwable { - nv.visit_cond_value(this); + cv.visit_cond_value(this); } /**** Misc. ****************************************************************/ diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/Constant.java b/src/core/src/tonkadur/fate/v1/lang/computation/Constant.java index 56f79f1..13233bc 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/Constant.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/Constant.java @@ -4,7 +4,7 @@ import tonkadur.parser.Origin; import tonkadur.fate.v1.lang.type.Type; -import tonkadur.fate.v1.lang.meta.NodeVisitor; +import tonkadur.fate.v1.lang.meta.ComputationVisitor; import tonkadur.fate.v1.lang.meta.Computation; public class Constant extends Computation @@ -81,10 +81,10 @@ public class Constant extends Computation /**** Accessors ************************************************************/ @Override - public void visit (final NodeVisitor nv) + public void get_visited_by (final ComputationVisitor cv) throws Throwable { - nv.visit_constant(this); + cv.visit_constant(this); } public String get_value_as_string () 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 0c26abc..fe72543 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/CountOperator.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/CountOperator.java @@ -11,7 +11,7 @@ import tonkadur.fate.v1.error.InvalidTypeException; import tonkadur.fate.v1.lang.type.CollectionType; import tonkadur.fate.v1.lang.type.Type; -import tonkadur.fate.v1.lang.meta.NodeVisitor; +import tonkadur.fate.v1.lang.meta.ComputationVisitor; import tonkadur.fate.v1.lang.meta.Computation; public class CountOperator extends Computation @@ -125,10 +125,10 @@ public class CountOperator extends Computation /**** Accessors ************************************************************/ @Override - public void visit (final NodeVisitor nv) + public void get_visited_by (final ComputationVisitor cv) throws Throwable { - nv.visit_count_operator(this); + cv.visit_count_operator(this); } /**** Misc. ****************************************************************/ diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/FieldReference.java b/src/core/src/tonkadur/fate/v1/lang/computation/FieldReference.java index 635e372..57d4836 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/FieldReference.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/FieldReference.java @@ -10,7 +10,7 @@ import tonkadur.error.ErrorManager; import tonkadur.fate.v1.error.InvalidTypeException; import tonkadur.fate.v1.error.UnknownDictionaryFieldException; -import tonkadur.fate.v1.lang.meta.NodeVisitor; +import tonkadur.fate.v1.lang.meta.ComputationVisitor; import tonkadur.fate.v1.lang.meta.Reference; import tonkadur.fate.v1.lang.type.DictType; @@ -116,10 +116,10 @@ public class FieldReference extends Reference /**** Accessors ************************************************************/ @Override - public void visit (final NodeVisitor nv) + public void get_visited_by (final ComputationVisitor cv) throws Throwable { - nv.visit_field_reference(this); + cv.visit_field_reference(this); } public String get_field_name () diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/IfElseValue.java b/src/core/src/tonkadur/fate/v1/lang/computation/IfElseValue.java index 97fe315..63adfb6 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/IfElseValue.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/IfElseValue.java @@ -12,7 +12,7 @@ import tonkadur.fate.v1.error.InvalidTypeException; import tonkadur.fate.v1.lang.type.Type; -import tonkadur.fate.v1.lang.meta.NodeVisitor; +import tonkadur.fate.v1.lang.meta.ComputationVisitor; import tonkadur.fate.v1.lang.meta.Computation; public class IfElseValue extends Computation @@ -124,10 +124,10 @@ public class IfElseValue extends Computation /**** Accessors ************************************************************/ @Override - public void visit (final NodeVisitor nv) + public void get_visited_by (final ComputationVisitor cv) throws Throwable { - nv.visit_if_else_value(this); + cv.visit_if_else_value(this); } /**** Misc. ****************************************************************/ 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 8e4aeb3..f7e5b57 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/IsMemberOperator.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/IsMemberOperator.java @@ -11,7 +11,7 @@ import tonkadur.fate.v1.error.InvalidTypeException; import tonkadur.fate.v1.lang.type.CollectionType; import tonkadur.fate.v1.lang.type.Type; -import tonkadur.fate.v1.lang.meta.NodeVisitor; +import tonkadur.fate.v1.lang.meta.ComputationVisitor; import tonkadur.fate.v1.lang.meta.Computation; public class IsMemberOperator extends Computation @@ -125,10 +125,10 @@ public class IsMemberOperator extends Computation /**** Accessors ************************************************************/ @Override - public void visit (final NodeVisitor nv) + public void get_visited_by (final ComputationVisitor cv) throws Throwable { - nv.visit_is_member_operator(this); + cv.visit_is_member_operator(this); } /**** Misc. ****************************************************************/ diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/MacroValueCall.java b/src/core/src/tonkadur/fate/v1/lang/computation/MacroValueCall.java index 83b16d4..5e4cdfd 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/MacroValueCall.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/MacroValueCall.java @@ -19,7 +19,7 @@ import tonkadur.fate.v1.lang.Macro; import tonkadur.fate.v1.lang.type.Type; -import tonkadur.fate.v1.lang.meta.NodeVisitor; +import tonkadur.fate.v1.lang.meta.ComputationVisitor; import tonkadur.fate.v1.lang.meta.Computation; public class MacroValueCall extends Computation @@ -150,10 +150,10 @@ public class MacroValueCall extends Computation /**** Accessors ************************************************************/ @Override - public void visit (final NodeVisitor nv) + public void get_visited_by (final ComputationVisitor cv) throws Throwable { - nv.visit_macro_value_call(this); + cv.visit_macro_value_call(this); } public Macro get_macro () diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/Newline.java b/src/core/src/tonkadur/fate/v1/lang/computation/Newline.java index 13b9671..9a5b880 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/Newline.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/Newline.java @@ -2,7 +2,7 @@ package tonkadur.fate.v1.lang.computation; import tonkadur.parser.Origin; -import tonkadur.fate.v1.lang.meta.NodeVisitor; +import tonkadur.fate.v1.lang.meta.ComputationVisitor; import tonkadur.fate.v1.lang.meta.RichTextNode; public class Newline extends RichTextNode @@ -18,10 +18,10 @@ public class Newline extends RichTextNode /**** Accessors ************************************************************/ @Override - public void visit (final NodeVisitor nv) + public void get_visited_by (final ComputationVisitor cv) throws Throwable { - nv.visit_newline(this); + cv.visit_newline(this); } /**** Misc. ****************************************************************/ diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/Operation.java b/src/core/src/tonkadur/fate/v1/lang/computation/Operation.java index 44f2a45..dfbfcb3 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/Operation.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/Operation.java @@ -15,7 +15,7 @@ import tonkadur.fate.v1.error.InvalidTypeException; import tonkadur.fate.v1.lang.type.Type; -import tonkadur.fate.v1.lang.meta.NodeVisitor; +import tonkadur.fate.v1.lang.meta.ComputationVisitor; import tonkadur.fate.v1.lang.meta.Computation; public class Operation extends Computation @@ -170,9 +170,9 @@ public class Operation extends Computation /**** Accessors ************************************************************/ @Override - public void visit (final NodeVisitor nv) + public void get_visited_by (final ComputationVisitor cv) throws Throwable { - nv.visit_operation(this); + cv.visit_operation(this); } } diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/Paragraph.java b/src/core/src/tonkadur/fate/v1/lang/computation/Paragraph.java index 0d1b8ce..62c72f3 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/Paragraph.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/Paragraph.java @@ -4,7 +4,7 @@ import java.util.List; import tonkadur.parser.Origin; -import tonkadur.fate.v1.lang.meta.NodeVisitor; +import tonkadur.fate.v1.lang.meta.ComputationVisitor; import tonkadur.fate.v1.lang.meta.RichTextNode; public class Paragraph extends RichTextNode @@ -36,10 +36,10 @@ public class Paragraph extends RichTextNode /**** Accessors ************************************************************/ @Override - public void visit (final NodeVisitor nv) + public void get_visited_by (final ComputationVisitor cv) throws Throwable { - nv.visit_paragraph(this); + cv.visit_paragraph(this); } public List get_content () diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/ParameterReference.java b/src/core/src/tonkadur/fate/v1/lang/computation/ParameterReference.java index 06cf523..6266c7c 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/ParameterReference.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/ParameterReference.java @@ -2,7 +2,7 @@ package tonkadur.fate.v1.lang.computation; import tonkadur.parser.Origin; -import tonkadur.fate.v1.lang.meta.NodeVisitor; +import tonkadur.fate.v1.lang.meta.ComputationVisitor; import tonkadur.fate.v1.lang.meta.Reference; import tonkadur.fate.v1.lang.type.Type; @@ -29,10 +29,10 @@ public class ParameterReference extends Reference /**** Accessors ************************************************************/ @Override - public void visit (final NodeVisitor nv) + public void get_visited_by (final ComputationVisitor cv) throws Throwable { - nv.visit_parameter_reference(this); + cv.visit_parameter_reference(this); } /**** Misc. ****************************************************************/ diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/RefOperator.java b/src/core/src/tonkadur/fate/v1/lang/computation/RefOperator.java index edbcc29..49f3ef6 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/RefOperator.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/RefOperator.java @@ -4,7 +4,7 @@ import tonkadur.parser.Origin; import tonkadur.fate.v1.lang.type.RefType; -import tonkadur.fate.v1.lang.meta.NodeVisitor; +import tonkadur.fate.v1.lang.meta.ComputationVisitor; import tonkadur.fate.v1.lang.meta.Reference; import tonkadur.fate.v1.lang.meta.Computation; @@ -32,10 +32,10 @@ public class RefOperator extends Computation /**** Accessors ************************************************************/ @Override - public void visit (final NodeVisitor nv) + public void get_visited_by (final ComputationVisitor cv) throws Throwable { - nv.visit_ref_operator(this); + cv.visit_ref_operator(this); } /**** Misc. ****************************************************************/ diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/TextWithEffect.java b/src/core/src/tonkadur/fate/v1/lang/computation/TextWithEffect.java index 7be47c1..df3c324 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/TextWithEffect.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/TextWithEffect.java @@ -18,7 +18,7 @@ import tonkadur.fate.v1.lang.TextEffect; import tonkadur.fate.v1.lang.type.Type; -import tonkadur.fate.v1.lang.meta.NodeVisitor; +import tonkadur.fate.v1.lang.meta.ComputationVisitor; import tonkadur.fate.v1.lang.meta.RichTextNode; import tonkadur.fate.v1.lang.meta.Computation; @@ -140,10 +140,10 @@ public class TextWithEffect extends RichTextNode /**** Accessors ************************************************************/ @Override - public void visit (final NodeVisitor nv) + public void get_visited_by (final ComputationVisitor cv) throws Throwable { - nv.visit_text_with_effect(this); + cv.visit_text_with_effect(this); } public TextEffect get_effect () diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/ValueToRichText.java b/src/core/src/tonkadur/fate/v1/lang/computation/ValueToRichText.java index 917f4ad..43c8371 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/ValueToRichText.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/ValueToRichText.java @@ -7,7 +7,7 @@ import tonkadur.fate.v1.error.IncomparableTypeException; import tonkadur.fate.v1.lang.type.Type; -import tonkadur.fate.v1.lang.meta.NodeVisitor; +import tonkadur.fate.v1.lang.meta.ComputationVisitor; import tonkadur.fate.v1.lang.meta.RichTextNode; import tonkadur.fate.v1.lang.meta.Computation; @@ -62,10 +62,10 @@ public class ValueToRichText extends RichTextNode /**** Accessors ************************************************************/ @Override - public void visit (final NodeVisitor nv) + public void get_visited_by (final ComputationVisitor cv) throws Throwable { - nv.visit_value_to_rich_text(this); + cv.visit_value_to_rich_text(this); } public Computation get_value () diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/VariableReference.java b/src/core/src/tonkadur/fate/v1/lang/computation/VariableReference.java index d8522c2..3424eed 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/VariableReference.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/VariableReference.java @@ -4,7 +4,7 @@ import tonkadur.parser.Origin; import tonkadur.fate.v1.lang.Variable; -import tonkadur.fate.v1.lang.meta.NodeVisitor; +import tonkadur.fate.v1.lang.meta.ComputationVisitor; import tonkadur.fate.v1.lang.meta.Reference; import tonkadur.fate.v1.lang.type.Type; @@ -47,10 +47,10 @@ public class VariableReference extends Reference /**** Accessors ************************************************************/ @Override - public void visit (final NodeVisitor nv) + public void get_visited_by (final ComputationVisitor cv) throws Throwable { - nv.visit_variable_reference(this); + cv.visit_variable_reference(this); } public Variable get_variable () diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/AddElement.java b/src/core/src/tonkadur/fate/v1/lang/instruction/AddElement.java index a3ff50c..792a68f 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/AddElement.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/AddElement.java @@ -11,7 +11,7 @@ import tonkadur.fate.v1.error.InvalidTypeException; import tonkadur.fate.v1.lang.type.CollectionType; import tonkadur.fate.v1.lang.type.Type; -import tonkadur.fate.v1.lang.meta.NodeVisitor; +import tonkadur.fate.v1.lang.meta.InstructionVisitor; import tonkadur.fate.v1.lang.meta.Instruction; import tonkadur.fate.v1.lang.meta.Computation; @@ -126,10 +126,10 @@ public class AddElement extends Instruction /**** Accessors ************************************************************/ @Override - public void visit (final NodeVisitor nv) + public void get_visited_by (final InstructionVisitor iv) throws Throwable { - nv.visit_add_element(this); + iv.visit_add_element(this); } public Computation get_collection () diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/Assert.java b/src/core/src/tonkadur/fate/v1/lang/instruction/Assert.java index 8e7dbc5..2770fa1 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/Assert.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/Assert.java @@ -10,7 +10,7 @@ import tonkadur.fate.v1.error.InvalidTypeException; import tonkadur.fate.v1.lang.type.Type; -import tonkadur.fate.v1.lang.meta.NodeVisitor; +import tonkadur.fate.v1.lang.meta.InstructionVisitor; import tonkadur.fate.v1.lang.meta.Instruction; import tonkadur.fate.v1.lang.meta.Computation; @@ -65,10 +65,10 @@ public class Assert extends Instruction /**** Accessors ************************************************************/ @Override - public void visit (final NodeVisitor nv) + public void get_visited_by (final InstructionVisitor iv) throws Throwable { - nv.visit_assert(this); + iv.visit_assert(this); } public Computation get_condition () diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/Clear.java b/src/core/src/tonkadur/fate/v1/lang/instruction/Clear.java index e414e19..5d036fa 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/Clear.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/Clear.java @@ -9,7 +9,7 @@ import tonkadur.fate.v1.error.InvalidTypeException; import tonkadur.fate.v1.lang.type.CollectionType; import tonkadur.fate.v1.lang.type.Type; -import tonkadur.fate.v1.lang.meta.NodeVisitor; +import tonkadur.fate.v1.lang.meta.InstructionVisitor; import tonkadur.fate.v1.lang.meta.Instruction; import tonkadur.fate.v1.lang.meta.Computation; @@ -67,10 +67,10 @@ public class Clear extends Instruction /**** Accessors ************************************************************/ @Override - public void visit (final NodeVisitor nv) + public void get_visited_by (final InstructionVisitor iv) throws Throwable { - nv.visit_clear(this); + iv.visit_clear(this); } public Computation get_collection () diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/CondInstruction.java b/src/core/src/tonkadur/fate/v1/lang/instruction/CondInstruction.java index 1fd1bce..15c6fa4 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/CondInstruction.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/CondInstruction.java @@ -13,7 +13,7 @@ import tonkadur.fate.v1.error.InvalidTypeException; import tonkadur.fate.v1.lang.type.Type; -import tonkadur.fate.v1.lang.meta.NodeVisitor; +import tonkadur.fate.v1.lang.meta.InstructionVisitor; import tonkadur.fate.v1.lang.meta.Instruction; import tonkadur.fate.v1.lang.meta.Computation; @@ -71,10 +71,10 @@ public class CondInstruction extends Instruction /**** Accessors ************************************************************/ @Override - public void visit (final NodeVisitor nv) + public void get_visited_by (final InstructionVisitor iv) throws Throwable { - nv.visit_cond_instruction(this); + iv.visit_cond_instruction(this); } public List> get_branches () diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/Display.java b/src/core/src/tonkadur/fate/v1/lang/instruction/Display.java index 24fc27d..5e95601 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/Display.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/Display.java @@ -8,7 +8,7 @@ import tonkadur.parser.Origin; import tonkadur.fate.v1.lang.type.Type; -import tonkadur.fate.v1.lang.meta.NodeVisitor; +import tonkadur.fate.v1.lang.meta.InstructionVisitor; import tonkadur.fate.v1.lang.meta.Instruction; import tonkadur.fate.v1.lang.meta.RichTextNode; @@ -41,10 +41,10 @@ public class Display extends Instruction /**** Accessors ************************************************************/ @Override - public void visit (final NodeVisitor nv) + public void get_visited_by (final InstructionVisitor iv) throws Throwable { - nv.visit_display(this); + iv.visit_display(this); } public RichTextNode get_content () diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/EventCall.java b/src/core/src/tonkadur/fate/v1/lang/instruction/EventCall.java index e9bf5f9..887e08b 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/EventCall.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/EventCall.java @@ -18,7 +18,7 @@ import tonkadur.fate.v1.lang.Event; import tonkadur.fate.v1.lang.type.Type; -import tonkadur.fate.v1.lang.meta.NodeVisitor; +import tonkadur.fate.v1.lang.meta.InstructionVisitor; import tonkadur.fate.v1.lang.meta.Instruction; import tonkadur.fate.v1.lang.meta.Computation; @@ -137,10 +137,10 @@ public class EventCall extends Instruction /**** Accessors ************************************************************/ @Override - public void visit (final NodeVisitor nv) + public void get_visited_by (final InstructionVisitor iv) throws Throwable { - nv.visit_event_call(this); + iv.visit_event_call(this); } public Event get_event () diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/IfElseInstruction.java b/src/core/src/tonkadur/fate/v1/lang/instruction/IfElseInstruction.java index c07a8d6..1fcbb01 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/IfElseInstruction.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/IfElseInstruction.java @@ -10,7 +10,7 @@ import tonkadur.fate.v1.error.InvalidTypeException; import tonkadur.fate.v1.lang.type.Type; -import tonkadur.fate.v1.lang.meta.NodeVisitor; +import tonkadur.fate.v1.lang.meta.InstructionVisitor; import tonkadur.fate.v1.lang.meta.Instruction; import tonkadur.fate.v1.lang.meta.Computation; @@ -73,10 +73,10 @@ public class IfElseInstruction extends Instruction /**** Accessors ************************************************************/ @Override - public void visit (final NodeVisitor nv) + public void get_visited_by (final InstructionVisitor iv) throws Throwable { - nv.visit_if_else_instruction(this); + iv.visit_if_else_instruction(this); } public Computation get_condition () diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/IfInstruction.java b/src/core/src/tonkadur/fate/v1/lang/instruction/IfInstruction.java index 7dfe376..12a64d4 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/IfInstruction.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/IfInstruction.java @@ -10,7 +10,7 @@ import tonkadur.fate.v1.error.InvalidTypeException; import tonkadur.fate.v1.lang.type.Type; -import tonkadur.fate.v1.lang.meta.NodeVisitor; +import tonkadur.fate.v1.lang.meta.InstructionVisitor; import tonkadur.fate.v1.lang.meta.Instruction; import tonkadur.fate.v1.lang.meta.Computation; @@ -69,10 +69,10 @@ public class IfInstruction extends Instruction /**** Accessors ************************************************************/ @Override - public void visit (final NodeVisitor nv) + public void get_visited_by (final InstructionVisitor iv) throws Throwable { - nv.visit_if_instruction(this); + iv.visit_if_instruction(this); } public Computation get_condition () diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/InstructionList.java b/src/core/src/tonkadur/fate/v1/lang/instruction/InstructionList.java index 658fa58..132289f 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/InstructionList.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/InstructionList.java @@ -4,7 +4,7 @@ import java.util.List; import tonkadur.parser.Origin; -import tonkadur.fate.v1.lang.meta.NodeVisitor; +import tonkadur.fate.v1.lang.meta.InstructionVisitor; import tonkadur.fate.v1.lang.meta.Instruction; public class InstructionList extends Instruction @@ -31,10 +31,10 @@ public class InstructionList extends Instruction /**** Accessors ************************************************************/ @Override - public void visit (final NodeVisitor nv) + public void get_visited_by (final InstructionVisitor iv) throws Throwable { - nv.visit_instruction_list(this); + iv.visit_instruction_list(this); } public List get_instructions () diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/MacroCall.java b/src/core/src/tonkadur/fate/v1/lang/instruction/MacroCall.java index 3588f65..c3c3b44 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/MacroCall.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/MacroCall.java @@ -18,7 +18,7 @@ import tonkadur.fate.v1.lang.Macro; import tonkadur.fate.v1.lang.type.Type; -import tonkadur.fate.v1.lang.meta.NodeVisitor; +import tonkadur.fate.v1.lang.meta.InstructionVisitor; import tonkadur.fate.v1.lang.meta.Instruction; import tonkadur.fate.v1.lang.meta.Computation; @@ -137,10 +137,10 @@ public class MacroCall extends Instruction /**** Accessors ************************************************************/ @Override - public void visit (final NodeVisitor nv) + public void get_visited_by (final InstructionVisitor iv) throws Throwable { - nv.visit_macro_call(this); + iv.visit_macro_call(this); } public Macro get_macro () diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/PlayerChoice.java b/src/core/src/tonkadur/fate/v1/lang/instruction/PlayerChoice.java index fdebb80..1f40c8a 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/PlayerChoice.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/PlayerChoice.java @@ -6,7 +6,7 @@ import tonkadur.parser.Origin; import tonkadur.fate.v1.lang.type.Type; -import tonkadur.fate.v1.lang.meta.NodeVisitor; +import tonkadur.fate.v1.lang.meta.InstructionVisitor; import tonkadur.fate.v1.lang.meta.Instruction; import tonkadur.fate.v1.lang.meta.RichTextNode; @@ -38,10 +38,10 @@ public class PlayerChoice extends Instruction /**** Accessors ************************************************************/ @Override - public void visit (final NodeVisitor nv) + public void get_visited_by (final InstructionVisitor iv) throws Throwable { - nv.visit_player_choice(this); + iv.visit_player_choice(this); } public RichTextNode get_text () diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/PlayerChoiceList.java b/src/core/src/tonkadur/fate/v1/lang/instruction/PlayerChoiceList.java index f9841fd..79a2570 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/PlayerChoiceList.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/PlayerChoiceList.java @@ -4,7 +4,7 @@ import java.util.List; import tonkadur.parser.Origin; -import tonkadur.fate.v1.lang.meta.NodeVisitor; +import tonkadur.fate.v1.lang.meta.InstructionVisitor; import tonkadur.fate.v1.lang.meta.Instruction; public class PlayerChoiceList extends Instruction @@ -31,10 +31,10 @@ public class PlayerChoiceList extends Instruction /**** Accessors ************************************************************/ @Override - public void visit (final NodeVisitor nv) + public void get_visited_by (final InstructionVisitor iv) throws Throwable { - nv.visit_player_choice_list(this); + iv.visit_player_choice_list(this); } public List get_choices () diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/RemoveAllOfElement.java b/src/core/src/tonkadur/fate/v1/lang/instruction/RemoveAllOfElement.java index f8568a0..0aeb614 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/RemoveAllOfElement.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/RemoveAllOfElement.java @@ -11,9 +11,10 @@ import tonkadur.fate.v1.error.InvalidTypeException; import tonkadur.fate.v1.lang.type.CollectionType; import tonkadur.fate.v1.lang.type.Type; -import tonkadur.fate.v1.lang.meta.NodeVisitor; +import tonkadur.fate.v1.lang.meta.InstructionVisitor; import tonkadur.fate.v1.lang.meta.Instruction; import tonkadur.fate.v1.lang.meta.Computation; +import tonkadur.fate.v1.lang.meta.Reference; public class RemoveAllOfElement extends Instruction { @@ -21,7 +22,7 @@ public class RemoveAllOfElement extends Instruction /**** MEMBERS **************************************************************/ /***************************************************************************/ protected final Computation element; - protected final Computation collection; + protected final Reference collection; /***************************************************************************/ /**** PROTECTED ************************************************************/ @@ -31,7 +32,7 @@ public class RemoveAllOfElement extends Instruction ( final Origin origin, final Computation element, - final Computation collection + final Reference collection ) { super(origin); @@ -48,7 +49,7 @@ public class RemoveAllOfElement extends Instruction ( final Origin origin, final Computation element, - final Computation collection + final Reference collection ) throws InvalidTypeException, @@ -126,10 +127,20 @@ public class RemoveAllOfElement extends Instruction /**** Accessors ************************************************************/ @Override - public void visit (final NodeVisitor nv) + public void get_visited_by (final InstructionVisitor iv) throws Throwable { - nv.visit_remove_all_of_element(this); + iv.visit_remove_all_of_element(this); + } + + public Computation get_element () + { + return element; + } + + public Reference get_collection () + { + return collection; } /**** Misc. ****************************************************************/ diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/RemoveElement.java b/src/core/src/tonkadur/fate/v1/lang/instruction/RemoveElement.java index d02e3b2..b067e9d 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/RemoveElement.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/RemoveElement.java @@ -11,7 +11,7 @@ import tonkadur.fate.v1.error.InvalidTypeException; import tonkadur.fate.v1.lang.type.CollectionType; import tonkadur.fate.v1.lang.type.Type; -import tonkadur.fate.v1.lang.meta.NodeVisitor; +import tonkadur.fate.v1.lang.meta.InstructionVisitor; import tonkadur.fate.v1.lang.meta.Instruction; import tonkadur.fate.v1.lang.meta.Computation; @@ -126,10 +126,10 @@ public class RemoveElement extends Instruction /**** Accessors ************************************************************/ @Override - public void visit (final NodeVisitor nv) + public void get_visited_by (final InstructionVisitor iv) throws Throwable { - nv.visit_remove_element(this); + iv.visit_remove_element(this); } public Computation get_element () diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/SequenceCall.java b/src/core/src/tonkadur/fate/v1/lang/instruction/SequenceCall.java index fefe8d8..6ea696d 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/SequenceCall.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/SequenceCall.java @@ -2,7 +2,7 @@ package tonkadur.fate.v1.lang.instruction; import tonkadur.parser.Origin; -import tonkadur.fate.v1.lang.meta.NodeVisitor; +import tonkadur.fate.v1.lang.meta.InstructionVisitor; import tonkadur.fate.v1.lang.meta.Instruction; public class SequenceCall extends Instruction @@ -25,10 +25,10 @@ public class SequenceCall extends Instruction /**** Accessors ************************************************************/ @Override - public void visit (final NodeVisitor nv) + public void get_visited_by (final InstructionVisitor iv) throws Throwable { - nv.visit_sequence_call(this); + iv.visit_sequence_call(this); } public String get_sequence_name () diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/SetValue.java b/src/core/src/tonkadur/fate/v1/lang/instruction/SetValue.java index 0ea9a98..6a7db6f 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/SetValue.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/SetValue.java @@ -10,7 +10,7 @@ import tonkadur.fate.v1.error.InvalidTypeException; import tonkadur.fate.v1.lang.type.Type; -import tonkadur.fate.v1.lang.meta.NodeVisitor; +import tonkadur.fate.v1.lang.meta.InstructionVisitor; import tonkadur.fate.v1.lang.meta.Instruction; import tonkadur.fate.v1.lang.meta.Computation; @@ -104,10 +104,10 @@ public class SetValue extends Instruction /**** Accessors ************************************************************/ @Override - public void visit (final NodeVisitor nv) + public void get_visited_by (final InstructionVisitor iv) throws Throwable { - nv.visit_set_value(this); + iv.visit_set_value(this); } public Computation get_value () 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 f7dbcd3..67aaa52 100644 --- a/src/core/src/tonkadur/fate/v1/lang/meta/Computation.java +++ b/src/core/src/tonkadur/fate/v1/lang/meta/Computation.java @@ -26,6 +26,12 @@ public abstract class Computation extends Node /**** PUBLIC ***************************************************************/ /***************************************************************************/ /**** Accessors ************************************************************/ + public void get_visited_by (final ComputationVisitor cv) + throws Throwable + { + + } + public Type get_type () { return type; diff --git a/src/core/src/tonkadur/fate/v1/lang/meta/ComputationVisitor.java b/src/core/src/tonkadur/fate/v1/lang/meta/ComputationVisitor.java new file mode 100644 index 0000000..9223c7b --- /dev/null +++ b/src/core/src/tonkadur/fate/v1/lang/meta/ComputationVisitor.java @@ -0,0 +1,58 @@ +package tonkadur.fate.v1.lang.meta; + +import tonkadur.fate.v1.lang.computation.*; + +public interface ComputationVisitor +{ + public void visit_at_reference (final AtReference n) + throws Throwable; + + public void visit_cast (final Cast n) + throws Throwable; + + public void visit_cond_value (final CondValue n) + throws Throwable; + + public void visit_constant (final Constant n) + throws Throwable; + + public void visit_count_operator (final CountOperator n) + throws Throwable; + + public void visit_field_reference (final FieldReference n) + throws Throwable; + + public void visit_if_else_value (final IfElseValue n) + throws Throwable; + + public void visit_is_member_operator (final IsMemberOperator n) + throws Throwable; + + public void visit_macro_value_call (final MacroValueCall n) + throws Throwable; + + public void visit_newline (final Newline n) + throws Throwable; + + public void visit_operation (final Operation n) + throws Throwable; + + public void visit_paragraph (final Paragraph n) + throws Throwable; + + public void visit_parameter_reference (final ParameterReference n) + throws Throwable; + + public void visit_ref_operator (final RefOperator n) + throws Throwable; + + public void visit_text_with_effect (final TextWithEffect n) + throws Throwable; + + public void visit_value_to_rich_text (final ValueToRichText n) + throws Throwable; + + public void visit_variable_reference (final VariableReference n) + throws Throwable; + +} 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 f77206a..457c355 100644 --- a/src/core/src/tonkadur/fate/v1/lang/meta/Instruction.java +++ b/src/core/src/tonkadur/fate/v1/lang/meta/Instruction.java @@ -29,6 +29,12 @@ public abstract class Instruction extends Node /**** PUBLIC ***************************************************************/ /***************************************************************************/ /**** Accessors ************************************************************/ + public void get_visited_by (final InstructionVisitor iv) + throws Throwable + { + + } + public void link_parent (final Instruction parent) { parent.child = this; diff --git a/src/core/src/tonkadur/fate/v1/lang/meta/InstructionVisitor.java b/src/core/src/tonkadur/fate/v1/lang/meta/InstructionVisitor.java new file mode 100644 index 0000000..5f78fc0 --- /dev/null +++ b/src/core/src/tonkadur/fate/v1/lang/meta/InstructionVisitor.java @@ -0,0 +1,55 @@ +package tonkadur.fate.v1.lang.meta; + +import tonkadur.fate.v1.lang.instruction.*; + +public interface InstructionVisitor +{ + /* Instruction Nodes */ + public void visit_add_element (final AddElement ae) + throws Throwable; + + public void visit_assert (final Assert a) + throws Throwable; + + public void visit_clear (final Clear c) + throws Throwable; + + public void visit_cond_instruction (final CondInstruction ci) + throws Throwable; + + public void visit_display (final Display n) + throws Throwable; + + public void visit_event_call (final EventCall n) + throws Throwable; + + public void visit_if_else_instruction (final IfElseInstruction n) + throws Throwable; + + public void visit_if_instruction (final IfInstruction n) + throws Throwable; + + public void visit_instruction_list (final InstructionList n) + throws Throwable; + + public void visit_macro_call (final MacroCall n) + throws Throwable; + + public void visit_player_choice (final PlayerChoice n) + throws Throwable; + + public void visit_player_choice_list (final PlayerChoiceList n) + throws Throwable; + + public void visit_remove_all_of_element (final RemoveAllOfElement n) + throws Throwable; + + public void visit_remove_element (final RemoveElement n) + throws Throwable; + + public void visit_sequence_call (final SequenceCall n) + throws Throwable; + + public void visit_set_value (final SetValue n) + throws Throwable; +} diff --git a/src/core/src/tonkadur/fate/v1/lang/meta/Node.java b/src/core/src/tonkadur/fate/v1/lang/meta/Node.java index 86299b8..e5317d9 100644 --- a/src/core/src/tonkadur/fate/v1/lang/meta/Node.java +++ b/src/core/src/tonkadur/fate/v1/lang/meta/Node.java @@ -22,12 +22,6 @@ public abstract class Node /**** PUBLIC ***************************************************************/ /***************************************************************************/ /**** Accessors ************************************************************/ - public void visit (final NodeVisitor nv) - throws Throwable - { - - } - public Origin get_origin () { return origin; diff --git a/src/core/src/tonkadur/fate/v1/lang/meta/NodeVisitor.java b/src/core/src/tonkadur/fate/v1/lang/meta/NodeVisitor.java deleted file mode 100644 index f294da5..0000000 --- a/src/core/src/tonkadur/fate/v1/lang/meta/NodeVisitor.java +++ /dev/null @@ -1,114 +0,0 @@ -package tonkadur.fate.v1.lang.meta; - -import tonkadur.fate.v1.lang.World; - -import tonkadur.fate.v1.lang.instruction.*; -import tonkadur.fate.v1.lang.computation.*; - -public interface NodeVisitor -{ - public void visit_world (final World w) - throws Throwable; - - /* Instruction Nodes */ - public void visit_add_element (final AddElement ae) - throws Throwable; - - public void visit_assert (final Assert a) - throws Throwable; - - public void visit_clear (final Clear c) - throws Throwable; - - public void visit_cond_instruction (final CondInstruction ci) - throws Throwable; - - public void visit_display (final Display n) - throws Throwable; - - public void visit_event_call (final EventCall n) - throws Throwable; - - public void visit_if_else_instruction (final IfElseInstruction n) - throws Throwable; - - public void visit_if_instruction (final IfInstruction n) - throws Throwable; - - public void visit_instruction_list (final InstructionList n) - throws Throwable; - - public void visit_macro_call (final MacroCall n) - throws Throwable; - - public void visit_player_choice (final PlayerChoice n) - throws Throwable; - - public void visit_player_choice_list (final PlayerChoiceList n) - throws Throwable; - - public void visit_remove_all_of_element (final RemoveAllOfElement n) - throws Throwable; - - public void visit_remove_element (final RemoveElement n) - throws Throwable; - - public void visit_sequence_call (final SequenceCall n) - throws Throwable; - - public void visit_set_value (final SetValue n) - throws Throwable; - - /* Valued Nodes */ - public void visit_at_reference (final AtReference n) - throws Throwable; - - public void visit_cast (final Cast n) - throws Throwable; - - public void visit_cond_value (final CondValue n) - throws Throwable; - - public void visit_constant (final Constant n) - throws Throwable; - - public void visit_count_operator (final CountOperator n) - throws Throwable; - - public void visit_field_reference (final FieldReference n) - throws Throwable; - - public void visit_if_else_value (final IfElseValue n) - throws Throwable; - - public void visit_is_member_operator (final IsMemberOperator n) - throws Throwable; - - public void visit_macro_value_call (final MacroValueCall n) - throws Throwable; - - public void visit_newline (final Newline n) - throws Throwable; - - public void visit_operation (final Operation n) - throws Throwable; - - public void visit_paragraph (final Paragraph n) - throws Throwable; - - public void visit_parameter_reference (final ParameterReference n) - throws Throwable; - - public void visit_ref_operator (final RefOperator n) - throws Throwable; - - public void visit_text_with_effect (final TextWithEffect n) - throws Throwable; - - public void visit_value_to_rich_text (final ValueToRichText n) - throws Throwable; - - public void visit_variable_reference (final VariableReference n) - throws Throwable; - -} diff --git a/src/core/src/tonkadur/fate/v1/lang/type/CollectionType.java b/src/core/src/tonkadur/fate/v1/lang/type/CollectionType.java index f25f3f7..830cd03 100644 --- a/src/core/src/tonkadur/fate/v1/lang/type/CollectionType.java +++ b/src/core/src/tonkadur/fate/v1/lang/type/CollectionType.java @@ -59,6 +59,11 @@ public class CollectionType extends Type return content_type; } + public boolean is_set () + { + return is_set; + } + /**** Compatibility ********************************************************/ @Override public boolean can_be_used_as (final Type t) 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 817403e..ebfc865 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/ComputationCompiler.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/ComputationCompiler.java @@ -1,34 +1,49 @@ package tonkadur.wyrd.v1.compiler.fate.v1; +import java.util.List; +import java.util.ArrayList; + import tonkadur.error.Error; import tonkadur.wyrd.v1.lang.meta.Computation; +import tonkadur.wyrd.v1.lang.meta.Instruction; + +import tonkadur.wyrd.v1.lang.computation.Ref; +import tonkadur.wyrd.v1.lang.computation.ValueOf; import tonkadur.wyrd.v1.lang.World; -public class ComputationCompiler extends FateVisitor +import tonkadur.wyrd.v1.compiler.util.AnonymousVariableManager; + +public class ComputationCompiler +implements tonkadur.fate.v1.lang.meta.ComputationVisitor { protected final MacroManager macro_manager; protected final AnonymousVariableManager anonymous_variables; protected final World wyrd_world; protected final List pre_computation_instructions; protected final List allocated_variables; - protected Computation result; + protected final boolean expect_ref; + protected Computation result_as_computation; + protected Ref result_as_ref; public ComputationCompiler ( final MacroManager macro_manager, final AnonymousVariableManager anonymous_variables, - final World wyrd_world + final World wyrd_world, + final boolean expect_ref ) { this.macro_manager = macro_manager; this.anonymous_variables = anonymous_variables; this.wyrd_world = wyrd_world; + this.expect_ref = expect_ref; allocated_variables = new ArrayList(); pre_computation_instructions = new ArrayList(); - result = null; + result_as_ref = null; + result_as_computation = null; } public List get_pre_instructions () @@ -38,7 +53,32 @@ public class ComputationCompiler extends FateVisitor public Computation get_computation () { - return result; + if (result_as_computation != null) + { + return result_as_computation; + } + else + { + result_as_computation = new ValueOf(result_as_ref); + + return result_as_computation; + } + } + + public Ref get_ref () + { + return result_as_ref; + } + + protected void generate_ref () + { + final Ref result; + + result = anonymous_variables.reserve(result_as_computation.get_type()); + + allocated_variables.add(result); + + result_as_ref = result; } public void free_anonymous_variables () @@ -56,7 +96,7 @@ public class ComputationCompiler extends FateVisitor ) throws Throwable { - throw new UnhandledASTElementException(); + /* TODO: implement */ } @Override @@ -66,7 +106,7 @@ public class ComputationCompiler extends FateVisitor ) throws Throwable { - throw new UnhandledASTElementException(); + /* TODO: implement */ } @Override @@ -76,7 +116,7 @@ public class ComputationCompiler extends FateVisitor ) throws Throwable { - throw new UnhandledASTElementException(); + /* TODO: implement */ } @Override @@ -86,7 +126,7 @@ public class ComputationCompiler extends FateVisitor ) throws Throwable { - throw new UnhandledASTElementException(); + /* TODO: implement */ } @Override @@ -96,7 +136,7 @@ public class ComputationCompiler extends FateVisitor ) throws Throwable { - throw new UnhandledASTElementException(); + /* TODO: implement */ } @Override @@ -106,7 +146,7 @@ public class ComputationCompiler extends FateVisitor ) throws Throwable { - throw new UnhandledASTElementException(); + /* TODO: implement */ } @Override @@ -116,7 +156,7 @@ public class ComputationCompiler extends FateVisitor ) throws Throwable { - throw new UnhandledASTElementException(); + /* TODO: implement */ } @Override @@ -126,7 +166,7 @@ public class ComputationCompiler extends FateVisitor ) throws Throwable { - throw new UnhandledASTElementException(); + /* TODO: implement */ } @Override @@ -136,7 +176,7 @@ public class ComputationCompiler extends FateVisitor ) throws Throwable { - throw new UnhandledASTElementException(); + /* TODO: implement */ } @Override @@ -146,7 +186,7 @@ public class ComputationCompiler extends FateVisitor ) throws Throwable { - throw new UnhandledASTElementException(); + /* TODO: implement */ } @Override @@ -156,7 +196,7 @@ public class ComputationCompiler extends FateVisitor ) throws Throwable { - throw new UnhandledASTElementException(); + /* TODO: implement */ } @Override @@ -166,7 +206,7 @@ public class ComputationCompiler extends FateVisitor ) throws Throwable { - throw new UnhandledASTElementException(); + /* TODO: implement */ } @Override @@ -176,7 +216,7 @@ public class ComputationCompiler extends FateVisitor ) throws Throwable { - throw new UnhandledASTElementException(); + /* TODO: implement */ } @Override @@ -186,7 +226,7 @@ public class ComputationCompiler extends FateVisitor ) throws Throwable { - throw new UnhandledASTElementException(); + /* TODO: implement */ } @Override @@ -196,7 +236,7 @@ public class ComputationCompiler extends FateVisitor ) throws Throwable { - throw new UnhandledASTElementException(); + /* TODO: implement */ } @Override @@ -206,7 +246,7 @@ public class ComputationCompiler extends FateVisitor ) throws Throwable { - throw new UnhandledASTElementException(); + /* TODO: implement */ } @Override @@ -216,6 +256,6 @@ public class ComputationCompiler extends FateVisitor ) throws Throwable { - throw new UnhandledASTElementException(); + /* TODO: implement */ } } diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/FateVisitor.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/FateVisitor.java deleted file mode 100644 index f6af43d..0000000 --- a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/FateVisitor.java +++ /dev/null @@ -1,298 +0,0 @@ -package tonkadur.wyrd.v1.compiler.fate.v1; - -import tonkadur.wyrd.v1.error.UnhandledASTElementException; - -import tonkadur.fate.v1.lang.meta.NodeVisitor; - -public abstract class FateVisitor implements NodeVisitor -{ - /* Instruction Nodes */ - public void visit_add_element - ( - final tonkadur.fate.v1.lang.instruction.AddElement ae - ) - throws Throwable - { - throw new UnhandledASTElementException(); - } - - public void visit_assert (final tonkadur.fate.v1.lang.instruction.Assert a) - throws Throwable - { - throw new UnhandledASTElementException(); - } - - public void visit_clear (final tonkadur.fate.v1.lang.instruction.Clear c) - throws Throwable - { - throw new UnhandledASTElementException(); - } - - public void visit_cond_instruction - ( - final tonkadur.fate.v1.lang.instruction.CondInstruction ci - ) - throws Throwable - { - throw new UnhandledASTElementException(); - } - - public void visit_display (final tonkadur.fate.v1.lang.instruction.Display n) - throws Throwable - { - throw new UnhandledASTElementException(); - } - - public void visit_event_call - ( - final tonkadur.fate.v1.lang.instruction.EventCall n - ) - throws Throwable - { - throw new UnhandledASTElementException(); - } - - public void visit_if_else_instruction - ( - final tonkadur.fate.v1.lang.instruction.IfElseInstruction n - ) - throws Throwable - { - throw new UnhandledASTElementException(); - } - - public void visit_if_instruction - ( - final tonkadur.fate.v1.lang.instruction.IfInstruction n - ) - throws Throwable - { - throw new UnhandledASTElementException(); - } - - public void visit_instruction_list - ( - final tonkadur.fate.v1.lang.instruction.InstructionList n - ) - throws Throwable - { - throw new UnhandledASTElementException(); - } - - public void visit_macro_call - ( - final tonkadur.fate.v1.lang.instruction.MacroCall n - ) - throws Throwable - { - throw new UnhandledASTElementException(); - } - - public void visit_player_choice - ( - final tonkadur.fate.v1.lang.instruction.PlayerChoice n - ) - throws Throwable - { - throw new UnhandledASTElementException(); - } - - public void visit_player_choice_list - ( - final tonkadur.fate.v1.lang.instruction.PlayerChoiceList n - ) - throws Throwable - { - throw new UnhandledASTElementException(); - } - - public void visit_remove_all_of_element - ( - final tonkadur.fate.v1.lang.instruction.RemoveAllOfElement n - ) - throws Throwable - { - throw new UnhandledASTElementException(); - } - - public void visit_remove_element - ( - final tonkadur.fate.v1.lang.instruction.RemoveElement n - ) - throws Throwable - { - throw new UnhandledASTElementException(); - } - - public void visit_sequence_call - ( - final tonkadur.fate.v1.lang.instruction.SequenceCall n - ) - throws Throwable - { - throw new UnhandledASTElementException(); - } - - public void visit_set_value - ( - final tonkadur.fate.v1.lang.instruction.SetValue n - ) - throws Throwable - { - throw new UnhandledASTElementException(); - } - - /* Valued Nodes */ - public void visit_at_reference - ( - final tonkadur.fate.v1.lang.computation.AtReference n - ) - throws Throwable - { - throw new UnhandledASTElementException(); - } - - public void visit_cast - ( - final tonkadur.fate.v1.lang.computation.Cast n - ) - throws Throwable - { - throw new UnhandledASTElementException(); - } - - public void visit_cond_value - ( - final tonkadur.fate.v1.lang.computation.CondValue n - ) - throws Throwable - { - throw new UnhandledASTElementException(); - } - - public void visit_constant - ( - final tonkadur.fate.v1.lang.computation.Constant n - ) - throws Throwable - { - throw new UnhandledASTElementException(); - } - - public void visit_count_operator - ( - final tonkadur.fate.v1.lang.computation.CountOperator n - ) - throws Throwable - { - throw new UnhandledASTElementException(); - } - - public void visit_field_reference - ( - final tonkadur.fate.v1.lang.computation.FieldReference n - ) - throws Throwable - { - throw new UnhandledASTElementException(); - } - - public void visit_if_else_value - ( - final tonkadur.fate.v1.lang.computation.IfElseValue n - ) - throws Throwable - { - throw new UnhandledASTElementException(); - } - - public void visit_is_member_operator - ( - final tonkadur.fate.v1.lang.computation.IsMemberOperator n - ) - throws Throwable - { - throw new UnhandledASTElementException(); - } - - public void visit_macro_value_call - ( - final tonkadur.fate.v1.lang.computation.MacroValueCall n - ) - throws Throwable - { - throw new UnhandledASTElementException(); - } - - public void visit_newline - ( - final tonkadur.fate.v1.lang.computation.Newline n - ) - throws Throwable - { - throw new UnhandledASTElementException(); - } - - public void visit_operation - ( - final tonkadur.fate.v1.lang.computation.Operation n - ) - throws Throwable - { - throw new UnhandledASTElementException(); - } - - public void visit_paragraph - ( - final tonkadur.fate.v1.lang.computation.Paragraph n - ) - throws Throwable - { - throw new UnhandledASTElementException(); - } - - public void visit_parameter_reference - ( - final tonkadur.fate.v1.lang.computation.ParameterReference n - ) - throws Throwable - { - throw new UnhandledASTElementException(); - } - - public void visit_ref_operator - ( - final tonkadur.fate.v1.lang.computation.RefOperator n - ) - throws Throwable - { - throw new UnhandledASTElementException(); - } - - public void visit_text_with_effect - ( - final tonkadur.fate.v1.lang.computation.TextWithEffect n - ) - throws Throwable - { - throw new UnhandledASTElementException(); - } - - public void visit_value_to_rich_text - ( - final tonkadur.fate.v1.lang.computation.ValueToRichText n - ) - throws Throwable - { - throw new UnhandledASTElementException(); - } - - public void visit_variable_reference - ( - final tonkadur.fate.v1.lang.computation.VariableReference n - ) - throws Throwable - { - throw new UnhandledASTElementException(); - } -} 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 d9162bd..914a836 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 @@ -33,13 +33,19 @@ import tonkadur.wyrd.v1.lang.instruction.IfElseInstruction; import tonkadur.wyrd.v1.lang.instruction.NOP; import tonkadur.wyrd.v1.lang.instruction.Remove; import tonkadur.wyrd.v1.lang.instruction.ResolveChoices; +import tonkadur.wyrd.v1.lang.instruction.SequenceCall; import tonkadur.wyrd.v1.lang.instruction.SetValue; import tonkadur.wyrd.v1.lang.instruction.While; -import tonkadur.wyrd.v1.compiler.util.BinarySearch; import tonkadur.wyrd.v1.compiler.util.AnonymousVariableManager; +import tonkadur.wyrd.v1.compiler.util.BinarySearch; +import tonkadur.wyrd.v1.compiler.util.InsertAt; +import tonkadur.wyrd.v1.compiler.util.IterativeSearch; +import tonkadur.wyrd.v1.compiler.util.RemoveAllOf; +import tonkadur.wyrd.v1.compiler.util.RemoveAt; -public class InstructionCompiler extends FateVisitor +public class InstructionCompiler +implements tonkadur.fate.v1.lang.meta.InstructionVisitor { protected final AnonymousVariableManager anonymous_variables; protected final World wyrd_world; @@ -78,14 +84,18 @@ public class InstructionCompiler extends FateVisitor return result; } - protected ComputationCompiler new_computation_compiler () + protected ComputationCompiler new_computation_compiler + ( + final boolean expect_ref + ) { return new ComputationCompiler ( macro_manager, anonymous_variables, - wyrd_world + wyrd_world, + expect_ref ); } @@ -135,16 +145,16 @@ public class InstructionCompiler extends FateVisitor * * ) */ + /* final Ref element_as_ref, collection_as_ref, collection_size_as_ref; final Ref element_found, element_index, collection_size, next_index; final ComputationCompiler element_compiler, reference_compiler; final Type element_type; final List while_body, else_branch; - /**** Getting the Element as a ref ****/ - element_compiler = new_computation_compiler(); + element_compiler = new_computation_compiler(false); - ae.get_element().visit(element_compiler); + ae.get_element().get_visited_by(element_compiler); result.addAll(element_compiler.get_pre_instructions()); @@ -157,21 +167,14 @@ public class InstructionCompiler extends FateVisitor new SetValue(element_as_ref, element_compiler.get_computation()) ); - /**** Getting the Collection as a ref ****/ - reference_compiler = new_computation_compiler(); + reference_compiler = new_computation_compiler(true); - ae.get_collection().visit(reference_compiler); + ae.get_collection().get_visited_by(reference_compiler); result.addAll(reference_compiler.get_pre_instructions()); - if (!(reference_compiler.get_computation() instanceof Ref)) - { - /* TODO: error. */ - } - - collection_as_ref = (Ref) reference_compiler.get_computation(); + collection_as_ref = reference_compiler.get_ref(); - /**** Finding the element in the collection ****/ element_found = anonymous_variable.reserve(Type.BOOLEAN); element_index = anonymous_variable.reserve(Type.INT); collection_size = anonymous_variable.reserve(Type.INT); @@ -309,6 +312,7 @@ public class InstructionCompiler extends FateVisitor reference_compiler.free_anonymous_variables(); element_compiler.free_anonymous_variables(); + */ } protected void add_element_to_list @@ -330,20 +334,15 @@ public class InstructionCompiler extends FateVisitor final Ref collection_as_ref; final ComputationCompiler element_compiler, reference_compiler; - element_compiler = new_computation_compiler(); + element_compiler = new_computation_compiler(false); - ae.get_element().visit(element_compiler); + ae.get_element().get_visited_by(element_compiler); - reference_compiler = new_computation_compiler(); + reference_compiler = new_computation_compiler(true); - ae.get_collection().visit(reference_compiler); + ae.get_collection().get_visited_by(reference_compiler); - if (!(reference_compiler.get_computation() instanceof Ref)) - { - /* TODO: error. */ - } - - collection_as_ref = (Ref) reference_compiler.get_computation(); + collection_as_ref = reference_compiler.get_ref(); result.addAll(reference_compiler.get_pre_instructions()); result.addAll(element_compiler.get_pre_instructions()); @@ -358,10 +357,11 @@ public class InstructionCompiler extends FateVisitor ( new Cast ( - new Size(reference_compiler.get_computation()), + new Size(collection_as_ref), Type.STRING ) - ) + ), + element_compiler.get_computation().get_type() ), element_compiler.get_computation() ) @@ -415,9 +415,9 @@ public class InstructionCompiler extends FateVisitor */ final ComputationCompiler cc; - cc = new_computation_compiler(); + cc = new_computation_compiler(false); - a.get_condition().visit(cc); + a.get_condition().get_visited_by(cc); result.addAll(cc.get_pre_instructions()); result.add(new Assert(cc.get_computation())); @@ -435,24 +435,20 @@ public class InstructionCompiler extends FateVisitor * Wyrd: * */ + /* final ComputationCompiler reference_compiler; final Ref iterator, collection_ref; final List while_body; - reference_compiler = new_computation_compiler(); + reference_compiler = new_computation_compiler(true); - c.get_collection().visit(reference_compiler); + c.get_collection().get_visited_by(reference_compiler); result.addAll(reference_compiler.get_pre_instructions()); iterator = anonymous_variables.reserve(Type.INT); - if (!(reference_compiler.get_computation() instanceof Ref)) - { - /* TODO: error. */ - } - - collection_ref = (Ref) reference_compiler.get_computation(); + collection_ref = reference_compiler.get_ref(); while_body.add ( @@ -493,6 +489,7 @@ public class InstructionCompiler extends FateVisitor anonymous_variables.release(iterator); reference_compiler.free_anonymous_variables(); + */ } @Override @@ -527,7 +524,7 @@ public class InstructionCompiler extends FateVisitor List previous_else_branch; List current_else_branch; - previous_else_branch = results; + previous_else_branch = result; for ( @@ -544,9 +541,9 @@ public class InstructionCompiler extends FateVisitor current_else_branch = new ArrayList(); ic = new_instruction_compiler(); - cc = new_computation_compiler(); + cc = new_computation_compiler(false); - branch.get_car().visit(cc); + branch.get_car().get_visited_by(cc); previous_else_branch.addAll(cc.get_pre_instructions()); previous_else_branch.add @@ -564,7 +561,7 @@ public class InstructionCompiler extends FateVisitor cc.free_anonymous_variables(); } - previous_else_branch.add(Collections.singleton(new NOP())); + previous_else_branch.add(new NOP()); } @Override @@ -578,12 +575,12 @@ public class InstructionCompiler extends FateVisitor */ final ComputationCompiler cc; - cc = new_computation_compiler(); + cc = new_computation_compiler(false); - n.get_content.visit(cc); + n.get_content().get_visited_by(cc); result.addAll(cc.get_pre_instructions()); - result.add(new Display(cc.get_computation())); + result.add(new Display(Collections.singletonList(cc.get_computation()))); cc.free_anonymous_variables(); } @@ -614,9 +611,9 @@ public class InstructionCompiler extends FateVisitor { final ComputationCompiler cc; - cc = new_computation_compiler(); + cc = new_computation_compiler(false); - fate_computation.visit(cc); + fate_computation.get_visited_by(cc); result.addAll(cc.get_pre_instructions()); @@ -624,10 +621,7 @@ public class InstructionCompiler extends FateVisitor parameters.add(cc.get_computation()); } - result.add - ( - new EventCall(n.get_event().get_name(), cc.get_computation()) - ); + result.add(new EventCall(n.get_event().get_name(), parameters)); for (final ComputationCompiler cc: cc_list) { @@ -651,13 +645,13 @@ public class InstructionCompiler extends FateVisitor final InstructionCompiler if_true_ic; final InstructionCompiler if_false_ic; - cc = new_computation_compiler(); + cc = new_computation_compiler(false); if_true_ic = new_instruction_compiler(); if_false_ic = new_instruction_compiler(); - n.get_condition.visit(cc); - n.get_if_true().visit(if_true_ic); - n.get_if_false().visit(if_false_ic); + n.get_condition().get_visited_by(cc); + n.get_if_true().get_visited_by(if_true_ic); + n.get_if_false().get_visited_by(if_false_ic); result.addAll(cc.get_pre_instructions()); result.add @@ -688,11 +682,11 @@ public class InstructionCompiler extends FateVisitor final ComputationCompiler cc; final InstructionCompiler if_true_ic; - cc = new_computation_compiler(); + cc = new_computation_compiler(false); if_true_ic = new_instruction_compiler(); - n.get_condition.visit(cc); - n.get_if_true().visit(if_true_ic); + n.get_condition().get_visited_by(cc); + n.get_if_true().get_visited_by(if_true_ic); result.addAll(cc.get_pre_instructions()); result.add @@ -723,14 +717,14 @@ public class InstructionCompiler extends FateVisitor for ( final tonkadur.fate.v1.lang.meta.Instruction fate_instruction: - n.get_content() + n.get_instructions() ) { final InstructionCompiler ic; ic = new_instruction_compiler(); - fate_instruction.visit(ic); + fate_instruction.get_visited_by(ic); result.addAll(ic.get_result()); } @@ -748,12 +742,11 @@ public class InstructionCompiler extends FateVisitor * * Wyrd */ - final tonkadur.fate.v1.lang.meta.Instruction fate_macro_root; final List cc_list; - final List parameters; + final List parameters; cc_list = new ArrayList(); - parameters = new ArrayList(); + parameters = new ArrayList(); for ( @@ -763,27 +756,24 @@ public class InstructionCompiler extends FateVisitor { final ComputationCompiler cc; - cc = new_computation_compiler(); + cc = new_computation_compiler(true); - fate_computation.visit(cc); + fate_computation.get_visited_by(cc); result.addAll(cc.get_pre_instructions()); cc_list.add(cc); - parameters.add(cc.get_computation()); + parameters.add(cc.get_ref()); } - fate_macro_root = - macro_manager.push_context(n.get_name(), cc.get_computation()); - - fate_macro_root.visit(this); + macro_manager.push(n.get_macro(), parameters); + n.get_macro().get_root().get_visited_by(this); + macro_manager.pop(); for (final ComputationCompiler cc: cc_list) { cc.free_anonymous_variables(); } - - macro_manager.pop_context(); } @Override @@ -801,10 +791,10 @@ public class InstructionCompiler extends FateVisitor final ComputationCompiler cc; final InstructionCompiler ic; - cc = new_computation_compiler(); + cc = new_computation_compiler(false); ic = new_instruction_compiler(); - n.get_text().visit(cc); + n.get_text().get_visited_by(cc); result.addAll(cc.get_pre_instructions()); @@ -814,7 +804,7 @@ public class InstructionCompiler extends FateVisitor n.get_effects() ) { - fate_instruction.visit(ic); + fate_instruction.get_visited_by(ic); } result.add(new AddChoice(cc.get_computation(), ic.get_result())); @@ -844,10 +834,10 @@ public class InstructionCompiler extends FateVisitor n.get_choices() ) { - fate_instruction.visit(this); + fate_instruction.get_visited_by(this); } - fate_instruction.add(new ResolveChoices()); + result.add(new ResolveChoices()); } @Override @@ -862,228 +852,121 @@ public class InstructionCompiler extends FateVisitor * (remove_all_of element collection) * * Wyrd: - * (declare_variable int .index) - * (declare_variable int .limit) * (declare_variable .elem) - * (declare_variable int .found) - * (set .index 0) - * (set .limit (- (size collection) 1)) - * (set .elem element) ;; avoid re-computing element - * (set .found 0) - * (while (< .index .limit) - * (ifelse (= (var .found) 0) - * ( - * (nop) - * ) - * ( - * (ifelse (= (var .elem) (var collection[.index])) - * (set .found (+ (var .found) 1)) - * (nop) - * ) - * (set - * collection[.index] - * (var collection[(+ (var .index) (var .found))]) - * ) - * ) + * (declare_variable int .collection_size) + * + * (set .elem element) + * (set .collection_size (size collection)) + * + * + * > + * + * (ifelse (var .found) + * + * (nop) * ) - * (set .index (+ (var .index) 1)) - * ) - * (while (> (var .found) 0) - * (set .found (- (var .found) 1)) - * (remove collection[(- (var .limit) (var .found))]) - * ) + * > */ final ComputationCompiler elem_cc, collection_cc; - final Ref index, limit, elem, found; - final Ref collection_as_ref; - final List while_body, while_body2, if_false_body; + final Ref elem, collection_size, collection; - elem_cc = new_computation_compiler(); - collection_cc = new_computation_compiler(); + elem_cc = new_computation_compiler(false); + collection_cc = new_computation_compiler(true); - while_body = new ArrayList(); - while_body2 = new ArrayList(); - if_false_body = new ArrayList(); + elem = anonymous_variables.reserve(elem_cc.get_computation().get_type()); + collection_size = anonymous_variables.reserve(Type.INT); - /* Get element with a minimum of anonymous variables */ - n.get_element().visit(elem_cc); + n.get_element().get_visited_by(elem_cc); + n.get_collection().get_visited_by(collection_cc); result.addAll(elem_cc.get_pre_instructions()); + result.addAll(collection_cc.get_pre_instructions()); - elem = anonymous_variable.reserve(elem_cc.get_computation().get_type()); + collection = collection_cc.get_ref(); result.add(new SetValue(elem, elem_cc.get_computation())); + result.add(new SetValue(collection_size, new Size(collection))); elem_cc.free_anonymous_variables(); - /****/ - - n.get_collection().visit(collection_cc); - if (!(collection_cc.get_computation() instanceof Ref)) + if + ( + ( + (tonkadur.fate.v1.lang.type.CollectionType) + n.get_collection().get_type() + ).is_set() + ) { - /* TODO: error. */ - } + final Computation value_of_elem, value_of_collection_size; + final Ref index, found; - result.addAll(collection_cc.get_pre_instructions()); - - collection_as_ref = (Ref) collection_cc.get_computation(); + index = anonymous_variables.reserve(Type.INT); + found = anonymous_variables.reserve(Type.BOOLEAN); - index = anonymous_variable.reserve(Type.INT); - limit = anonymous_variable.reserve(Type.INT); - found = anonymous_variable.reserve(Type.INT); + value_of_elem = new ValueOf(elem); + value_of_collection_size = new ValueOf(collection_size); - result.addAll(collection_cc.get_pre_instructions()); - - result.add(new SetValue(index, new Constant(Type.INT, "0"))); - result.add - ( - new SetValue + result.addAll ( - limit, - Operation.minus + BinarySearch.generate ( - new Size(collection_as_ref), - new Constant(Type.INT, "1") + anonymous_variables, + value_of_elem, + value_of_collection_size, + collection, + found, + index ) - ) - ); - result.add(new SetValue(found, new Constant(Type.INT, "0"))); - - if_false_body.add - ( - new IfElseInstruction - ( - Operation.equals - ( - new ValueOf(elem), - new ValueOf - ( - new RelativeRef - ( - collection_as_ref, - Collections.singletonList - ( - new Cast(new ValueOf(index), Type.STRING) - ) - ) - ) - ), - Collections.singletonList - ( - new SetValue - ( - found, - Operation.plus - ( - new ValueOf(found), - new Constant(Type.INT, "1") - ) - ) - ), - new NOP() - ) - ); + ); - if_false_body.add - ( - new SetValue + result.add ( - new RelativeRef - ( - collection_as_ref, - Collections.singletonList - ( - new Cast(new ValueOf(index), Type.STRING) - ) - ), - new ValueOf + new IfElseInstruction ( - new RelativeRef + new ValueOf(found), + RemoveAt.generate ( - collection_as_ref, - Collections.singletonList - ( - new Cast - ( - Operation.plus(new ValueOf(index), new ValueOf(found)), - Type.STRING - ) - ) - ) + anonymous_variables, + index, + value_of_collection_size, + collection + ), + Collections.singletonList(new NOP()) ) - ) - ); - - while_body.add - ( - new IfElseInstruction - ( - Operation.equal(new ValueOf(found), new Constant(Type.INT, "0")), - Collections.singletonList(new NOP()), - if_false_body - ) - ); - - while_body.add - ( - new SetValue - ( - index, - Operation.plus(new ValueOf(index), new Constant(Type.INT, "1")) - ) - ); - - result.add - ( - new While - ( - Operation.less_than(new ValueOf(index), new ValueOf(limit)), - while_body - ) - ); - - while_body2.add - ( - new SetValue - ( - found, - Operation.minus(new ValueOf(found), new Constant(Type.INT, "1")) - ) - ); + ); - while_body2.add - ( - new Remove + anonymous_variables.release(index); + anonymous_variables.release(found); + } + else + { + result.addAll ( - new RelativeRef + RemoveAllOf.generate ( - collection_as_ref, - Collections.singletonList - ( - new Cast - ( - Operation.minus(new ValueOf(limit), new ValueOf(found)), - Type.STRING - ) - ) + anonymous_variables, + new ValueOf(elem), + new ValueOf(collection_size), + collection ) - ) - ); - - result.add - ( - new While - ( - Operation.greater_than - ( - new ValueOf(found), - new Constant(Type.INT, "0") - ), - while_body2 - ) - ); + ); + } collection_cc.free_anonymous_variables(); + + anonymous_variables.release(elem); + anonymous_variables.release(collection_size); } @Override @@ -1098,242 +981,126 @@ public class InstructionCompiler extends FateVisitor * (remove_element element collection) * * Wyrd: - * (declare_variable int .index) - * (declare_variable int .limit) * (declare_variable .elem) + * (declare_variable int .collection_size) * (declare_variable boolean .found) - * (declare_variable int .next) - * (set .index 0) - * (set .limit (- (size collection) 1)) - * (set .elem element) ;; avoid re-computing element - * (set .found false) - * (while (< .index .limit) - * (set .next (+ (var index) 1)) - * (ifelse (var .found) - * ( - * (set collection[.index] (var collection[.next])) - * ) - * (ifelse (= (var .elem) (var collection[.index])) - * (;; if_true_body - * (set .found true) - * (set collection[.index] (var collection[.next])) - * ) - * (nop) - * ) - * ) - * (set .index (var .next)) - * ) - * (ifelse (or (var .found) (= (var .elem) (var collection[.index]))) - * (remove collection[.limit]) + * (declare_variable int .index) + * + * (set .elem element) + * (set .collection_size (size collection)) + * + * + * > + * + * > + * + * (if (var .found) + * * (nop) * ) */ final ComputationCompiler elem_cc, collection_cc; - final Ref index, limit, elem, found, next; - final Ref collection_as_ref; - final List while_body, if_true_body; + final Ref elem, collection_size, found, index; + final Ref collection; + final Computation value_of_collection_size; - elem_cc = new_computation_compiler(); - collection_cc = new_computation_compiler(); + elem_cc = new_computation_compiler(false); + collection_cc = new_computation_compiler(true); - while_body = new ArrayList(); - if_true_body = new ArrayList(); + elem = anonymous_variables.reserve(elem_cc.get_computation().get_type()); + collection_size = anonymous_variables.reserve(Type.INT); + found = anonymous_variables.reserve(Type.BOOLEAN); + index = anonymous_variables.reserve(Type.INT); - /* Minimize variable usage for element ***********/ - n.get_element().visit(elem_cc); + n.get_element().get_visited_by(elem_cc); + n.get_collection().get_visited_by(collection_cc); result.addAll(elem_cc.get_pre_instructions()); - - elem = anonymous_variable.reserve(elem_cc.get_computation().get_type()); - - result.add(new SetValue(elem, elem_cc.get_computation())); - - elem_cc.free_anonymous_variables(); - /***********/ - - n.get_collection().visit(collection_cc); - result.addAll(collection_cc.get_pre_instructions()); - if (!(collection_cc.get_computation() instanceof Ref)) - { - /* TODO: error. */ - } + collection = collection_cc.get_ref(); - collection_as_ref = (Ref) collection_cc.get_computation(); + value_of_collection_size = new ValueOf(collection_size); - index = anonymous_variable.reserve(Type.INT); - limit = anonymous_variable.reserve(Type.INT); - found = anonymous_variable.reserve(Type.BOOLEAN); - next = anonymous_variable.reserve(Type.INT); + result.add(new SetValue(elem, elem_cc.get_computation())); + result.add(new SetValue(collection_size, new Size(collection))); - result.add(new SetValue(index, new Constant(Type.INT, "0"))); - result.add - ( - new SetValue - ( - limit, - Operation.minus - ( - new Size(collection_as_ref), - new Constant(Type.INT, "1") - ) - ) - ); - result.add(new SetValue(found, Constant.FALSE)); + elem_cc.free_anonymous_variables(); - if_true_branch.add(new SetValue(found, Constant.TRUE)); - if_true_branch.add + if ( - new SetValue ( - /* collection[.index] */ - new RelativeRef - ( - collection_as_ref, - Collections.singletonList - ( - new Cast(newValueOf(index), Type.STRING) - ) - ), - /* (var collection[.next]) */ - new ValueOf - ( - new RelativeRef - ( - collection_as_ref, - Collections.singletonList - ( - new Cast(new ValueOf(next), Type.STRING) - ) - ) - ) - ) - ); - - while_body.add - ( - new SetValue + (tonkadur.fate.v1.lang.type.CollectionType) + n.get_collection().get_type() + ).is_set() + ) + { + result.addAll ( - next, - Operation.plus + BinarySearch.generate ( - new ValueOf(index), - new Constant(Type.INT, "1") + anonymous_variables, + new ValueOf(elem), + value_of_collection_size, + collection, + found, + index ) - ) - ); - - while_body.add - ( - new IfElseInstruction + ); + } + else + { + result.addAll ( - new ValueOf(found), - Collections.singletonList + IterativeSearch.generate ( - new SetValue - ( - new RelativeRef - ( - collection_as_ref, - Collections.singletonList - ( - new Cast(newValueOf(index), Type.STRING) - ) - ), - new ValueOf - ( - new RelativeRef - ( - collection_as_ref, - Collections.singletonList - ( - new Cast(new ValueOf(next), Type.STRING) - ) - ) - ) - ) - ), - Collections.singletonList - ( - new IfElseInstruction - ( - Operation.equals - ( - new ValueOf(elem), - new ValueOf - ( - new RelativeRef - ( - collection_as_ref, - Collections.singletonList - ( - new Cast(newValueOf(index), Type.STRING) - ) - ) - ) - ), - if_true_branch, - Collections.singleton(new NOP()) - ) + anonymous_variables, + new ValueOf(elem), + value_of_collection_size, + collection, + found, + index ) - ) - ); + ); + } - result.add - ( - new While - ( - Operation.less_than(new ValueOf(index), new ValueOf(limit)), - while_body - ) - ); + anonymous_variables.release(elem); result.add ( new IfElseInstruction ( - Operation.or - ( - new ValueOf(found), - Operation.equals - ( - new ValueOf(elem), - new ValueOf - ( - new RelativeRef - ( - collection_as_ref, - Collections.singletonList - ( - new Cast(newValueOf(index), Type.STRING) - ) - ) - ) - ) - ), - new Remove + new ValueOf(found), + RemoveAt.generate ( - new RelativeRef - ( - collection_as_ref, - Collections.singletonList - ( - new Cast(newValueOf(limit), Type.STRING) - ) - ) + anonymous_variables, + index, + value_of_collection_size, + collection ), - new NOP() + Collections.singletonList(new NOP()) ) ); - collection_cc.free_anonymous_variables(); - anonymous_variables.release(index); - anonymous_variables.release(limit); - anonymous_variables.release(elem); anonymous_variables.release(found); - anonymous_variables.release(next); + anonymous_variables.release(collection_size); + + collection_cc.free_anonymous_variables(); } @Override @@ -1363,21 +1130,21 @@ public class InstructionCompiler extends FateVisitor */ final ComputationCompiler value_cc, ref_cc; - value_cc = new_computation_compiler(); - ref_cc = new_computation_compiler(); + value_cc = new_computation_compiler(false); + ref_cc = new_computation_compiler(true); - n.get_value().visit(value_cc); + n.get_value().get_visited_by(value_cc); result.addAll(value_cc.get_pre_instructions()); - n.get_reference().visit(ref_cc); + n.get_reference().get_visited_by(ref_cc); result.addAll(ref_cc.get_pre_instructions()); result.add ( - new SetValue(ref_cc.get_computation(), value_cc.get_computation()) + new SetValue(ref_cc.get_ref(), value_cc.get_computation()) ); - element_cc.free_anonymous_variables(); + value_cc.free_anonymous_variables(); ref_cc.free_anonymous_variables(); } } 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 new file mode 100644 index 0000000..29256e0 --- /dev/null +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/MacroManager.java @@ -0,0 +1,50 @@ +package tonkadur.wyrd.v1.compiler.fate.v1; + +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Stack; + +import tonkadur.wyrd.v1.lang.computation.Ref; + +public class MacroManager +{ + protected final Stack> context_stack; + + public MacroManager () + { + context_stack = new Stack>(); + } + + public void pop () + { + context_stack.pop(); + } + + public void push + ( + tonkadur.fate.v1.lang.Macro macro, + final List parameter_refs + ) + { + final Iterator pri; + final Iterator pre; + final Map parameters; + + parameters = new HashMap(); + + pri = parameter_refs.iterator(); + pre = macro.get_parameters().get_entries().iterator(); + + while (pri.hasNext()) + { + parameters.put(pre.next().get_name(), pri.next()); + } + } + + public Ref get_parameter_ref (final String parameter) + { + return context_stack.peek().get(parameter); + } +} 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 f16537f..6857e58 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/util/BinarySearch.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/util/BinarySearch.java @@ -29,8 +29,8 @@ public class BinarySearch /* * (Computation element) - * (declare_variable global collection) * (Computation int collection_size) + * (declare_variable global collection) * (declare_variable global boolean result_found) * (declare_variable global index result_index) * @@ -70,8 +70,8 @@ public class BinarySearch ( final AnonymousVariableManager anonymous_variables, final Computation target, - final Ref collection, final Computation collection_size, + final Ref collection, final Ref result_was_found, final Ref result_index ) 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 aa62bbd..5ce409d 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/util/IterativeSearch.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/util/IterativeSearch.java @@ -28,8 +28,8 @@ public class IterativeSearch /* * (Computation target) - * (declare_variable global collection) * (Computation int collection_size) + * (declare_variable global collection) * (declare_variable global boolean result_found) * (declare_variable global index result_index) * @@ -51,8 +51,8 @@ public class IterativeSearch ( final AnonymousVariableManager anonymous_variables, final Computation target, - final Ref collection, final Computation collection_size, + final Ref collection, final Ref result_was_found, final Ref result_index ) diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/util/RemoveAll.java b/src/core/src/tonkadur/wyrd/v1/compiler/util/RemoveAll.java deleted file mode 100644 index 699f18d..0000000 --- a/src/core/src/tonkadur/wyrd/v1/compiler/util/RemoveAll.java +++ /dev/null @@ -1,250 +0,0 @@ -package tonkadur.wyrd.v1.compiler.util; - -import java.util.List; -import java.util.ArrayList; -import java.util.Collections; - -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.IfElseInstruction; -import tonkadur.wyrd.v1.lang.instruction.NOP; -import tonkadur.wyrd.v1.lang.instruction.Remove; -import tonkadur.wyrd.v1.lang.instruction.SetValue; -import tonkadur.wyrd.v1.lang.instruction.While; - -public class RemoveAll -{ - /* Utility Class */ - private RemoveAll () {} - - /* - * (Computation element) - * (Computation collection_size) - * (declare_variable global collection) - * - * (declare_variable int .end) - * (declare_variable int .index) - * (declare_variable int .found) - * - * (set .index 0) - * (set .found 0) - * (set .end (- collection_size 1)) - * - * (while (< (var .index) (var .end)) - * ;; while_body0 - * (ifelse (= (var .found) 0) - * ( - * (nop) - * ) - * ( - * (ifelse (= element (var collection[.index])) - * ( - * ;; if_false_true_body - * (set .found (+ (var .found) 1)) - * (set .end (- (var .end) 1)) - * ) - * (nop) - * ) - * (set - * collection[.index] - * (var collection[(+ (var .index) (var .found))]) - * ) - * ) - * ) - * (set index ((val .index) + 1)) - * ) - * - * (while (> (var .found) 0) - * ;; while_body1 - * (remove collection[(+ (var .end) (var .found))]) - * (set .found (- (var .found) 1)) - * ) - */ - public static List generate - ( - final AnonymousVariableManager anonymous_variables, - final Computation element, - final Computation collection_size, - final Ref collection - ) - { - final List result; - final List while_body0, while_body1, if_false_body; - final List if_false_true_body; - final List nop_branch; - 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; - final Ref collection_at_index; - - result = new ArrayList(); - - while_body0 = new ArrayList(); - while_body1 = new ArrayList(); - if_false_body = new ArrayList(); - if_false_true_body = new ArrayList(); - - nop_branch = Collections.singletonList(new NOP()); - - element_type = element.get_type(); - - index = anonymous_variables.reserve(Type.INT); - found = anonymous_variables.reserve(Type.INT); - end = anonymous_variables.reserve(Type.INT); - - value_of_index = new ValueOf(index); - 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"); - - collection_at_index = - new RelativeRef - ( - collection, - Collections.singletonList - ( - new Cast(value_of_index, Type.STRING) - ), - element_type - ); - - /* (set .index 0) */ - result.add(new SetValue(index, const_0)); - /* (set .found 0) */ - result.add(new SetValue(found, const_0)); - - /* (set .end (- (collection_size) 1) */ - result.add - ( - new SetValue(end, Operation.minus(collection_size, const_1)) - ); - - /* - * ( - * (set .found (+ (var .found) 1)) - * (set .end (- (var .end) 1)) - * ) - */ - if_false_true_body.add - ( - new SetValue(found, Operation.plus(value_of_found, const_1)) - ); - if_false_true_body.add - ( - new SetValue(found, Operation.minus(value_of_found, const_1)) - ); - - if_false_body.add - ( - new IfElseInstruction - ( - Operation.equals(element, new ValueOf(collection_at_index)), - if_false_true_body, - nop_branch - ) - ); - - /* - * (set - * collection[.index] - * (var collection[(+ (var .index) (var .found))]) - * ) - */ - if_false_body.add - ( - new SetValue - ( - collection_at_index, - new RelativeRef - ( - collection, - Collections.singletonList - ( - new Cast - ( - Operation.plus(value_of_index, value_of_found), - Type.STRING - ) - ), - element_type - ) - ) - ); - - while_body0.add - ( - new IfElseInstruction - ( - Operation.equals(value_of_found, const_0), - nop_branch, - if_false_body - ) - ); - - while_body0.add - ( - new SetValue(index, Operation.plus(value_of_index, const_1)) - ); - - result.add - ( - new While - ( - Operation.less_than(value_of_index, value_of_end), - while_body0 - ) - ); - - while_body1.add - ( - new Remove - ( - new RelativeRef - ( - collection, - Collections.singletonList - ( - new Cast - ( - Operation.plus(value_of_end, value_of_found), - Type.STRING - ) - ), - element_type - ) - ) - ); - while_body1.add - ( - new SetValue(found, Operation.minus(value_of_found, const_1)) - ); - - result.add - ( - new While - ( - Operation.less_than(value_of_found, const_0), - while_body1 - ) - ); - - anonymous_variables.release(index); - anonymous_variables.release(found); - anonymous_variables.release(end); - - return result; - } -} diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/util/RemoveAllOf.java b/src/core/src/tonkadur/wyrd/v1/compiler/util/RemoveAllOf.java new file mode 100644 index 0000000..78d81ad --- /dev/null +++ b/src/core/src/tonkadur/wyrd/v1/compiler/util/RemoveAllOf.java @@ -0,0 +1,250 @@ +package tonkadur.wyrd.v1.compiler.util; + +import java.util.List; +import java.util.ArrayList; +import java.util.Collections; + +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.IfElseInstruction; +import tonkadur.wyrd.v1.lang.instruction.NOP; +import tonkadur.wyrd.v1.lang.instruction.Remove; +import tonkadur.wyrd.v1.lang.instruction.SetValue; +import tonkadur.wyrd.v1.lang.instruction.While; + +public class RemoveAllOf +{ + /* Utility Class */ + private RemoveAllOf () {} + + /* + * (Computation element) + * (Computation collection_size) + * (declare_variable global collection) + * + * (declare_variable int .end) + * (declare_variable int .index) + * (declare_variable int .found) + * + * (set .index 0) + * (set .found 0) + * (set .end (- collection_size 1)) + * + * (while (< (var .index) (var .end)) + * ;; while_body0 + * (ifelse (= (var .found) 0) + * ( + * (nop) + * ) + * ( + * (ifelse (= element (var collection[.index])) + * ( + * ;; if_false_true_body + * (set .found (+ (var .found) 1)) + * (set .end (- (var .end) 1)) + * ) + * (nop) + * ) + * (set + * collection[.index] + * (var collection[(+ (var .index) (var .found))]) + * ) + * ) + * ) + * (set index ((val .index) + 1)) + * ) + * + * (while (> (var .found) 0) + * ;; while_body1 + * (remove collection[(+ (var .end) (var .found))]) + * (set .found (- (var .found) 1)) + * ) + */ + public static List generate + ( + final AnonymousVariableManager anonymous_variables, + final Computation element, + final Computation collection_size, + final Ref collection + ) + { + final List result; + final List while_body0, while_body1, if_false_body; + final List if_false_true_body; + final List nop_branch; + 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; + final Ref collection_at_index; + + result = new ArrayList(); + + while_body0 = new ArrayList(); + while_body1 = new ArrayList(); + if_false_body = new ArrayList(); + if_false_true_body = new ArrayList(); + + nop_branch = Collections.singletonList(new NOP()); + + element_type = element.get_type(); + + index = anonymous_variables.reserve(Type.INT); + found = anonymous_variables.reserve(Type.INT); + end = anonymous_variables.reserve(Type.INT); + + value_of_index = new ValueOf(index); + 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"); + + collection_at_index = + new RelativeRef + ( + collection, + Collections.singletonList + ( + new Cast(value_of_index, Type.STRING) + ), + element_type + ); + + /* (set .index 0) */ + result.add(new SetValue(index, const_0)); + /* (set .found 0) */ + result.add(new SetValue(found, const_0)); + + /* (set .end (- (collection_size) 1) */ + result.add + ( + new SetValue(end, Operation.minus(collection_size, const_1)) + ); + + /* + * ( + * (set .found (+ (var .found) 1)) + * (set .end (- (var .end) 1)) + * ) + */ + if_false_true_body.add + ( + new SetValue(found, Operation.plus(value_of_found, const_1)) + ); + if_false_true_body.add + ( + new SetValue(found, Operation.minus(value_of_found, const_1)) + ); + + if_false_body.add + ( + new IfElseInstruction + ( + Operation.equals(element, new ValueOf(collection_at_index)), + if_false_true_body, + nop_branch + ) + ); + + /* + * (set + * collection[.index] + * (var collection[(+ (var .index) (var .found))]) + * ) + */ + if_false_body.add + ( + new SetValue + ( + collection_at_index, + new RelativeRef + ( + collection, + Collections.singletonList + ( + new Cast + ( + Operation.plus(value_of_index, value_of_found), + Type.STRING + ) + ), + element_type + ) + ) + ); + + while_body0.add + ( + new IfElseInstruction + ( + Operation.equals(value_of_found, const_0), + nop_branch, + if_false_body + ) + ); + + while_body0.add + ( + new SetValue(index, Operation.plus(value_of_index, const_1)) + ); + + result.add + ( + new While + ( + Operation.less_than(value_of_index, value_of_end), + while_body0 + ) + ); + + while_body1.add + ( + new Remove + ( + new RelativeRef + ( + collection, + Collections.singletonList + ( + new Cast + ( + Operation.plus(value_of_end, value_of_found), + Type.STRING + ) + ), + element_type + ) + ) + ); + while_body1.add + ( + new SetValue(found, Operation.minus(value_of_found, const_1)) + ); + + result.add + ( + new While + ( + Operation.less_than(value_of_found, const_0), + while_body1 + ) + ); + + anonymous_variables.release(index); + anonymous_variables.release(found); + anonymous_variables.release(end); + + return result; + } +} diff --git a/src/core/src/tonkadur/wyrd/v1/lang/World.java b/src/core/src/tonkadur/wyrd/v1/lang/World.java index 3cb0397..e8e86ba 100644 --- a/src/core/src/tonkadur/wyrd/v1/lang/World.java +++ b/src/core/src/tonkadur/wyrd/v1/lang/World.java @@ -39,6 +39,11 @@ public class World global_instructions = new ArrayList(); } + public void add_required_extension (final String name) + { + required_extensions.add(name); + } + public DictType get_dict_type (final String name) { return dict_types.get(name); -- cgit v1.2.3-70-g09d2