summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2020-08-07 11:18:18 +0200
committerNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2020-08-07 11:18:18 +0200
commitb95d1790243c09901fa5175a9ec29fcdce0998a1 (patch)
tree5e5c02810b6fa2fbe04a78ed7751d1146c59cdbf
parent5ba737fbc8edac0eb5ed750d92a5b3158fb2a32e (diff)
...
-rw-r--r--data/examples/monster_battle/battle.fate2
-rw-r--r--data/tests/conditionals.fate222
-rw-r--r--data/tests/include/data_types.fate70
-rw-r--r--data/tests/operators.fate154
-rw-r--r--src/core/src/tonkadur/Main.java10
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/Assert.java16
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/ReverseList.java101
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/meta/InstructionVisitor.java3
-rw-r--r--src/core/src/tonkadur/fate/v1/parser/FateLexer.g44
-rw-r--r--src/core/src/tonkadur/fate/v1/parser/FateParser.g466
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/Compiler.java12
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/ComputationCompiler.java2
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/InstructionCompiler.java203
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/MacroManager.java28
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/util/AnonymousVariableManager.java15
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/util/RemoveAt.java2
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/util/ReverseList.java152
-rw-r--r--src/core/src/tonkadur/wyrd/v1/lang/instruction/Assert.java11
-rw-r--r--src/json-export/src/tonkadur/jsonexport/InstructionCompiler.java11
-rw-r--r--src/json-export/src/tonkadur/jsonexport/Translator.java3
20 files changed, 1033 insertions, 54 deletions
diff --git a/data/examples/monster_battle/battle.fate b/data/examples/monster_battle/battle.fate
index cfdce39..9674b95 100644
--- a/data/examples/monster_battle/battle.fate
+++ b/data/examples/monster_battle/battle.fate
@@ -1,5 +1,5 @@
(fate_version 1)
(define_sequence start_battle
- nothing yet
+ (end)
)
diff --git a/data/tests/conditionals.fate b/data/tests/conditionals.fate
new file mode 100644
index 0000000..02730c6
--- /dev/null
+++ b/data/tests/conditionals.fate
@@ -0,0 +1,222 @@
+(fate_version 1)
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;; COMPUTATIONS ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+;; COMPUTATION IF-ELSE
+(assert (ifelse (true) (true) (false)) FAILED: computation if-else A)
+(assert (ifelse (false) (false) (true)) FAILED: computation if-else B)
+(assert (ifelse (false) (false) (ifelse (true) (true) (false))) FAILED: computation if-else C)
+
+;; COMPUTATION COND
+(assert
+ (cond
+ ((true) (true))
+ )
+ FAILED: computation cond A
+)
+(assert
+ (cond
+ ((false) (false))
+ ((true) (true))
+ )
+ FAILED: computation cond D
+)
+(assert
+ (cond
+ ((false) (false))
+ ((true) (true))
+ ((true) (false))
+ )
+ FAILED: computation cond E
+)
+(assert
+ (cond
+ ((false) (false))
+ ((true)
+ (cond
+ ((false) (false))
+ ((true) (true))
+ ((true) (false))
+ )
+ )
+ ((true) (false))
+ )
+ FAILED: computation cond D
+)
+
+;; COMPUTATION SWITCH
+;; TODO: re-enable. Currently not implemented in Wyrd compiler
+;;(assert
+;; (switch 3
+;; (0 (false))
+;; (1 (false))
+;; (3 (true))
+;; (2 (false))
+;; (false)
+;; )
+;; FAILED: computation switch A
+;;)
+;;(assert
+;; (switch 3
+;; (0 (false))
+;; (1 (false))
+;; (2 (false))
+;; (true)
+;; )
+;; FAILED: computation switch B
+;;)
+;;(assert
+;; (switch 3
+;; (0 (false))
+;; (1 (false))
+;; (2 (false))
+;; (switch 2
+;; (0 (false))
+;; (1 (false))
+;; (2 (true))
+;; (false)
+;; )
+;; )
+;; FAILED: computation switch C
+;;)
+;;(assert
+;; (switch 3
+;; (0 (false))
+;; (1 (false))
+;; (2
+;; (switch 1
+;; (0 (false))
+;; (2 (false))
+;; (1 (true))
+;; (false)
+;; )
+;; )
+;; (false)
+;; )
+;; FAILED: computation switch D
+;;)
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;; INSTRUCTIONS ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(declare_variable boolean test_var)
+(set test_var (true))
+
+(assert (var test_var) FAILED: setting test_var)
+
+;; INSTRUCTION IF
+(if (false)
+ (assert (false) FAILED: instruction if A)
+)
+
+(set test_var (false))
+(if (true)
+ (set test_var (true))
+)
+(assert (var test_var) FAILED: instruction if B)
+
+(if (false)
+ (if (false)
+ (assert (false) FAILED: instruction if C)
+ )
+)
+(if (true)
+ (if (false)
+ (assert (false) FAILED: instruction if D)
+ )
+)
+(if (false)
+ (if (true)
+ (assert (false) FAILED: instruction if E)
+ )
+)
+
+(set test_var (false))
+(if (true)
+ (if (true)
+ (set test_var (true))
+ )
+)
+(assert (var test_var) FAILED: instruction if F)
+
+;; INSTRUCTION IF-ELSE
+(set test_var (false))
+(ifelse (false)
+ (assert (false) FAILED: instruction ifelse A)
+ (set test_var (true))
+)
+(assert (var test_var) FAILED: instruction ifelse B)
+
+(set test_var (false))
+(ifelse (true)
+ (set test_var (true))
+ (assert (false) FAILED: instruction ifelse C)
+)
+(assert (var test_var) FAILED: instruction ifelse D)
+
+(set test_var (false))
+(ifelse (true)
+ (ifelse (false)
+ (assert (false) FAILED: instruction ifelse E)
+ (set test_var (true))
+ )
+ (assert (false) FAILED: instruction ifelse F)
+)
+(assert (var test_var) FAILED: instruction ifelse G)
+
+;; INSTRUCTION COND
+(set test_var (false))
+(cond
+ ((false) (assert (false) FAILED: instruction cond A))
+ ((true) (set test_var (true)))
+)
+(assert (var test_var) FAILED: instruction cond B)
+
+(set test_var (false))
+(cond
+ ((true) (set test_var (true)))
+ ((false) (assert (false) FAILED: instruction cond B))
+)
+(assert (var test_var) FAILED: instruction cond C)
+
+(set test_var (false))
+(cond
+ ((true) (set test_var (true)))
+ ((true) (assert (false) FAILED: instruction cond D))
+ ((false) (assert (false) FAILED: instruction cond E))
+)
+(assert (var test_var) FAILED: instruction cond F)
+
+;; INSTRUCTION SWITCH
+(set test_var (false))
+(switch 3
+ (0 (assert (false) FAILED: instruction switch B))
+ (1 (assert (false) FAILED: instruction switch C))
+ (set test_var (true))
+)
+(assert (var test_var) FAILED: instruction switch D)
+
+(set test_var (false))
+(switch 3
+ (0 (assert (false) FAILED: instruction switch E))
+ (1 (assert (false) FAILED: instruction switch F))
+ (3 (set test_var (true)))
+ (2 (assert (false) FAILED: instruction switch G))
+ (assert (false) FAILED: instruction switch H)
+)
+(assert (var test_var) FAILED: instruction switch I)
+
+(set test_var (false))
+(switch 3
+ (0 (assert (false) FAILED: instruction switch J))
+ (1 (assert (false) FAILED: instruction switch K))
+ (3 (set test_var (true)))
+ (3 (assert (false) FAILED: instruction switch L))
+ (2 (assert (false) FAILED: instruction switch M))
+ (assert (false) FAILED: instruction switch N)
+)
+(assert (var test_var) FAILED: instruction switch O)
+
+(end)
diff --git a/data/tests/include/data_types.fate b/data/tests/include/data_types.fate
new file mode 100644
index 0000000..3205b69
--- /dev/null
+++ b/data/tests/include/data_types.fate
@@ -0,0 +1,70 @@
+(fate_version 1)
+
+(typedef boolean sub_boolean)
+(typedef boolean alt_boolean)
+(typedef sub_boolean sub_sub_boolean)
+(typedef sub_boolean alt_sub_boolean)
+
+(typedef int sub_int)
+(typedef int alt_int)
+(typedef sub_int sub_sub_int)
+(typedef sub_int alt_sub_int)
+
+(typedef float sub_float)
+(typedef float alt_float)
+(typedef sub_float sub_sub_float)
+(typedef sub_float alt_sub_float)
+
+(typedef string sub_string)
+(typedef string alt_string)
+(typedef sub_string sub_sub_string)
+(typedef sub_string alt_sub_string)
+
+(define_list_type boolean list_boolean)
+(define_list_type sub_boolean list_sub_boolean)
+(define_set_type boolean set_boolean)
+(define_set_type sub_boolean set_sub_boolean)
+(define_ref_type boolean ref_boolean)
+(define_ref_type sub_boolean ref_sub_boolean)
+
+(define_list_type int list_int)
+(define_list_type sub_int list_sub_int)
+(define_set_type int set_int)
+(define_set_type sub_int set_sub_int)
+(define_ref_type int ref_int)
+(define_ref_type sub_int ref_sub_int)
+
+(define_list_type float list_float)
+(define_list_type sub_float list_sub_float)
+(define_set_type float set_float)
+(define_set_type sub_float set_sub_float)
+(define_ref_type float ref_float)
+(define_ref_type sub_float ref_sub_float)
+
+(define_list_type string list_int)
+(define_list_type sub_string list_sub_int)
+(define_set_type string set_int)
+(define_set_type sub_string set_sub_int)
+(define_ref_type string ref_int)
+(define_ref_type sub_string ref_sub_int)
+
+(define_dict_type simple_dict
+ (boolean boolean)
+ (int int)
+ (float float)
+ (string string)
+)
+
+(define_ref_type simple_dict simple_dict_ptr)
+(define_list_type simple_dict_ptr simple_dict_ptr_list)
+(define_set_type simple_dict_ptr simple_dict_ptr_set)
+
+(define_dict_type two_dict
+ (simple_dict dict_a)
+ (simple_dict dict_b)
+ (simple_dict_ptr dict_ptr)
+)
+
+(define_ref_type two_dict two_dict_ptr)
+(define_list_type two_dict_ptr two_dict_ptr_list)
+(define_set_type two_dict_ptr two_dict_ptr_set)
diff --git a/data/tests/operators.fate b/data/tests/operators.fate
new file mode 100644
index 0000000..6598297
--- /dev/null
+++ b/data/tests/operators.fate
@@ -0,0 +1,154 @@
+(fate_version 1)
+
+;; EQUALITY
+(assert (= 1 1) FAILED: int equality)
+(assert (= 1.0 1.0) FAILED: float equality)
+(assert (= test test) FAILED: string equality)
+(assert (= (true) (true)) FAILED: boolean equality)
+
+(assert (= (= 1 2) (false)) FAILED: int inequality)
+(assert (= (= 1.0 2.0) (false)) FAILED: float inequality)
+(assert (= (= one two) (false)) FAILED: string inequality)
+(assert (= (= (true) (false)) (false)) FAILED: boolean inequality)
+
+(assert (= 1 1 1 1 1) FAILED: int n>2 equality)
+(assert (= 1.0 1.0 1.0 1.0 1.0) FAILED: float n>2 equality)
+(assert (= test test test test test) FAILED: string n>2 equality)
+(assert (= (true) (true) (true) (true)) FAILED: boolean n>2 equality)
+
+
+;; ADDITION
+(assert (= (+ 1 1) 2) FAILED: int addition)
+(assert (= (+ 1 1 1 1) 4) FAILED: int n>2 addition)
+(assert (= (+ 1.5 1.5) 3.0) FAILED: float addition)
+(assert (= (+ 1.5 1.0 1.5 1.0) 5.0) FAILED: float n>2 addition)
+
+;; SUBTRACTION
+(assert (= (- 1 1) 0) FAILED: int subtraction)
+(assert (= (- 1 1 1 1) -2) FAILED: int n>2 subtraction)
+(assert (= (- 1.5 1.5) 0.0) FAILED: float subtraction)
+(assert (= (- 1.5 1.0 1.5 1.0) -2.0) FAILED: float n>2 subtraction)
+
+;; MULTIPLICATION
+(assert (= (* 1 3) 3) FAILED: int multiplication)
+(assert (= (* 1 1 3 2) 6) FAILED: int n>2 multiplication)
+(assert (= (* 1.5 2.0) 3.0) FAILED: float multiplication)
+(assert (= (* 1.5 1.0 3.0 1.0) 4.5) FAILED: float n>2 multiplication)
+
+;; DIVISION
+(assert (= (/ 3 3) 1) FAILED: int division)
+(assert (= (/ 4 3) 1) FAILED: int integer division)
+(assert (= (/ 3.0 3.0) 1.0) FAILED: float division A)
+(assert (= (/ 3.0 2.0) 1.5) FAILED: float division B)
+
+;; MODULO
+(assert (= (% 3 3) 0) FAILED: modulo A)
+(assert (= (% 2 3) 2) FAILED: modulo B)
+(assert (= (% 4 3) 1) FAILED: modulo C)
+(assert (= (% 9 3) 0) FAILED: modulo D)
+(assert (= (% 10 3) 1) FAILED: modulo E)
+
+;; MIN
+(assert (= (min 1 3) 1) FAILED: int min)
+(assert (= (min 1 0 -3 9) -3) FAILED: int n>2 min)
+(assert (= (min 1.5 2.0) 1.5) FAILED: float min)
+(assert (= (min 1.5 1.0 3.0 -1.0) -1.0) FAILED: float n>2 min)
+
+;; MAX
+(assert (= (max 3 1) 3) FAILED: int max)
+(assert (= (max 1 0 -3 9) 9) FAILED: int n>2 max)
+(assert (= (max 1.5 2.0) 2.0) FAILED: float max)
+(assert (= (max 1.5 1.0 3.0 -1.0) 3.0) FAILED: float n>2 max)
+
+;; CLAMP
+(assert (= (clamp 1 3 2) 2) FAILED: int clamp A)
+(assert (= (clamp 1 3 4) 3) FAILED: int clamp B)
+(assert (= (clamp 1 3 -1) 1) FAILED: int clamp C)
+(assert (= (clamp 1 3 1) 1) FAILED: int clamp D)
+(assert (= (clamp 1 3 3) 3) FAILED: int clamp E)
+(assert (= (clamp 1.5 3.0 1.7) 1.7) FAILED: float clamp A)
+(assert (= (clamp 1.5 3.0 4.7) 3.0) FAILED: float clamp B)
+(assert (= (clamp 1.5 3.0 -1.7) 1.5) FAILED: float clamp C)
+(assert (= (clamp 1.5 3.0 1.5) 1.5) FAILED: float clamp D)
+(assert (= (clamp 1.5 3.0 3.0) 3.0) FAILED: float clamp E)
+
+;; ABS
+(assert (= (abs 1) 1) FAILED: int abs A)
+(assert (= (abs -1) 1) FAILED: int abs B)
+(assert (= (abs -99) 99) FAILED: int abs C)
+(assert (= (abs 0) 0) FAILED: int abs D)
+(assert (= (abs 1.5) 1.5) FAILED: float abs A)
+(assert (= (abs -1.5) 1.5) FAILED: float abs B)
+(assert (= (abs -99.5) 99.5) FAILED: float abs C)
+(assert (= (abs 0.5) 0.5) FAILED: float abs D)
+
+;; AND
+(assert (= (and (true) (true)) (true)) FAILED: and A)
+(assert (= (and (true) (false)) (false)) FAILED: and B)
+(assert (= (and (false) (true)) (false)) FAILED: and C)
+(assert (= (and (false) (false)) (false)) FAILED: and D)
+(assert (= (and (true) (true) (true) (true) (true)) (true)) FAILED: and E)
+(assert (= (and (false) (false) (false) (false) (false)) (false)) FAILED: and F)
+(assert (= (and (true) (true) (false) (true) (true)) (false)) FAILED: and G)
+
+;; OR
+(assert (= (or (true) (true)) (true)) FAILED: or A)
+(assert (= (or (true) (false)) (true)) FAILED: or B)
+(assert (= (or (false) (true)) (true)) FAILED: or C)
+(assert (= (or (false) (false)) (false)) FAILED: or D)
+(assert (= (or (true) (true) (true) (true) (true)) (true)) FAILED: or E)
+(assert (= (and (false) (false) (false) (false) (false)) (false)) FAILED: or F)
+(assert (= (or (true) (true) (false) (true) (true)) (true)) FAILED: or G)
+
+;; NOT
+(assert (= (not (true)) (false)) FAILED: not A)
+(assert (= (not (false)) (true)) FAILED: not B)
+
+;; IMPLIES
+(assert (= (implies (true) (true)) (true)) FAILED: implies A)
+(assert (= (implies (true) (false)) (false)) FAILED: implies B)
+(assert (= (implies (false) (true)) (true)) FAILED: implies C)
+(assert (= (implies (false) (false)) (true)) FAILED: implies D)
+
+;; ONE IN
+(assert (= (one_in (true) (true)) (false)) FAILED: one_in A)
+(assert (= (one_in (true) (false)) (true)) FAILED: one_in B)
+(assert (= (one_in (false) (true)) (true)) FAILED: one_in C)
+(assert (= (one_in (false) (false)) (false)) FAILED: one_in D)
+(assert (= (one_in (false) (false) (false) (false)) (false)) FAILED: one_in E)
+(assert (= (one_in (false) (true) (false) (false)) (true)) FAILED: one_in F)
+(assert (= (one_in (false) (true) (false) (true)) (false)) FAILED: one_in F)
+
+;; LESS/LOWER THAN
+(assert (= (< 1 3) (true)) FAILED: int LOWER/LESS THAN)
+(assert (= (< 1 0) (false)) FAILED: int LOWER/LESS THAN)
+(assert (= (< 1 1) (false)) FAILED: int LOWER/LESS THAN)
+(assert (= (< 1.5 2.0) (true)) FAILED: float LOWER/LESS THAN)
+(assert (= (< 1.5 1.0) (false)) FAILED: float LOWER/LESS THAN)
+(assert (= (< 1.5 1.5) (false)) FAILED: float LOWER/LESS THAN)
+
+;; LESS/LOWER EQUAL THAN
+(assert (= (=< 1 3) (true)) FAILED: int LOWER/LESS EQUAL THAN)
+(assert (= (=< 1 0) (false)) FAILED: int LOWER/LESS EQUAL THAN)
+(assert (= (=< 1 1) (true)) FAILED: int LOWER/LESS EQUAL THAN)
+(assert (= (=< 1.5 2.0) (true)) FAILED: float LOWER/LESS EQUAL THAN)
+(assert (= (=< 1.5 1.0) (false)) FAILED: float LOWER/LESS EQUAL THAN)
+(assert (= (=< 1.5 1.5) (true)) FAILED: float LOWER/LESS EQUAL THAN)
+
+;; GREATER THAN
+(assert (= (> 1 3) (false)) FAILED: int GREATER THAN)
+(assert (= (> 1 0) (true)) FAILED: int GREATER THAN)
+(assert (= (> 1 1) (false)) FAILED: int GREATER THAN)
+(assert (= (> 1.5 2.0) (false)) FAILED: float GREATER THAN)
+(assert (= (> 1.5 1.0) (true)) FAILED: float GREATER THAN)
+(assert (= (> 1.5 1.5) (false)) FAILED: float GREATER THAN)
+
+;; GREATER EQUAL THAN
+(assert (= (>= 1 3) (false)) FAILED: int GREATER EQUAL THAN)
+(assert (= (>= 1 0) (true)) FAILED: int GREATER EQUAL THAN)
+(assert (= (>= 1 1) (true)) FAILED: int GREATER EQUAL THAN)
+(assert (= (>= 1.5 2.0) (false)) FAILED: float GREATER EQUAL THAN)
+(assert (= (>= 1.5 1.0) (true)) FAILED: float GREATER EQUAL THAN)
+(assert (= (>= 1.5 1.5) (true)) FAILED: float GREATER EQUAL THAN)
+
+(end)
diff --git a/src/core/src/tonkadur/Main.java b/src/core/src/tonkadur/Main.java
index cf8a8ae..ea02801 100644
--- a/src/core/src/tonkadur/Main.java
+++ b/src/core/src/tonkadur/Main.java
@@ -46,7 +46,6 @@ public class Main
);
System.out.println("Parsing completed.");
- System.out.println(fate_world.toString());
}
catch (final Exception e)
{
@@ -88,15 +87,6 @@ public class Main
tp.post_wyrd_compile(wyrd_world);
}
- for
- (
- final tonkadur.wyrd.v1.lang.meta.Instruction line:
- wyrd_world.get_code()
- )
- {
- System.out.println(line.toString());
- }
-
for (final TonkadurPlugin tp: plugins)
{
tp.finalize();
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 2770fa1..7869ab4 100644
--- a/src/core/src/tonkadur/fate/v1/lang/instruction/Assert.java
+++ b/src/core/src/tonkadur/fate/v1/lang/instruction/Assert.java
@@ -12,6 +12,7 @@ import tonkadur.fate.v1.lang.type.Type;
import tonkadur.fate.v1.lang.meta.InstructionVisitor;
import tonkadur.fate.v1.lang.meta.Instruction;
+import tonkadur.fate.v1.lang.meta.RichTextNode;
import tonkadur.fate.v1.lang.meta.Computation;
public class Assert extends Instruction
@@ -20,6 +21,7 @@ public class Assert extends Instruction
/**** MEMBERS **************************************************************/
/***************************************************************************/
protected final Computation condition;
+ protected final RichTextNode message;
/***************************************************************************/
/**** PROTECTED ************************************************************/
@@ -28,12 +30,14 @@ public class Assert extends Instruction
protected Assert
(
final Origin origin,
- final Computation condition
+ final Computation condition,
+ final RichTextNode message
)
{
super(origin);
this.condition = condition;
+ this.message = message;
}
/***************************************************************************/
@@ -43,7 +47,8 @@ public class Assert extends Instruction
public static Assert build
(
final Origin origin,
- final Computation condition
+ final Computation condition,
+ final RichTextNode message
)
throws InvalidTypeException
{
@@ -60,7 +65,7 @@ public class Assert extends Instruction
);
}
- return new Assert(origin, condition);
+ return new Assert(origin, condition, message);
}
/**** Accessors ************************************************************/
@@ -76,6 +81,11 @@ public class Assert extends Instruction
return condition;
}
+ public RichTextNode get_message ()
+ {
+ return message;
+ }
+
/**** Misc. ****************************************************************/
@Override
public String toString ()
diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/ReverseList.java b/src/core/src/tonkadur/fate/v1/lang/instruction/ReverseList.java
index e69de29..59a68e6 100644
--- a/src/core/src/tonkadur/fate/v1/lang/instruction/ReverseList.java
+++ b/src/core/src/tonkadur/fate/v1/lang/instruction/ReverseList.java
@@ -0,0 +1,101 @@
+package tonkadur.fate.v1.lang.instruction;
+
+import java.util.Collections;
+
+import tonkadur.error.ErrorManager;
+
+import tonkadur.parser.Origin;
+
+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.InstructionVisitor;
+import tonkadur.fate.v1.lang.meta.Instruction;
+import tonkadur.fate.v1.lang.meta.Computation;
+
+public class ReverseList extends Instruction
+{
+ /***************************************************************************/
+ /**** MEMBERS **************************************************************/
+ /***************************************************************************/
+ protected final Computation collection;
+
+ /***************************************************************************/
+ /**** PROTECTED ************************************************************/
+ /***************************************************************************/
+ /**** Constructors *********************************************************/
+ protected ReverseList
+ (
+ final Origin origin,
+ final Computation collection
+ )
+ {
+ super(origin);
+
+ this.collection = collection;
+ }
+
+ /***************************************************************************/
+ /**** PUBLIC ***************************************************************/
+ /***************************************************************************/
+ /**** Constructors *********************************************************/
+ public static ReverseList build
+ (
+ final Origin origin,
+ final Computation collection
+ )
+ throws InvalidTypeException
+ {
+ final Type t;
+
+ t = collection.get_type();
+
+ if
+ (
+ !(t instanceof CollectionType)
+ || ((CollectionType) t).is_set()
+ )
+ {
+ ErrorManager.handle
+ (
+ new InvalidTypeException
+ (
+ collection.get_origin(),
+ collection.get_type(),
+ Collections.singleton(Type.LIST)
+ )
+ );
+ }
+
+ return new ReverseList(origin, collection);
+ }
+
+ /**** Accessors ************************************************************/
+ @Override
+ public void get_visited_by (final InstructionVisitor iv)
+ throws Throwable
+ {
+ iv.visit_reverse_list(this);
+ }
+
+ public Computation get_collection ()
+ {
+ return collection;
+ }
+
+ /**** Misc. ****************************************************************/
+ @Override
+ public String toString ()
+ {
+ final StringBuilder sb = new StringBuilder();
+
+ sb.append("(ReverseList ");
+ sb.append(collection.toString());
+
+ sb.append(")");
+
+ return sb.toString();
+ }
+}
diff --git a/src/core/src/tonkadur/fate/v1/lang/meta/InstructionVisitor.java b/src/core/src/tonkadur/fate/v1/lang/meta/InstructionVisitor.java
index 41167bb..3f4f973 100644
--- a/src/core/src/tonkadur/fate/v1/lang/meta/InstructionVisitor.java
+++ b/src/core/src/tonkadur/fate/v1/lang/meta/InstructionVisitor.java
@@ -38,6 +38,9 @@ public interface InstructionVisitor
public void visit_clear (final Clear c)
throws Throwable;
+ public void visit_reverse_list (final ReverseList n)
+ throws Throwable;
+
public void visit_cond_instruction (final CondInstruction ci)
throws Throwable;
diff --git a/src/core/src/tonkadur/fate/v1/parser/FateLexer.g4 b/src/core/src/tonkadur/fate/v1/parser/FateLexer.g4
index ca10603..2759c92 100644
--- a/src/core/src/tonkadur/fate/v1/parser/FateLexer.g4
+++ b/src/core/src/tonkadur/fate/v1/parser/FateLexer.g4
@@ -14,6 +14,7 @@ L_PAREN: '(';
R_PAREN: ')';
+ABS_KW: L_PAREN 'abs'('olute'?) SEP+;
ACCESS_KW: L_PAREN 'access' SEP+;
ADD_KW: L_PAREN 'add' SEP+;
AND_KW: L_PAREN ('and'|'/\\') SEP+;
@@ -63,6 +64,9 @@ IS_MEMBER_KW: L_PAREN ('is'US'member'|'contains'|'has') SEP+;
LOWER_EQUAL_THAN_KW: L_PAREN ('lower'US'equal'US'than'|'=<'|'<='|'le') SEP+;
LOWER_THAN_KW: L_PAREN ('lower'US'than'|'<'|'lt') SEP+;
MINUS_KW: L_PAREN ('minus'|'-') SEP+;
+MIN_KW: L_PAREN ('min'('imum'?)) SEP+;
+MAX_KW: L_PAREN ('max'('imum'?)) SEP+;
+CLAMP_KW: L_PAREN ('clamp') SEP+;
MODULO_KW: L_PAREN ('modulo'|'%'|'mod') SEP+;
NEWLINE_KW: L_PAREN 'newline)';
NEW_KW: L_PAREN ('new'|'reserve'|'create') SEP+;
diff --git a/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 b/src/core/src/tonkadur/fate/v1/parser/FateParser.g4
index c8e42a6..ecf0c0d 100644
--- a/src/core/src/tonkadur/fate/v1/parser/FateParser.g4
+++ b/src/core/src/tonkadur/fate/v1/parser/FateParser.g4
@@ -847,6 +847,7 @@ returns [Instruction result]
elem_type = Type.ANY;
}
+ /* TODO: error if there is already a parameter with that name */
PARAMETERS.add
(
CONTEXT.get_origin_at
@@ -967,7 +968,7 @@ returns [Instruction result]
$result = new SequenceCall(origin, sequence_name);
}
- | ASSERT_KW value WS* R_PAREN
+ | ASSERT_KW value WS+ paragraph WS* R_PAREN
{
$result =
Assert.build
@@ -977,7 +978,8 @@ returns [Instruction result]
($ASSERT_KW.getLine()),
($ASSERT_KW.getCharPositionInLine())
),
- ($value.result)
+ ($value.result),
+ ($paragraph.result)
);
}
@@ -1910,6 +1912,66 @@ returns [Computation result]:
);
}
+ | MIN_KW value_list WS* R_PAREN
+ {
+ $result =
+ Operation.build
+ (
+ CONTEXT.get_origin_at
+ (
+ ($MIN_KW.getLine()),
+ ($MIN_KW.getCharPositionInLine())
+ ),
+ Operator.MIN,
+ ($value_list.result)
+ );
+ }
+
+ | MAX_KW value_list WS* R_PAREN
+ {
+ $result =
+ Operation.build
+ (
+ CONTEXT.get_origin_at
+ (
+ ($MAX_KW.getLine()),
+ ($MAX_KW.getCharPositionInLine())
+ ),
+ Operator.MAX,
+ ($value_list.result)
+ );
+ }
+
+ | CLAMP_KW value_list WS* R_PAREN
+ {
+ $result =
+ Operation.build
+ (
+ CONTEXT.get_origin_at
+ (
+ ($CLAMP_KW.getLine()),
+ ($CLAMP_KW.getCharPositionInLine())
+ ),
+ Operator.CLAMP,
+ ($value_list.result)
+ );
+ }
+
+ | ABS_KW value_list WS* R_PAREN
+ {
+ $result =
+ Operation.build
+ (
+ CONTEXT.get_origin_at
+ (
+ ($ABS_KW.getLine()),
+ ($ABS_KW.getCharPositionInLine())
+ ),
+ Operator.ABS,
+ ($value_list.result)
+ );
+ }
+
| MODULO_KW value_list WS* R_PAREN
{
$result =
diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/Compiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/Compiler.java
index 4a315e1..037a705 100644
--- a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/Compiler.java
+++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/Compiler.java
@@ -3,6 +3,7 @@ package tonkadur.wyrd.v1.compiler.fate.v1;
import tonkadur.wyrd.v1.compiler.util.AnonymousVariableManager;
import tonkadur.wyrd.v1.compiler.util.InstructionManager;
+import tonkadur.wyrd.v1.lang.Variable;
import tonkadur.wyrd.v1.lang.World;
public class Compiler
@@ -32,6 +33,8 @@ public class Compiler
compiler.compile_sequences(fate_world);
+ compiler.add_anonymous_variables();
+
return compiler.wyrd_world;
}
@@ -116,6 +119,15 @@ public class Compiler
);
}
+ protected void add_anonymous_variables ()
+ throws Throwable
+ {
+ for (final Variable variable: anonymous_variables.get_all_variables())
+ {
+ wyrd_world.add_variable(variable);
+ }
+ }
+
public World world ()
{
return wyrd_world;
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 f3e5ae1..c9740f8 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
@@ -858,7 +858,7 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor
{
final Computation zero, minus_one;
- if (operands.get(2).get_type().equals(Type.INT))
+ if (operands.get(0).get_type().equals(Type.INT))
{
zero = Constant.ZERO;
minus_one = new Constant(Type.INT, "-1");
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 b4c0e38..d05a280 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
@@ -14,6 +14,7 @@ import tonkadur.wyrd.v1.lang.meta.Computation;
import tonkadur.wyrd.v1.lang.meta.Instruction;
import tonkadur.wyrd.v1.lang.type.Type;
+import tonkadur.wyrd.v1.lang.type.MapType;
import tonkadur.wyrd.v1.lang.computation.Cast;
import tonkadur.wyrd.v1.lang.computation.Constant;
@@ -44,6 +45,7 @@ import tonkadur.wyrd.v1.compiler.util.While;
import tonkadur.wyrd.v1.compiler.util.Clear;
import tonkadur.wyrd.v1.compiler.util.IterativeSearch;
import tonkadur.wyrd.v1.compiler.util.RemoveAllOf;
+import tonkadur.wyrd.v1.compiler.util.ReverseList;
import tonkadur.wyrd.v1.compiler.util.RemoveAt;
public class InstructionCompiler
@@ -275,20 +277,31 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
*
* Wyrd: (assert Computation)
*/
- final ComputationCompiler cc;
+ final ComputationCompiler cond_cc, msg_cc;
- cc = new ComputationCompiler(compiler);
+ cond_cc = new ComputationCompiler(compiler);
+ msg_cc = new ComputationCompiler(compiler);
- a.get_condition().get_visited_by(cc);
+ a.get_condition().get_visited_by(cond_cc);
+ a.get_message().get_visited_by(msg_cc);
- if (cc.has_init())
+ if (cond_cc.has_init())
{
- result.add(cc.get_init());
+ result.add(cond_cc.get_init());
}
- result.add(new Assert(cc.get_computation()));
+ if (msg_cc.has_init())
+ {
+ result.add(msg_cc.get_init());
+ }
- cc.release_variables();
+ result.add
+ (
+ new Assert(cond_cc.get_computation(), msg_cc.get_computation())
+ );
+
+ cond_cc.release_variables();
+ msg_cc.release_variables();
}
@Override
@@ -328,6 +341,45 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
reference_compiler.release_variables();
}
+ public void visit_reverse_list
+ (
+ final tonkadur.fate.v1.lang.instruction.ReverseList n
+ )
+ throws Throwable
+ {
+ /*
+ * Fate: (reverse_list collection)
+ *
+ * Wyrd: <reverse_list collection>
+ */
+ final ComputationCompiler reference_compiler;
+ final Ref collection_ref;
+
+ reference_compiler = new ComputationCompiler(compiler);
+
+ n.get_collection().get_visited_by(reference_compiler);
+
+ collection_ref = reference_compiler.get_ref();
+
+ if (reference_compiler.has_init())
+ {
+ result.add(reference_compiler.get_init());
+ }
+
+ result.add
+ (
+ ReverseList.generate
+ (
+ compiler.anonymous_variables(),
+ compiler.assembler(),
+ new Size(collection_ref),
+ collection_ref
+ )
+ );
+
+ reference_compiler.release_variables();
+ }
+
@Override
public void visit_switch_instruction
(
@@ -374,7 +426,9 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
Computation value_of_anon;
List<Instruction> current_branch, previous_else_branch;
- branches = new ArrayList(n.get_branches()); // shallow copy.
+ branches = new ArrayList<>(n.get_branches()); // shallow copy.
+
+ Collections.reverse(branches);
previous_else_branch = new ArrayList<Instruction>();
@@ -415,6 +469,7 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
cc = new ComputationCompiler(compiler);
branch.get_car().get_visited_by(cc);
+ branch.get_cdr().get_visited_by(ic);
if (cc.has_init())
{
@@ -664,13 +719,17 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
{
result.add
(
- While.generate
+ compiler.assembler().mark_after
(
- compiler.anonymous_variables(),
- compiler.assembler(),
- cc.get_init(),
- cc.get_computation(),
- compiler.assembler().merge(body)
+ While.generate
+ (
+ compiler.anonymous_variables(),
+ compiler.assembler(),
+ cc.get_init(),
+ cc.get_computation(),
+ compiler.assembler().merge(body)
+ ),
+ end_of_loop_label
)
);
}
@@ -678,12 +737,16 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
{
result.add
(
- While.generate
+ compiler.assembler().mark_after
(
- compiler.anonymous_variables(),
- compiler.assembler(),
- cc.get_computation(),
- compiler.assembler().merge(body)
+ While.generate
+ (
+ compiler.anonymous_variables(),
+ compiler.assembler(),
+ cc.get_computation(),
+ compiler.assembler().merge(body)
+ ),
+ end_of_loop_label
)
);
}
@@ -697,15 +760,107 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
throws Throwable
{
final String end_of_loop_label;
+ final ComputationCompiler cc;
+ final List<Instruction> new_body;
+ final Ref index, current_value, collection_size;
+ final Ref collection;
+ final Computation value_of_index;
+ final Type member_type;
- end_of_loop_label =
- compiler.assembler().generate_label("<AfterFor>");
+ cc = new ComputationCompiler(compiler);
+ new_body = new ArrayList<Instruction>();
+
+ index = compiler.anonymous_variables().reserve(Type.INT);
+ collection_size = compiler.anonymous_variables().reserve(Type.INT);
+
+ result.add(new SetValue(index, Constant.ZERO));
+
+ n.get_collection().get_visited_by(cc);
+
+ if (cc.has_init())
+ {
+ result.add(cc.get_init());
+ }
+
+ collection = cc.get_ref();
+
+ result.add(new SetValue(collection_size, new Size(collection)));
+
+ value_of_index = new ValueOf(index);
+
+ member_type = ((MapType) collection.get_target_type()).get_member_type();
+
+ current_value = compiler.anonymous_variables().reserve(member_type);
+
+ end_of_loop_label = compiler.assembler().generate_label("<AfterForEach>");
compiler.assembler().push_context_label("breakable", end_of_loop_label);
+ compiler.macros().add_wild_parameter
+ (
+ n.get_parameter_name(),
+ current_value
+ );
+
+ for
+ (
+ final tonkadur.fate.v1.lang.meta.Instruction fate_instr: n.get_body()
+ )
+ {
+ final InstructionCompiler ic;
+
+ ic = new InstructionCompiler(compiler);
- /* TODO */
+ fate_instr.get_visited_by(ic);
+ new_body.add(ic.get_result());
+ }
+
+ new_body.add
+ (
+ new SetValue
+ (
+ current_value,
+ new ValueOf
+ (
+ new RelativeRef
+ (
+ collection,
+ new Cast(value_of_index, Type.STRING),
+ member_type
+ )
+ )
+ )
+ );
+
+ new_body.add
+ (
+ new SetValue(index, Operation.plus(Constant.ONE, value_of_index))
+ );
+
+ result.add
+ (
+ compiler.assembler().mark_after
+ (
+ While.generate
+ (
+ compiler.anonymous_variables(),
+ compiler.assembler(),
+ Operation.less_than
+ (
+ value_of_index,
+ new ValueOf(collection_size)
+ ),
+ compiler.assembler.merge(new_body)
+ ),
+ end_of_loop_label
+ )
+ );
+ compiler.macros().remove_wild_parameter(n.get_parameter_name());
compiler.assembler().pop_context_label("breakable");
+
+ compiler.anonymous_variables().release(index);
+ compiler.anonymous_variables().release(current_value);
+ compiler.anonymous_variables().release(collection_size);
}
@Override
@@ -1113,11 +1268,9 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
* Wyrd (add_choice label i0)
*/
final ComputationCompiler cc;
- final InstructionCompiler ic;
final String start_of_effect, end_of_effect;
cc = new ComputationCompiler(compiler);
- ic = new InstructionCompiler(compiler);
start_of_effect = compiler.assembler().generate_label("<choice#start>");
end_of_effect = compiler.assembler().generate_label("<choice#end>");
@@ -1155,7 +1308,7 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
n.get_effects()
)
{
- fate_instruction.get_visited_by(ic);
+ fate_instruction.get_visited_by(this);
}
result.add
diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/MacroManager.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/MacroManager.java
index 085524a..fe2ab67 100644
--- a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/MacroManager.java
+++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/MacroManager.java
@@ -10,13 +10,30 @@ import tonkadur.wyrd.v1.lang.computation.Ref;
public class MacroManager
{
+ protected final Map<String, Ref> wild_parameters;
protected final Stack<Map<String, Ref>> context_stack;
public MacroManager ()
{
+ wild_parameters = new HashMap<String, Ref>();
context_stack = new Stack<Map<String, Ref>>();
}
+ public void add_wild_parameter (final String name, final Ref ref)
+ {
+ if (wild_parameters.containsKey(name))
+ {
+ System.err.println("[P] duplicate wild parameter '" + name + "'.");
+
+ return;
+ }
+ }
+
+ public void remove_wild_parameter (final String name)
+ {
+ wild_parameters.remove(name);
+ }
+
public void pop ()
{
context_stack.pop();
@@ -51,13 +68,18 @@ public class MacroManager
public Ref get_parameter_ref (final String parameter)
{
- final Ref result;
+ Ref result;
- result = context_stack.peek().get(parameter);
+ result = wild_parameters.get(parameter);
if (result == null)
{
- System.err.println("[P] No such parameter '" + parameter + "'.");
+ result = context_stack.peek().get(parameter);
+
+ if (result == null)
+ {
+ System.err.println("[P] No such parameter '" + parameter + "'.");
+ }
}
return result;
diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/util/AnonymousVariableManager.java b/src/core/src/tonkadur/wyrd/v1/compiler/util/AnonymousVariableManager.java
index df0da53..8bec40a 100644
--- a/src/core/src/tonkadur/wyrd/v1/compiler/util/AnonymousVariableManager.java
+++ b/src/core/src/tonkadur/wyrd/v1/compiler/util/AnonymousVariableManager.java
@@ -2,6 +2,7 @@ package tonkadur.wyrd.v1.compiler.util;
import java.util.Map;
import java.util.HashMap;
+import java.util.Collection;
import java.util.List;
import java.util.ArrayList;
@@ -32,6 +33,20 @@ public class AnonymousVariableManager
generated_variables = 0;
}
+ public Collection<Variable> get_all_variables ()
+ {
+ final Collection<Variable> result;
+
+ result = new ArrayList<Variable>();
+
+ for (final Cons<Boolean, Variable> variable: by_name.values())
+ {
+ result.add(variable.get_cdr());
+ }
+
+ return result;
+ }
+
public Ref reserve (final Type t)
{
final String name;
diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/util/RemoveAt.java b/src/core/src/tonkadur/wyrd/v1/compiler/util/RemoveAt.java
index 55f5f02..5fc7489 100644
--- a/src/core/src/tonkadur/wyrd/v1/compiler/util/RemoveAt.java
+++ b/src/core/src/tonkadur/wyrd/v1/compiler/util/RemoveAt.java
@@ -90,7 +90,7 @@ public class RemoveAt
/* (set .next (+ (val index) 1)) */
while_body.add
(
- new SetValue(next, Operation.plus(value_of_end, Constant.ONE))
+ new SetValue(next, Operation.plus(value_of_index, Constant.ONE))
);
/* (set collection[index] (val collection[.next])) */
diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/util/ReverseList.java b/src/core/src/tonkadur/wyrd/v1/compiler/util/ReverseList.java
new file mode 100644
index 0000000..226e86a
--- /dev/null
+++ b/src/core/src/tonkadur/wyrd/v1/compiler/util/ReverseList.java
@@ -0,0 +1,152 @@
+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.type.MapType;
+
+import tonkadur.wyrd.v1.lang.meta.Instruction;
+import tonkadur.wyrd.v1.lang.meta.Computation;
+
+import tonkadur.wyrd.v1.lang.computation.Cast;
+import tonkadur.wyrd.v1.lang.computation.Constant;
+import tonkadur.wyrd.v1.lang.computation.Operation;
+import tonkadur.wyrd.v1.lang.computation.Ref;
+import tonkadur.wyrd.v1.lang.computation.RelativeRef;
+import tonkadur.wyrd.v1.lang.computation.ValueOf;
+
+import tonkadur.wyrd.v1.lang.instruction.SetValue;
+
+public class ReverseList
+{
+ /* Utility Class */
+ private ReverseList () {}
+
+ /*
+ * (Computation int collection_size)
+ * (declare_variable global <List E> collection)
+ *
+ * (declare_variable E .buffer
+ * (declare_variable int .top)
+ * (declare_variable int .bot)
+ *
+ * (set .top (- (collection_size) 1))
+ * (set .bot 0)
+ *
+ * (while (< (var .bot) (var .top))
+ * (set .buffer collection[.top])
+ * (set collection[.top] collection[.bot])
+ * (set collection[.bot] .buffer)
+ * (set .bot (+ 1 (var .bot)))
+ * (set .top (- 1 (var .top)))
+ * )
+ */
+ public static Instruction generate
+ (
+ final AnonymousVariableManager anonymous_variables,
+ final InstructionManager assembler,
+ final Computation collection_size,
+ final Ref collection
+ )
+ {
+ final List<Instruction> result, while_body;
+ final Type element_type;
+ final Ref buffer, top, bot;
+ final Computation value_of_top, value_of_bot;
+ final Ref collection_at_top, collection_at_bot;
+
+ result = new ArrayList<Instruction>();
+ while_body = new ArrayList<Instruction>();
+
+ element_type =
+ ((MapType) collection.get_target_type()).get_member_type();
+
+ buffer = anonymous_variables.reserve(element_type);
+ top = anonymous_variables.reserve(Type.INT);
+ bot = anonymous_variables.reserve(Type.INT);
+
+ value_of_top = new ValueOf(top);
+ value_of_bot = new ValueOf(bot);
+
+ collection_at_top =
+ new RelativeRef
+ (
+ collection,
+ new Cast(value_of_top, Type.STRING),
+ element_type
+ );
+
+ collection_at_bot =
+ new RelativeRef
+ (
+ collection,
+ new Cast(value_of_bot, Type.STRING),
+ element_type
+ );
+
+ /* (set .top (- (collection_size) 1)) */
+ result.add
+ (
+ new SetValue(top, Operation.minus(collection_size, Constant.ONE))
+ );
+
+ /* (set .bot 0) */
+ result.add(new SetValue(bot, Constant.ZERO));
+
+
+ /* (set .buffer collection[.top]) */
+ while_body.add(new SetValue(buffer, new ValueOf(collection_at_top)));
+
+ /* (set collection[.top] collection[.bot]) */
+ while_body.add
+ (
+ new SetValue(collection_at_top, new ValueOf(collection_at_bot))
+ );
+
+ /* (set collection[.bot] .buffer) */
+ while_body.add
+ (
+ new SetValue(collection_at_bot, new ValueOf(buffer))
+ );
+
+ /* (set .bot (+ 1 (var .bot))) */
+ while_body.add
+ (
+ new SetValue(bot, Operation.plus(Constant.ONE, value_of_bot))
+ );
+
+ /* (set .top (- 1 (var .top))) */
+ while_body.add
+ (
+ new SetValue(top, Operation.minus(Constant.ONE, value_of_top))
+ );
+
+ /*
+ * (while (< (var .bot) (var .top))
+ * (set .buffer collection[.top])
+ * (set collection[.top] collection[.bot])
+ * (set collection[.bot] .buffer)
+ * (set .bot (+ 1 (var .bot)))
+ * (set .top (- 1 (var .top)))
+ * )
+ */
+ result.add
+ (
+ While.generate
+ (
+ anonymous_variables,
+ assembler,
+ Operation.less_than(value_of_bot, value_of_top),
+ assembler.merge(while_body)
+ )
+ );
+
+ anonymous_variables.release(buffer);
+ anonymous_variables.release(top);
+ anonymous_variables.release(bot);
+
+ return assembler.merge(result);
+ }
+}
diff --git a/src/core/src/tonkadur/wyrd/v1/lang/instruction/Assert.java b/src/core/src/tonkadur/wyrd/v1/lang/instruction/Assert.java
index 7bfa25b..57dd7c1 100644
--- a/src/core/src/tonkadur/wyrd/v1/lang/instruction/Assert.java
+++ b/src/core/src/tonkadur/wyrd/v1/lang/instruction/Assert.java
@@ -10,14 +10,16 @@ public class Assert extends Instruction
/**** MEMBERS **************************************************************/
/***************************************************************************/
protected final Computation condition;
+ protected final Computation message;
/***************************************************************************/
/**** PUBLIC ***************************************************************/
/***************************************************************************/
/**** Constructors *********************************************************/
- public Assert (final Computation condition)
+ public Assert (final Computation condition, final Computation message)
{
this.condition = condition;
+ this.message = message;
}
/**** Accessors ************************************************************/
@@ -26,6 +28,11 @@ public class Assert extends Instruction
return condition;
}
+ public Computation get_message ()
+ {
+ return message;
+ }
+
@Override
public void get_visited_by (final InstructionVisitor iv)
throws Throwable
@@ -43,6 +50,8 @@ public class Assert extends Instruction
sb.append("(Assert ");
sb.append(condition.toString());
+ sb.append(" ");
+ sb.append(message.toString());
sb.append(")");
return sb.toString();
diff --git a/src/json-export/src/tonkadur/jsonexport/InstructionCompiler.java b/src/json-export/src/tonkadur/jsonexport/InstructionCompiler.java
index 00445c7..8f7913b 100644
--- a/src/json-export/src/tonkadur/jsonexport/InstructionCompiler.java
+++ b/src/json-export/src/tonkadur/jsonexport/InstructionCompiler.java
@@ -33,16 +33,19 @@ public class InstructionCompiler implements InstructionVisitor
public void visit_assert (final Assert n)
throws Throwable
{
- final ComputationCompiler cc;
+ final ComputationCompiler cond_cc, msg_cc;
- cc = new ComputationCompiler();
+ cond_cc = new ComputationCompiler();
+ msg_cc = new ComputationCompiler();
- n.get_condition().get_visited_by(cc);
+ n.get_condition().get_visited_by(cond_cc);
+ n.get_message().get_visited_by(msg_cc);
result = new JSONObject();
result.put("category", "assert");
- result.put("condition", cc.get_result());
+ result.put("condition", cond_cc.get_result());
+ result.put("message", msg_cc.get_result());
}
public void visit_display (final Display n)
diff --git a/src/json-export/src/tonkadur/jsonexport/Translator.java b/src/json-export/src/tonkadur/jsonexport/Translator.java
index edd0a7f..cc22e7c 100644
--- a/src/json-export/src/tonkadur/jsonexport/Translator.java
+++ b/src/json-export/src/tonkadur/jsonexport/Translator.java
@@ -36,9 +36,6 @@ public class Translator
out = new PrintWriter(output_file);
out.println(result.toJSONString());
out.close();
-
- System.out.println("JSON Result:");
- System.out.println(result.toJSONString());
}
public static JSONArray get_compiled_variables (final World wyrd_world)