| summaryrefslogtreecommitdiff |
diff options
| author | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2021-09-08 21:14:48 +0200 |
|---|---|---|
| committer | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2021-09-08 21:14:48 +0200 |
| commit | a12e2813b03cbb1253d5105f9e8d97781ad11db7 (patch) | |
| tree | 08f24c78f802953962c216b0a5c3e81e1572d4c4 /src/core | |
| parent | 5ae284c11fa12b7d17359096557ffc0d90229aed (diff) | |
Bug fixes, more shorthands, and Increment/Decrement instructions
Diffstat (limited to 'src/core')
16 files changed, 736 insertions, 23 deletions
diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/AddElementsOfComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/AddElementsOfComputation.java index 5057034..1f34678 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/AddElementsOfComputation.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/AddElementsOfComputation.java @@ -89,7 +89,7 @@ public class AddElementsOfComputation extends GenericComputation final Computation other_collection; final Computation collection; - if (call_parameters.size() != 2) + if (call_parameters.size() < 2) { ErrorManager.handle ( @@ -99,7 +99,7 @@ public class AddElementsOfComputation extends GenericComputation ( "(" + alias - + " <added_collection: (LIST X)|(SET X)>" + + " <added_collection: (LIST X)|(SET X)>+" + " <receiving_collection: (LIST X)|(SET X)>)" ) ) @@ -107,6 +107,31 @@ public class AddElementsOfComputation extends GenericComputation return null; } + else if (call_parameters.size() > 2) + { + final int size_minus_one; + Computation result; + + size_minus_one = call_parameters.size() - 1; + + result = call_parameters.get(size_minus_one); + + for (int i = 0; i < size_minus_one; ++i) + { + final List<Computation> temp_params; + final Computation addition; + + addition = call_parameters.get(i); + temp_params = new ArrayList<Computation>(); + + temp_params.add(addition); + temp_params.add(result); + + result = build(addition.get_origin(), alias, temp_params); + } + + return result; + } other_collection = call_parameters.get(0); collection = call_parameters.get(1); diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/RemoveAllOfElementComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/RemoveAllOfElementComputation.java index 48e9658..58c1639 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/RemoveAllOfElementComputation.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/RemoveAllOfElementComputation.java @@ -53,19 +53,44 @@ public class RemoveAllOfElementComputation extends GenericComputation final Computation element; final Computation collection; - if (call_parameters.size() != 2) + if (call_parameters.size() < 2) { ErrorManager.handle ( new WrongNumberOfParametersException ( origin, - "(" + alias + " <element: X> <(LIST X)|(SET X)>)" + "(" + alias + " <element: X>+ <(LIST X)|(SET X)>)" ) ); return null; } + else if (call_parameters.size() > 2) + { + final int size_minus_one; + Computation result; + + size_minus_one = call_parameters.size() - 1; + + result = call_parameters.get(size_minus_one); + + for (int i = 0; i < size_minus_one; ++i) + { + final List<Computation> temp_params; + final Computation addition; + + addition = call_parameters.get(i); + temp_params = new ArrayList<Computation>(); + + temp_params.add(addition); + temp_params.add(result); + + result = build(addition.get_origin(), alias, temp_params); + } + + return result; + } element = call_parameters.get(0); collection = call_parameters.get(1); diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/RemoveElementComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/RemoveElementComputation.java index f806623..b40d637 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/RemoveElementComputation.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/RemoveElementComputation.java @@ -54,19 +54,44 @@ public class RemoveElementComputation extends GenericComputation final Computation element; final Computation collection; - if (call_parameters.size() != 1) + if (call_parameters.size() < 2) { ErrorManager.handle ( new WrongNumberOfParametersException ( origin, - "(" + alias + " <element: X> <(LIST X)|(SET X)>)" + "(" + alias + " <element: X>+ <(LIST X)|(SET X)>)" ) ); return null; } + else if (call_parameters.size() > 2) + { + final int size_minus_one; + Computation result; + + size_minus_one = call_parameters.size() - 1; + + result = call_parameters.get(size_minus_one); + + for (int i = 0; i < size_minus_one; ++i) + { + final List<Computation> temp_params; + final Computation addition; + + addition = call_parameters.get(i); + temp_params = new ArrayList<Computation>(); + + temp_params.add(addition); + temp_params.add(result); + + result = build(addition.get_origin(), alias, temp_params); + } + + return result; + } element = call_parameters.get(0); collection = call_parameters.get(1); diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/RemoveElementsOfComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/RemoveElementsOfComputation.java index 000afd4..45102c7 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/RemoveElementsOfComputation.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/RemoveElementsOfComputation.java @@ -48,7 +48,7 @@ public class RemoveElementsOfComputation extends GenericComputation final Computation other_collection; final Computation collection; - if (call_parameters.size() != 2) + if (call_parameters.size() < 2) { ErrorManager.handle ( @@ -58,7 +58,7 @@ public class RemoveElementsOfComputation extends GenericComputation ( "(" + alias - + " <removed: (LIST X)|(SET X)>" + + " <removed: (LIST X)|(SET X)>+" + " <base_collection: (LIST X)|(SET X)>)" ) ) @@ -66,6 +66,31 @@ public class RemoveElementsOfComputation extends GenericComputation return null; } + else if (call_parameters.size() > 2) + { + final int size_minus_one; + Computation result; + + size_minus_one = call_parameters.size() - 1; + + result = call_parameters.get(size_minus_one); + + for (int i = 0; i < size_minus_one; ++i) + { + final List<Computation> temp_params; + final Computation addition; + + addition = call_parameters.get(i); + temp_params = new ArrayList<Computation>(); + + temp_params.add(addition); + temp_params.add(result); + + result = build(addition.get_origin(), alias, temp_params); + } + + return result; + } other_collection = call_parameters.get(0); collection = call_parameters.get(1); diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/AddElementsOf.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/AddElementsOf.java index b022428..964980b 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/AddElementsOf.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/AddElementsOf.java @@ -19,6 +19,7 @@ import tonkadur.fate.v1.lang.meta.Computation; import tonkadur.fate.v1.lang.meta.RecurrentChecks; import tonkadur.fate.v1.lang.instruction.GenericInstruction; +import tonkadur.fate.v1.lang.instruction.InstructionList; public class AddElementsOf extends GenericInstruction { @@ -90,7 +91,7 @@ public class AddElementsOf extends GenericInstruction final Computation other_collection; final Computation collection; - if (call_parameters.size() != 2) + if (call_parameters.size() < 2) { ErrorManager.handle ( @@ -100,7 +101,7 @@ public class AddElementsOf extends GenericInstruction ( "(" + alias - + "! <additions: (LIST X)|(SET X)>" + + "! <additions: (LIST X)|(SET X)>+" + " <base_collection: (LIST X)|(SET X)>)" ) ) @@ -108,6 +109,33 @@ public class AddElementsOf extends GenericInstruction return null; } + else if (call_parameters.size() > 2) + { + final int size_minus_one; + final List<Instruction> result; + final List<Computation> sub_call_parameters; + + size_minus_one = call_parameters.size() - 1; + + result = new ArrayList<Instruction>(); + sub_call_parameters = new ArrayList<Computation>(); + + sub_call_parameters.add(call_parameters.get(size_minus_one)); + sub_call_parameters.add(sub_call_parameters.get(0)); + + for (int i = 0; i < size_minus_one; ++i) + { + final Computation added_element; + + added_element = call_parameters.get(i); + + sub_call_parameters.set(0, added_element); + + result.add(build(origin, alias, sub_call_parameters)); + } + + return new InstructionList(origin, result); + } other_collection = call_parameters.get(0); collection = call_parameters.get(1); diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Clear.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Clear.java index bc169a0..3d60f88 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Clear.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Clear.java @@ -16,6 +16,7 @@ import tonkadur.fate.v1.lang.meta.Instruction; import tonkadur.fate.v1.lang.meta.RecurrentChecks; import tonkadur.fate.v1.lang.instruction.GenericInstruction; +import tonkadur.fate.v1.lang.instruction.InstructionList; public class Clear extends GenericInstruction { @@ -47,7 +48,7 @@ public class Clear extends GenericInstruction { final Computation collection; - if (call_parameters.size() != 1) + if (call_parameters.size() < 1) { ErrorManager.handle ( @@ -57,13 +58,39 @@ public class Clear extends GenericInstruction ( "(" + alias - + "! <(LIST X)|(SET X)>)" + + "! <(LIST X)|(SET X)>+)" ) ) ); return null; } + else if (call_parameters.size() > 1) + { + final int size_minus_one; + final List<Instruction> result; + final List<Computation> sub_call_parameters; + + size_minus_one = call_parameters.size(); + + result = new ArrayList<Instruction>(); + sub_call_parameters = new ArrayList<Computation>(); + + sub_call_parameters.add(sub_call_parameters.get(0)); + + for (int i = 0; i < size_minus_one; ++i) + { + final Computation added_element; + + added_element = call_parameters.get(i); + + sub_call_parameters.set(0, added_element); + + result.add(build(origin, alias, sub_call_parameters)); + } + + return new InstructionList(origin, result); + } collection = call_parameters.get(0); diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Decrement.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Decrement.java new file mode 100644 index 0000000..9f3be2e --- /dev/null +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Decrement.java @@ -0,0 +1,141 @@ +package tonkadur.fate.v1.lang.instruction.generic; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import tonkadur.parser.Origin; +import tonkadur.parser.ParsingError; + +import tonkadur.error.ErrorManager; + +import tonkadur.fate.v1.error.WrongNumberOfParametersException; + +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.RecurrentChecks; + +import tonkadur.fate.v1.lang.type.Type; + +import tonkadur.fate.v1.lang.instruction.GenericInstruction; +import tonkadur.fate.v1.lang.instruction.InstructionList; + +public class Decrement extends GenericInstruction +{ + public static Collection<String> get_aliases () + { + final List<String> aliases; + + aliases = new ArrayList<String>(); + + aliases.add("decrement"); + aliases.add("dec"); + aliases.add("--"); + + return aliases; + } + + public static Instruction build + ( + final Origin origin, + final String alias, + final List<Computation> call_parameters + ) + throws Throwable + { + final Computation element; + + if (call_parameters.size() < 1) + { + ErrorManager.handle + ( + new WrongNumberOfParametersException + ( + origin, + "(" + alias + "! <INT REFERENCE>+)" + ) + ); + + return null; + } + else if (call_parameters.size() > 1) + { + final int size_minus_one; + final List<Instruction> result; + final List<Computation> sub_call_parameters; + + size_minus_one = call_parameters.size(); + + result = new ArrayList<Instruction>(); + sub_call_parameters = new ArrayList<Computation>(); + + sub_call_parameters.add(call_parameters.get(size_minus_one)); + + for (int i = 0; i < size_minus_one; ++i) + { + final Computation added_element; + + added_element = call_parameters.get(i); + + sub_call_parameters.set(0, added_element); + + result.add(build(origin, alias, sub_call_parameters)); + } + + return new InstructionList(origin, result); + } + + element = call_parameters.get(0); + + RecurrentChecks.assert_can_be_used_as(element, Type.INT); + + element.expect_non_string(); + + element.use_as_reference(); + + return new Decrement(origin, element); + } + + /***************************************************************************/ + /**** MEMBERS **************************************************************/ + /***************************************************************************/ + protected final Computation element; + + /***************************************************************************/ + /**** PROTECTED ************************************************************/ + /***************************************************************************/ + /**** Constructors *********************************************************/ + protected Decrement + ( + final Origin origin, + final Computation element + ) + { + super(origin); + + this.element = element; + } + + /***************************************************************************/ + /**** PUBLIC ***************************************************************/ + /***************************************************************************/ + /**** Accessors ************************************************************/ + public Computation get_reference () + { + return element; + } + + /**** Misc. ****************************************************************/ + @Override + public String toString () + { + final StringBuilder sb = new StringBuilder(); + + sb.append("(Decrement "); + sb.append(element.toString()); + sb.append(")"); + + return sb.toString(); + } +} diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Increment.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Increment.java new file mode 100644 index 0000000..92e8290 --- /dev/null +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Increment.java @@ -0,0 +1,141 @@ +package tonkadur.fate.v1.lang.instruction.generic; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import tonkadur.parser.Origin; +import tonkadur.parser.ParsingError; + +import tonkadur.error.ErrorManager; + +import tonkadur.fate.v1.error.WrongNumberOfParametersException; + +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.RecurrentChecks; + +import tonkadur.fate.v1.lang.type.Type; + +import tonkadur.fate.v1.lang.instruction.GenericInstruction; +import tonkadur.fate.v1.lang.instruction.InstructionList; + +public class Increment extends GenericInstruction +{ + public static Collection<String> get_aliases () + { + final List<String> aliases; + + aliases = new ArrayList<String>(); + + aliases.add("increment"); + aliases.add("inc"); + aliases.add("++"); + + return aliases; + } + + public static Instruction build + ( + final Origin origin, + final String alias, + final List<Computation> call_parameters + ) + throws Throwable + { + final Computation element; + + if (call_parameters.size() < 1) + { + ErrorManager.handle + ( + new WrongNumberOfParametersException + ( + origin, + "(" + alias + "! <INT REFERENCE>+)" + ) + ); + + return null; + } + else if (call_parameters.size() > 1) + { + final int size_minus_one; + final List<Instruction> result; + final List<Computation> sub_call_parameters; + + size_minus_one = call_parameters.size(); + + result = new ArrayList<Instruction>(); + sub_call_parameters = new ArrayList<Computation>(); + + sub_call_parameters.add(call_parameters.get(size_minus_one)); + + for (int i = 0; i < size_minus_one; ++i) + { + final Computation added_element; + + added_element = call_parameters.get(i); + + sub_call_parameters.set(0, added_element); + + result.add(build(origin, alias, sub_call_parameters)); + } + + return new InstructionList(origin, result); + } + + element = call_parameters.get(0); + + RecurrentChecks.assert_can_be_used_as(element, Type.INT); + + element.expect_non_string(); + + element.use_as_reference(); + + return new Increment(origin, element); + } + + /***************************************************************************/ + /**** MEMBERS **************************************************************/ + /***************************************************************************/ + protected final Computation element; + + /***************************************************************************/ + /**** PROTECTED ************************************************************/ + /***************************************************************************/ + /**** Constructors *********************************************************/ + protected Increment + ( + final Origin origin, + final Computation element + ) + { + super(origin); + + this.element = element; + } + + /***************************************************************************/ + /**** PUBLIC ***************************************************************/ + /***************************************************************************/ + /**** Accessors ************************************************************/ + public Computation get_reference () + { + return element; + } + + /**** Misc. ****************************************************************/ + @Override + public String toString () + { + final StringBuilder sb = new StringBuilder(); + + sb.append("(Increment "); + sb.append(element.toString()); + sb.append(")"); + + return sb.toString(); + } +} diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/RemoveAllOfElement.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/RemoveAllOfElement.java index ef02d7f..82ed470 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/RemoveAllOfElement.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/RemoveAllOfElement.java @@ -17,6 +17,7 @@ import tonkadur.fate.v1.lang.meta.Computation; import tonkadur.fate.v1.lang.meta.RecurrentChecks; import tonkadur.fate.v1.lang.instruction.GenericInstruction; +import tonkadur.fate.v1.lang.instruction.InstructionList; public class RemoveAllOfElement extends GenericInstruction { @@ -53,19 +54,46 @@ public class RemoveAllOfElement extends GenericInstruction final Computation element; final Computation collection; - if (call_parameters.size() != 2) + if (call_parameters.size() < 2) { ErrorManager.handle ( new WrongNumberOfParametersException ( origin, - "(" + alias + "! <X> <(LIST X)|(SET X) REFERENCE>)" + "(" + alias + "! <X>+ <(LIST X)|(SET X) REFERENCE>)" ) ); return null; } + else if (call_parameters.size() > 2) + { + final int size_minus_one; + final List<Instruction> result; + final List<Computation> sub_call_parameters; + + size_minus_one = call_parameters.size() - 1; + + result = new ArrayList<Instruction>(); + sub_call_parameters = new ArrayList<Computation>(); + + sub_call_parameters.add(call_parameters.get(size_minus_one)); + sub_call_parameters.add(sub_call_parameters.get(0)); + + for (int i = 0; i < size_minus_one; ++i) + { + final Computation added_element; + + added_element = call_parameters.get(i); + + sub_call_parameters.set(0, added_element); + + result.add(build(origin, alias, sub_call_parameters)); + } + + return new InstructionList(origin, result); + } element = call_parameters.get(0); collection = call_parameters.get(1); diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/RemoveElement.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/RemoveElement.java index 226ffce..9502eb2 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/RemoveElement.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/RemoveElement.java @@ -17,6 +17,7 @@ import tonkadur.fate.v1.lang.meta.Computation; import tonkadur.fate.v1.lang.meta.RecurrentChecks; import tonkadur.fate.v1.lang.instruction.GenericInstruction; +import tonkadur.fate.v1.lang.instruction.InstructionList; public class RemoveElement extends GenericInstruction { @@ -55,19 +56,46 @@ public class RemoveElement extends GenericInstruction final Computation element; final Computation collection; - if (call_parameters.size() != 1) + if (call_parameters.size() < 2) { ErrorManager.handle ( new WrongNumberOfParametersException ( origin, - "(" + alias + "! <X> <(LIST X)|(SET X) REFERENCE>)" + "(" + alias + "! <X>+ <(LIST X)|(SET X) REFERENCE>)" ) ); return null; } + else if (call_parameters.size() > 2) + { + final int size_minus_one; + final List<Instruction> result; + final List<Computation> sub_call_parameters; + + size_minus_one = call_parameters.size() - 1; + + result = new ArrayList<Instruction>(); + sub_call_parameters = new ArrayList<Computation>(); + + sub_call_parameters.add(call_parameters.get(size_minus_one)); + sub_call_parameters.add(sub_call_parameters.get(0)); + + for (int i = 0; i < size_minus_one; ++i) + { + final Computation added_element; + + added_element = call_parameters.get(i); + + sub_call_parameters.set(0, added_element); + + result.add(build(origin, alias, sub_call_parameters)); + } + + return new InstructionList(origin, result); + } element = call_parameters.get(0); collection = call_parameters.get(1); diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/RemoveElementsOf.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/RemoveElementsOf.java index 1d5a9a0..af85997 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/RemoveElementsOf.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/RemoveElementsOf.java @@ -19,6 +19,7 @@ import tonkadur.fate.v1.lang.meta.Computation; import tonkadur.fate.v1.lang.meta.RecurrentChecks; import tonkadur.fate.v1.lang.instruction.GenericInstruction; +import tonkadur.fate.v1.lang.instruction.InstructionList; public class RemoveElementsOf extends GenericInstruction { @@ -49,19 +50,46 @@ public class RemoveElementsOf extends GenericInstruction final Computation other_collection; final Computation collection; - if (call_parameters.size() != 2) + if (call_parameters.size() < 2) { ErrorManager.handle ( new WrongNumberOfParametersException ( origin, - "(" + alias + "! <X> <(LIST X)|(SET X) REFERENCE>)" + "(" + alias + "! <X>+ <(LIST X)|(SET X) REFERENCE>)" ) ); return null; } + else if (call_parameters.size() > 2) + { + final int size_minus_one; + final List<Instruction> result; + final List<Computation> sub_call_parameters; + + size_minus_one = call_parameters.size() - 1; + + result = new ArrayList<Instruction>(); + sub_call_parameters = new ArrayList<Computation>(); + + sub_call_parameters.add(call_parameters.get(size_minus_one)); + sub_call_parameters.add(sub_call_parameters.get(0)); + + for (int i = 0; i < size_minus_one; ++i) + { + final Computation added_element; + + added_element = call_parameters.get(i); + + sub_call_parameters.set(0, added_element); + + result.add(build(origin, alias, sub_call_parameters)); + } + + return new InstructionList(origin, result); + } other_collection = call_parameters.get(0); diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/ReverseList.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/ReverseList.java index d069381..15835e1 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/ReverseList.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/ReverseList.java @@ -17,6 +17,7 @@ import tonkadur.fate.v1.lang.meta.Computation; import tonkadur.fate.v1.lang.meta.RecurrentChecks; import tonkadur.fate.v1.lang.instruction.GenericInstruction; +import tonkadur.fate.v1.lang.instruction.InstructionList; public class ReverseList extends GenericInstruction { @@ -42,19 +43,45 @@ public class ReverseList extends GenericInstruction { final Computation collection; - if (call_parameters.size() != 1) + if (call_parameters.size() < 1) { ErrorManager.handle ( new WrongNumberOfParametersException ( origin, - "(" + alias + "! <(LIST X)|(SET X) REFERENCE>)" + "(" + alias + "! <(LIST X)|(SET X) REFERENCE>+)" ) ); return null; } + else if (call_parameters.size() > 1) + { + final int size_minus_one; + final List<Instruction> result; + final List<Computation> sub_call_parameters; + + size_minus_one = call_parameters.size(); + + result = new ArrayList<Instruction>(); + sub_call_parameters = new ArrayList<Computation>(); + + sub_call_parameters.add(sub_call_parameters.get(0)); + + for (int i = 0; i < size_minus_one; ++i) + { + final Computation added_element; + + added_element = call_parameters.get(i); + + sub_call_parameters.set(0, added_element); + + result.add(build(origin, alias, sub_call_parameters)); + } + + return new InstructionList(origin, result); + } collection = call_parameters.get(0); diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Shuffle.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Shuffle.java index b89b100..eac8434 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Shuffle.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/Shuffle.java @@ -17,6 +17,7 @@ import tonkadur.fate.v1.lang.meta.Computation; import tonkadur.fate.v1.lang.meta.RecurrentChecks; import tonkadur.fate.v1.lang.instruction.GenericInstruction; +import tonkadur.fate.v1.lang.instruction.InstructionList; public class Shuffle extends GenericInstruction { @@ -41,19 +42,45 @@ public class Shuffle extends GenericInstruction { final Computation collection; - if (call_parameters.size() != 1) + if (call_parameters.size() < 1) { ErrorManager.handle ( new WrongNumberOfParametersException ( origin, - "(" + alias + "! <(LIST X) REFERENCE>)" + "(" + alias + "! <(LIST X) REFERENCE>+)" ) ); return null; } + else if (call_parameters.size() > 1) + { + final int size_minus_one; + final List<Instruction> result; + final List<Computation> sub_call_parameters; + + size_minus_one = call_parameters.size(); + + result = new ArrayList<Instruction>(); + sub_call_parameters = new ArrayList<Computation>(); + + sub_call_parameters.add(sub_call_parameters.get(0)); + + for (int i = 0; i < size_minus_one; ++i) + { + final Computation added_element; + + added_element = call_parameters.get(i); + + sub_call_parameters.set(0, added_element); + + result.add(build(origin, alias, sub_call_parameters)); + } + + return new InstructionList(origin, result); + } collection = call_parameters.get(0); diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/SubList.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/SubList.java index 7c2b6c1..7fad3a3 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/SubList.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/SubList.java @@ -60,7 +60,13 @@ public class SubList extends GenericInstruction new WrongNumberOfParametersException ( origin, - "(" + alias + "! <(LIST X)|(SET X) REFERENCE>)" + ( + "(" + + alias + + "! <start_at: INT>" + + " <stop_before: INT>" + + " <(LIST X)|(SET X) REFERENCE>)" + ) ) ); diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/DecrementCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/DecrementCompiler.java new file mode 100644 index 0000000..a0dfeda --- /dev/null +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/DecrementCompiler.java @@ -0,0 +1,66 @@ +package tonkadur.wyrd.v1.compiler.fate.v1.instruction.generic; + +import tonkadur.fate.v1.lang.instruction.generic.Decrement; + +import tonkadur.wyrd.v1.compiler.fate.v1.Compiler; +import tonkadur.wyrd.v1.compiler.fate.v1.ComputationCompiler; + +import tonkadur.wyrd.v1.compiler.fate.v1.instruction.GenericInstructionCompiler; + +import tonkadur.wyrd.v1.lang.instruction.SetValue; + +import tonkadur.wyrd.v1.lang.computation.Constant; +import tonkadur.wyrd.v1.lang.computation.Operation; + +public class DecrementCompiler extends GenericInstructionCompiler +{ + public static Class get_target_class () + { + return Decrement.class; + } + + public DecrementCompiler (final Compiler compiler) + { + super(compiler); + } + + /* + * Fate: (set_value address value) + * Wyrd: (set_value address value) + */ + public void compile + ( + final tonkadur.fate.v1.lang.instruction.GenericInstruction instruction + ) + throws Throwable + { + final Decrement source; + final ComputationCompiler address_cc; + + source = (Decrement) instruction; + + address_cc = new ComputationCompiler(compiler); + + source.get_reference().get_visited_by(address_cc); + + if (address_cc.has_init()) + { + result.add(address_cc.get_init()); + } + + result.add + ( + new tonkadur.wyrd.v1.lang.instruction.SetValue + ( + address_cc.get_address(), + Operation.minus + ( + address_cc.get_computation(), + Constant.ONE + ) + ) + ); + + address_cc.release_registers(result); + } +} diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/IncrementCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/IncrementCompiler.java new file mode 100644 index 0000000..27d00ea --- /dev/null +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/IncrementCompiler.java @@ -0,0 +1,66 @@ +package tonkadur.wyrd.v1.compiler.fate.v1.instruction.generic; + +import tonkadur.fate.v1.lang.instruction.generic.Increment; + +import tonkadur.wyrd.v1.compiler.fate.v1.Compiler; +import tonkadur.wyrd.v1.compiler.fate.v1.ComputationCompiler; + +import tonkadur.wyrd.v1.compiler.fate.v1.instruction.GenericInstructionCompiler; + +import tonkadur.wyrd.v1.lang.instruction.SetValue; + +import tonkadur.wyrd.v1.lang.computation.Constant; +import tonkadur.wyrd.v1.lang.computation.Operation; + +public class IncrementCompiler extends GenericInstructionCompiler +{ + public static Class get_target_class () + { + return Increment.class; + } + + public IncrementCompiler (final Compiler compiler) + { + super(compiler); + } + + /* + * Fate: (set_value address value) + * Wyrd: (set_value address value) + */ + public void compile + ( + final tonkadur.fate.v1.lang.instruction.GenericInstruction instruction + ) + throws Throwable + { + final Increment source; + final ComputationCompiler address_cc; + + source = (Increment) instruction; + + address_cc = new ComputationCompiler(compiler); + + source.get_reference().get_visited_by(address_cc); + + if (address_cc.has_init()) + { + result.add(address_cc.get_init()); + } + + result.add + ( + new tonkadur.wyrd.v1.lang.instruction.SetValue + ( + address_cc.get_address(), + Operation.plus + ( + address_cc.get_computation(), + Constant.ONE + ) + ) + ); + + address_cc.release_registers(result); + } +} |


