summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2020-08-02 02:31:47 +0200
committerNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2020-08-02 02:31:47 +0200
commite12788996fd47d5758a83b73138a6cef94f34fcb (patch)
treebd0f6b27640966265fa2c2d1762aed00b99e1608
parentb86a4839a7cea666cf7ab52a45ee6f66c783f435 (diff)
Starting to add some missing Fate content.
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/Access.java142
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/IndexOfOperator.java169
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/New.java57
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/Operator.java2
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/SwitchValue.java225
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/instruction/SwitchInstruction.java135
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/meta/ComputationVisitor.java12
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/meta/InstructionVisitor.java3
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/type/Type.java14
-rw-r--r--src/core/src/tonkadur/fate/v1/parser/FateLexer.g471
-rw-r--r--src/core/src/tonkadur/fate/v1/parser/FateParser.g4130
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/ComputationCompiler.java40
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/InstructionCompiler.java10
13 files changed, 979 insertions, 31 deletions
diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/Access.java b/src/core/src/tonkadur/fate/v1/lang/computation/Access.java
new file mode 100644
index 0000000..7aae4ca
--- /dev/null
+++ b/src/core/src/tonkadur/fate/v1/lang/computation/Access.java
@@ -0,0 +1,142 @@
+package tonkadur.fate.v1.lang.computation;
+
+import java.util.Collections;
+import java.util.List;
+
+import tonkadur.parser.Origin;
+
+import tonkadur.error.ErrorManager;
+
+import tonkadur.fate.v1.error.InvalidTypeException;
+import tonkadur.fate.v1.error.UnknownDictionaryFieldException;
+
+import tonkadur.fate.v1.lang.meta.ComputationVisitor;
+import tonkadur.fate.v1.lang.meta.Computation;
+import tonkadur.fate.v1.lang.meta.Reference;
+
+import tonkadur.fate.v1.lang.type.CollectionType;
+import tonkadur.fate.v1.lang.type.Type;
+
+public class Access extends Reference
+{
+ /***************************************************************************/
+ /**** MEMBERS **************************************************************/
+ /***************************************************************************/
+ protected final Reference parent;
+ protected final Computation index;
+
+ /***************************************************************************/
+ /**** PROTECTED ************************************************************/
+ /***************************************************************************/
+ /**** Constructors *********************************************************/
+ protected Access
+ (
+ final Origin origin,
+ final Reference parent,
+ final Type type,
+ final Computation index
+ )
+ {
+ super(origin, type, (parent.get_name() + "." + index.toString()));
+
+ this.parent = parent;
+ this.index = index;
+ }
+
+ /***************************************************************************/
+ /**** PUBLIC ***************************************************************/
+ /***************************************************************************/
+ /**** Constructors *********************************************************/
+ public static Access build
+ (
+ final Origin origin,
+ Reference parent,
+ final Computation index
+ )
+ throws
+ InvalidTypeException,
+ UnknownDictionaryFieldException
+ {
+ Type current_type;
+
+ current_type = parent.get_type();
+
+ if (current_type.get_base_type().equals(Type.REF))
+ {
+ parent = AtReference.build(origin, parent);
+ current_type = parent.get_type();
+ }
+
+ if (!index.get_type().can_be_used_as(Type.INT))
+ {
+ ErrorManager.handle
+ (
+ new InvalidTypeException
+ (
+ index.get_origin(),
+ current_type,
+ Collections.singleton(Type.INT),
+ parent.get_name()
+ )
+ );
+ }
+
+ if (!(current_type instanceof CollectionType))
+ {
+ ErrorManager.handle
+ (
+ new InvalidTypeException
+ (
+ origin,
+ current_type,
+ Collections.singleton(Type.LIST),
+ parent.get_name()
+ )
+ );
+
+ current_type = Type.ANY;
+ }
+ else
+ {
+ current_type = ((CollectionType) current_type).get_content_type();
+ }
+
+ return new Access(origin, parent, current_type, index);
+ }
+
+
+ /**** Accessors ************************************************************/
+ @Override
+ public void get_visited_by (final ComputationVisitor cv)
+ throws Throwable
+ {
+ cv.visit_access(this);
+ }
+
+ public Computation get_index ()
+ {
+ return index;
+ }
+
+ public Reference get_parent ()
+ {
+ return parent;
+ }
+
+ /**** Misc. ****************************************************************/
+ @Override
+ public String toString ()
+ {
+ final StringBuilder sb = new StringBuilder();
+
+ sb.append("(Access (");
+ sb.append(type.get_name());
+ sb.append(") ");
+ sb.append(name);
+ sb.append(".");
+ sb.append(index.toString());
+ sb.append(")");
+
+ return sb.toString();
+ }
+}
diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/IndexOfOperator.java b/src/core/src/tonkadur/fate/v1/lang/computation/IndexOfOperator.java
new file mode 100644
index 0000000..687be29
--- /dev/null
+++ b/src/core/src/tonkadur/fate/v1/lang/computation/IndexOfOperator.java
@@ -0,0 +1,169 @@
+package tonkadur.fate.v1.lang.computation;
+
+import tonkadur.error.ErrorManager;
+
+import tonkadur.parser.Origin;
+
+import tonkadur.fate.v1.error.ConflictingTypeException;
+import tonkadur.fate.v1.error.IncomparableTypeException;
+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.ComputationVisitor;
+import tonkadur.fate.v1.lang.meta.Computation;
+
+public class IndexOfOperator extends Computation
+{
+ /***************************************************************************/
+ /**** MEMBERS **************************************************************/
+ /***************************************************************************/
+ protected final Computation element;
+ protected final Computation collection;
+
+ /***************************************************************************/
+ /**** PROTECTED ************************************************************/
+ /***************************************************************************/
+ /**** Constructors *********************************************************/
+ protected IndexOfOperator
+ (
+ final Origin origin,
+ final Computation element,
+ final Computation collection
+ )
+ {
+ super(origin, Type.INT);
+
+ this.collection = collection;
+ this.element = element;
+ }
+
+ /***************************************************************************/
+ /**** PUBLIC ***************************************************************/
+ /***************************************************************************/
+ /**** Constructors *********************************************************/
+ public static IndexOfOperator build
+ (
+ final Origin origin,
+ final Computation element,
+ final Computation collection
+ )
+ throws
+ InvalidTypeException,
+ ConflictingTypeException,
+ IncomparableTypeException
+ {
+ final Type hint;
+ final Type collection_type;
+ final CollectionType collection_true_type;
+ final Type collection_element_type;
+
+ collection_type = collection.get_type();
+
+ if
+ (
+ !Type.COLLECTION_TYPES.contains(collection_type.get_base_type())
+ || !(collection_type instanceof CollectionType)
+ )
+ {
+ ErrorManager.handle
+ (
+ new InvalidTypeException
+ (
+ collection.get_origin(),
+ collection.get_type(),
+ Type.COLLECTION_TYPES
+ )
+ );
+ }
+
+ collection_true_type = (CollectionType) collection_type;
+ collection_element_type = collection_true_type.get_content_type();
+
+ if
+ (
+ element.get_type().can_be_used_as(collection_element_type)
+ ||
+ (element.get_type().try_merging_with(collection_element_type) != null)
+ )
+ {
+ return new IndexOfOperator(origin, element, collection);
+ }
+
+ ErrorManager.handle
+ (
+ new ConflictingTypeException
+ (
+ element.get_origin(),
+ element.get_type(),
+ collection_element_type
+ )
+ );
+
+ hint =
+ (Type) element.get_type().generate_comparable_to
+ (
+ collection_element_type
+ );
+
+ if (hint.equals(Type.ANY))
+ {
+ ErrorManager.handle
+ (
+ new IncomparableTypeException
+ (
+ element.get_origin(),
+ element.get_type(),
+ collection_element_type
+ )
+ );
+ }
+
+ return new IndexOfOperator(origin, element, collection);
+ }
+
+ /**** Accessors ************************************************************/
+ @Override
+ public void get_visited_by (final ComputationVisitor cv)
+ throws Throwable
+ {
+ cv.visit_index_of_operator(this);
+ }
+
+ public Computation get_collection ()
+ {
+ return collection;
+ }
+
+ public Computation get_element ()
+ {
+ return element;
+ }
+
+ /**** Misc. ****************************************************************/
+ @Override
+ public String toString ()
+ {
+ final StringBuilder sb = new StringBuilder();
+
+ sb.append(origin.toString());
+ sb.append("(IndexOfOperator");
+ sb.append(System.lineSeparator());
+ sb.append(System.lineSeparator());
+
+ sb.append("element:");
+ sb.append(System.lineSeparator());
+ sb.append(element.toString());
+ sb.append(System.lineSeparator());
+ sb.append(System.lineSeparator());
+
+ sb.append("collection:");
+ sb.append(System.lineSeparator());
+ sb.append(collection.toString());
+
+ sb.append(")");
+
+ return sb.toString();
+ }
+}
diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/New.java b/src/core/src/tonkadur/fate/v1/lang/computation/New.java
new file mode 100644
index 0000000..83eef1f
--- /dev/null
+++ b/src/core/src/tonkadur/fate/v1/lang/computation/New.java
@@ -0,0 +1,57 @@
+package tonkadur.fate.v1.lang.computation;
+
+import tonkadur.parser.Origin;
+
+import tonkadur.fate.v1.lang.type.RefType;
+import tonkadur.fate.v1.lang.type.Type;
+
+import tonkadur.fate.v1.lang.meta.ComputationVisitor;
+import tonkadur.fate.v1.lang.meta.Computation;
+
+public class New extends Computation
+{
+ /***************************************************************************/
+ /**** MEMBERS **************************************************************/
+ /***************************************************************************/
+ protected final Type target_type;
+
+ /***************************************************************************/
+ /**** PROTECTED ************************************************************/
+ /***************************************************************************/
+ /**** Constructors *********************************************************/
+ public New (final Origin origin, final Type t)
+ {
+ super(origin, new RefType(origin, t, "auto generated"));
+ this.target_type = t;
+ }
+
+ /***************************************************************************/
+ /**** PUBLIC ***************************************************************/
+ /***************************************************************************/
+ /**** Accessors ************************************************************/
+ @Override
+ public void get_visited_by (final ComputationVisitor cv)
+ throws Throwable
+ {
+ cv.visit_new(this);
+ }
+
+ public Type get_target_type ()
+ {
+ return target_type;
+ }
+
+ /**** Misc. ****************************************************************/
+ @Override
+ public String toString ()
+ {
+ final StringBuilder sb = new StringBuilder();
+
+ sb.append(origin.toString());
+ sb.append("(New ");
+ sb.append(target_type.get_name());
+ sb.append(") ");
+
+ return sb.toString();
+ }
+}
diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/Operator.java b/src/core/src/tonkadur/fate/v1/lang/computation/Operator.java
index 2950636..12b3283 100644
--- a/src/core/src/tonkadur/fate/v1/lang/computation/Operator.java
+++ b/src/core/src/tonkadur/fate/v1/lang/computation/Operator.java
@@ -72,7 +72,7 @@ public class Operator
);
EQUALS =
- new Operator("equals", 2, 0, Type.SIMPLE_BASE_TYPES, Type.BOOLEAN);
+ new Operator("equals", 2, 0, Type.ALL_TYPES, Type.BOOLEAN);
LOWER_THAN =
new Operator("<", 2, 2, Type.SIMPLE_BASE_TYPES, Type.BOOLEAN);
LOWER_EQUAL_THAN =
diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/SwitchValue.java b/src/core/src/tonkadur/fate/v1/lang/computation/SwitchValue.java
new file mode 100644
index 0000000..3f22e51
--- /dev/null
+++ b/src/core/src/tonkadur/fate/v1/lang/computation/SwitchValue.java
@@ -0,0 +1,225 @@
+package tonkadur.fate.v1.lang.computation;
+
+import java.util.List;
+import java.util.Collections;
+
+import tonkadur.functional.Cons;
+
+import tonkadur.error.ErrorManager;
+
+import tonkadur.parser.Origin;
+
+import tonkadur.fate.v1.error.ConflictingTypeException;
+import tonkadur.fate.v1.error.IncomparableTypeException;
+import tonkadur.fate.v1.error.InvalidTypeException;
+
+import tonkadur.fate.v1.lang.type.Type;
+
+import tonkadur.fate.v1.lang.meta.ComputationVisitor;
+import tonkadur.fate.v1.lang.meta.Computation;
+
+public class SwitchValue extends Computation
+{
+ /***************************************************************************/
+ /**** MEMBERS **************************************************************/
+ /***************************************************************************/
+ protected final Computation target;
+ protected final Computation default_value;
+ protected final List<Cons<Computation, Computation>> branches;
+
+ /***************************************************************************/
+ /**** PROTECTED ************************************************************/
+ /***************************************************************************/
+ /**** Constructors *********************************************************/
+ protected SwitchValue
+ (
+ final Origin origin,
+ final Type return_type,
+ final Computation target,
+ final List<Cons<Computation, Computation>> branches,
+ final Computation default_value
+ )
+ {
+ super(origin, return_type);
+
+ this.target = target;
+ this.branches = branches;
+ this.default_value = default_value;
+ }
+
+ /***************************************************************************/
+ /**** PUBLIC ***************************************************************/
+ /***************************************************************************/
+ /**** Constructors *********************************************************/
+ public static SwitchValue build
+ (
+ final Origin origin,
+ final Computation target,
+ final List<Cons<Computation, Computation>> branches,
+ final Computation default_value
+ )
+ throws
+ InvalidTypeException,
+ ConflictingTypeException,
+ IncomparableTypeException
+ {
+ final Type target_type;
+ final Type first_type;
+ Type candidate_hint, hint;
+
+ target_type = target.get_type();
+ first_type = branches.get(0).get_cdr().get_type();
+ hint = first_type;
+
+ for (final Cons<Computation, Computation> entry: branches)
+ {
+ if (!entry.get_car().get_type().can_be_used_as(target_type))
+ {
+ ErrorManager.handle
+ (
+ new InvalidTypeException
+ (
+ entry.get_car().get_origin(),
+ entry.get_car().get_type(),
+ Collections.singleton(target_type)
+ )
+ );
+ }
+
+ if (entry.get_cdr().get_type().equals(hint))
+ {
+ continue;
+ }
+
+ candidate_hint = entry.get_cdr().get_type().try_merging_with(hint);
+
+ if (candidate_hint != null)
+ {
+ hint = candidate_hint;
+
+ continue;
+ }
+
+ ErrorManager.handle
+ (
+ new ConflictingTypeException
+ (
+ entry.get_cdr().get_origin(),
+ entry.get_cdr().get_type(),
+ first_type
+ )
+ );
+
+ hint = (Type) hint.generate_comparable_to(entry.get_cdr().get_type());
+
+ if (hint.equals(Type.ANY))
+ {
+ ErrorManager.handle
+ (
+ new IncomparableTypeException
+ (
+ entry.get_cdr().get_origin(),
+ entry.get_cdr().get_type(),
+ first_type
+ )
+ );
+ }
+ }
+
+ if (default_value.get_type().equals(hint))
+ {
+ return new SwitchValue(origin, hint, target, branches, default_value);
+ }
+
+ candidate_hint = default_value.get_type().try_merging_with(hint);
+
+ if (candidate_hint != null)
+ {
+ hint = candidate_hint;
+
+ return new SwitchValue(origin, hint, target, branches, default_value);
+ }
+
+ ErrorManager.handle
+ (
+ new ConflictingTypeException
+ (
+ default_value.get_origin(),
+ default_value.get_type(),
+ first_type
+ )
+ );
+
+ hint = (Type) hint.generate_comparable_to(default_value.get_type());
+
+ if (hint.equals(Type.ANY))
+ {
+ ErrorManager.handle
+ (
+ new IncomparableTypeException
+ (
+ default_value.get_origin(),
+ default_value.get_type(),
+ first_type
+ )
+ );
+ }
+
+ return new SwitchValue(origin, hint, target, branches, default_value);
+ }
+
+ /**** Accessors ************************************************************/
+ @Override
+ public void get_visited_by (final ComputationVisitor cv)
+ throws Throwable
+ {
+ cv.visit_switch_value(this);
+ }
+
+ public List<Cons<Computation, Computation>> get_branches ()
+ {
+ return branches;
+ }
+
+ public Computation get_target ()
+ {
+ return target;
+ }
+
+ public Computation get_default ()
+ {
+ return default_value;
+ }
+
+ /**** Misc. ****************************************************************/
+ @Override
+ public String toString ()
+ {
+ final StringBuilder sb = new StringBuilder();
+
+ sb.append(origin.toString());
+ sb.append("(SwitchValue");
+ sb.append(System.lineSeparator());
+
+ for (final Cons<Computation, Computation> entry: branches)
+ {
+ sb.append(System.lineSeparator());
+ sb.append("On value:");
+ sb.append(System.lineSeparator());
+ sb.append(entry.get_car().toString());
+ sb.append(System.lineSeparator());
+ sb.append("Return:");
+ sb.append(entry.get_cdr().toString());
+ sb.append(System.lineSeparator());
+ }
+
+ sb.append(System.lineSeparator());
+ sb.append("default:");
+ sb.append(default_value.toString());
+ sb.append(System.lineSeparator());
+
+ sb.append(")");
+
+ return sb.toString();
+ }
+}
diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/SwitchInstruction.java b/src/core/src/tonkadur/fate/v1/lang/instruction/SwitchInstruction.java
new file mode 100644
index 0000000..b67dc42
--- /dev/null
+++ b/src/core/src/tonkadur/fate/v1/lang/instruction/SwitchInstruction.java
@@ -0,0 +1,135 @@
+package tonkadur.fate.v1.lang.instruction;
+
+import java.util.Collections;
+import java.util.List;
+
+import tonkadur.error.ErrorManager;
+
+import tonkadur.functional.Cons;
+
+import tonkadur.parser.Origin;
+
+import tonkadur.fate.v1.error.InvalidTypeException;
+
+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 SwitchInstruction extends Instruction
+{
+ /***************************************************************************/
+ /**** MEMBERS **************************************************************/
+ /***************************************************************************/
+ protected final Computation target;
+ protected final List<Cons<Computation, Instruction>> branches;
+ protected final Instruction default_instruction;
+
+ /***************************************************************************/
+ /**** PROTECTED ************************************************************/
+ /***************************************************************************/
+ /**** Constructors *********************************************************/
+ protected SwitchInstruction
+ (
+ final Origin origin,
+ final Computation target,
+ final List<Cons<Computation, Instruction>> branches,
+ final Instruction default_instruction
+ )
+ {
+ super(origin);
+
+ this.target = target;
+ this.branches = branches;
+ this.default_instruction = default_instruction;
+ }
+
+ /***************************************************************************/
+ /**** PUBLIC ***************************************************************/
+ /***************************************************************************/
+ /**** Constructors *********************************************************/
+ public static SwitchInstruction build
+ (
+ final Origin origin,
+ final Computation target,
+ final List<Cons<Computation, Instruction>> branches,
+ final Instruction default_instruction
+ )
+ throws InvalidTypeException
+ {
+ final Type target_type;
+
+ target_type = target.get_type();
+
+ for (final Cons<Computation, Instruction> branch: branches)
+ {
+ if (!branch.get_car().get_type().get_base_type().equals(target_type))
+ {
+ ErrorManager.handle
+ (
+ new InvalidTypeException
+ (
+ branch.get_car().get_origin(),
+ branch.get_car().get_type(),
+ Collections.singleton(target_type)
+ )
+ );
+ }
+ }
+
+ return new SwitchInstruction(origin, target, branches, default_instruction);
+ }
+
+ /**** Accessors ************************************************************/
+ @Override
+ public void get_visited_by (final InstructionVisitor iv)
+ throws Throwable
+ {
+ iv.visit_switch_instruction(this);
+ }
+
+ public Computation get_target ()
+ {
+ return target;
+ }
+
+ public List<Cons<Computation, Instruction>> get_branches ()
+ {
+ return branches;
+ }
+
+ public Instruction get_default_instruction ()
+ {
+ return default_instruction;
+ }
+
+ /**** Misc. ****************************************************************/
+ @Override
+ public String toString ()
+ {
+ final StringBuilder sb = new StringBuilder();
+
+ sb.append("(SwitchInstruction");
+ sb.append(System.lineSeparator());
+
+ for (final Cons<Computation, Instruction> branch: branches)
+ {
+ sb.append(System.lineSeparator());
+ sb.append("case:");
+ sb.append(branch.get_car().toString());
+
+ sb.append(System.lineSeparator());
+ sb.append("then:");
+ sb.append(branch.get_cdr().toString());
+ }
+
+ sb.append(System.lineSeparator());
+ sb.append("default:");
+ sb.append(default_instruction.toString());
+
+ sb.append(")");
+
+ return sb.toString();
+ }
+}
diff --git a/src/core/src/tonkadur/fate/v1/lang/meta/ComputationVisitor.java b/src/core/src/tonkadur/fate/v1/lang/meta/ComputationVisitor.java
index 9223c7b..203289e 100644
--- a/src/core/src/tonkadur/fate/v1/lang/meta/ComputationVisitor.java
+++ b/src/core/src/tonkadur/fate/v1/lang/meta/ComputationVisitor.java
@@ -7,12 +7,21 @@ public interface ComputationVisitor
public void visit_at_reference (final AtReference n)
throws Throwable;
+ public void visit_access (final Access n)
+ throws Throwable;
+
+ public void visit_new (final New 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_switch_value (final SwitchValue n)
+ throws Throwable;
+
public void visit_constant (final Constant n)
throws Throwable;
@@ -28,6 +37,9 @@ public interface ComputationVisitor
public void visit_is_member_operator (final IsMemberOperator n)
throws Throwable;
+ public void visit_index_of_operator (final IndexOfOperator n)
+ throws Throwable;
+
public void visit_macro_value_call (final MacroValueCall n)
throws Throwable;
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 5f78fc0..fc542bd 100644
--- a/src/core/src/tonkadur/fate/v1/lang/meta/InstructionVisitor.java
+++ b/src/core/src/tonkadur/fate/v1/lang/meta/InstructionVisitor.java
@@ -17,6 +17,9 @@ public interface InstructionVisitor
public void visit_cond_instruction (final CondInstruction ci)
throws Throwable;
+ public void visit_switch_instruction (final SwitchInstruction ci)
+ throws Throwable;
+
public void visit_display (final Display n)
throws Throwable;
diff --git a/src/core/src/tonkadur/fate/v1/lang/type/Type.java b/src/core/src/tonkadur/fate/v1/lang/type/Type.java
index 0cf19b4..aa3e01c 100644
--- a/src/core/src/tonkadur/fate/v1/lang/type/Type.java
+++ b/src/core/src/tonkadur/fate/v1/lang/type/Type.java
@@ -31,6 +31,7 @@ public class Type extends DeclaredEntity
public static final Type STRING;
public static final Set<Type> NUMBER_TYPES;
+ public static final Set<Type> ALL_TYPES;
public static final Set<Type> SIMPLE_BASE_TYPES;
public static final Set<Type> COLLECTION_TYPES;
@@ -55,6 +56,19 @@ public class Type extends DeclaredEntity
SET = new Type(base, null, "set");
STRING = new Type(base, null, "string");
+ ALL_TYPES = new HashSet<Type>();
+ ALL_TYPES.add(ANY);
+ ALL_TYPES.add(BOOLEAN);
+ ALL_TYPES.add(DICT);
+ ALL_TYPES.add(FLOAT);
+ ALL_TYPES.add(INT);
+ ALL_TYPES.add(LIST);
+ ALL_TYPES.add(REF);
+ ALL_TYPES.add(RICH_TEXT);
+ ALL_TYPES.add(SET);
+ ALL_TYPES.add(STRING);
+
+
NUMBER_TYPES = new HashSet<Type>();
NUMBER_TYPES.add(FLOAT);
NUMBER_TYPES.add(INT);
diff --git a/src/core/src/tonkadur/fate/v1/parser/FateLexer.g4 b/src/core/src/tonkadur/fate/v1/parser/FateLexer.g4
index 6c12fa4..db257bf 100644
--- a/src/core/src/tonkadur/fate/v1/parser/FateLexer.g4
+++ b/src/core/src/tonkadur/fate/v1/parser/FateLexer.g4
@@ -6,6 +6,7 @@ lexer grammar FateLexer;
}
fragment SEP: [ \t\r\n]+;
+fragment US: '_'?;
WS: SEP;
@@ -13,6 +14,7 @@ L_PAREN: '(';
R_PAREN: ')';
+ACCESS_KW: L_PAREN 'access' SEP+;
ADD_KW: L_PAREN 'add' SEP+;
AND_KW: L_PAREN ('and'|'/\\') SEP+;
ASSERT_KW: L_PAREN 'assert' SEP+;
@@ -21,19 +23,20 @@ CAST_KW: L_PAREN 'cast' SEP+;
CLEAR_KW: L_PAREN 'clear' SEP+;
COND_KW: L_PAREN 'cond' SEP+;
COUNT_KW: L_PAREN 'count' SEP+;
-DECLARE_ALIAS_TYPE_KW: L_PAREN ((('declare'|'define'|'def')'_'('sub'('_'?))?'type')|'typedef') SEP+;
-DECLARE_DICT_TYPE_KW: L_PAREN ('declare'|'define'|'def')'_dict_type' SEP+;
-DECLARE_EVENT_TYPE_KW: L_PAREN ('declare'|'define'|'def')'_event_type' SEP+;
-DECLARE_LIST_TYPE_KW: L_PAREN ('declare'|'define'|'def')'_list_type' SEP+;
-DECLARE_REF_TYPE_KW: L_PAREN ('declare'|'define'|'def')'_ref_type' SEP+;
-DECLARE_SET_TYPE_KW: L_PAREN ('declare'|'define'|'def')'_set_type' SEP+;
-DECLARE_TEXT_EFFECT_KW: L_PAREN ('declare'|'define'|'def')'_text_effect' SEP+;
-DECLARE_VARIABLE_KW: L_PAREN ('declare'|'define'|'def')'_var'('iable')? SEP+;
-DEFINE_MACRO_KW: L_PAREN ('declare'|'define'|'def')'_macro' SEP+;
-DEFINE_SEQUENCE_KW: L_PAREN ('declare'|'define'|'def')'_sequence' SEP+;
-DELETE_KW: L_PAREN 'delete' SEP+;
+DECLARE_ALIAS_TYPE_KW:
+ L_PAREN ((('declare'|'define'|'def')US('sub'US)?'type')|'typedef') SEP+;
+DECLARE_DICT_TYPE_KW: L_PAREN ('declare'|'define'|'def')US'dict'(US'type')? SEP+;
+DECLARE_EVENT_TYPE_KW: L_PAREN ('declare'|'define'|'def')US'event'(US'type')? SEP+;
+DECLARE_LIST_TYPE_KW: L_PAREN ('declare'|'define'|'def')US'list'(US'type')? SEP+;
+DECLARE_REF_TYPE_KW: L_PAREN ('declare'|'define'|'def')US'ref'(US'type')? SEP+;
+DECLARE_SET_TYPE_KW: L_PAREN ('declare'|'define'|'def')US'set'(US'type')? SEP+;
+DECLARE_TEXT_EFFECT_KW: L_PAREN ('declare'|'define'|'def')US'text'US'effect' SEP+;
+DECLARE_VARIABLE_KW: L_PAREN ('declare'|'define'|'def')US'var'('iable')? SEP+;
+DEFINE_MACRO_KW: L_PAREN ('declare'|'define'|'def')US'macro' SEP+;
+DEFINE_SEQUENCE_KW: L_PAREN ('declare'|'define'|'def')US'seq'('uence')? SEP+;
DIVIDE_KW: L_PAREN ('divide'|'/'|'div') SEP+;
-ENABLE_TEXT_EFFECT_KW: L_PAREN 'text_effect' SEP+;
+DO_WHILE_KW: L_PAREN ('do'US'while') SEP+;
+ENABLE_TEXT_EFFECT_KW: L_PAREN 'text'US'effect' SEP+;
END_KW: L_PAREN 'end)';
EQUALS_KW: L_PAREN ('equals'|'='|'=='|'eq') SEP+;
EVENT_KW: L_PAREN 'event' SEP+;
@@ -41,42 +44,50 @@ EXTENSION_FIRST_LEVEL_KW: L_PAREN '@';
EXTENSION_INSTRUCTION_KW: L_PAREN '#';
EXTENSION_VALUE_KW: L_PAREN '$';
FALSE_KW: L_PAREN 'false)';
-FATE_VERSION_KW: L_PAREN 'fate_version' SEP+;
+FATE_VERSION_KW: L_PAREN 'fate'US'version' SEP+;
FIELD_KW: L_PAREN 'field' SEP+;
-GREATER_EQUAL_THAN_KW: L_PAREN ('greater_equal_than'|'>='|'ge') SEP+;
-GREATER_THAN_KW: L_PAREN ('greater_than'|'>'|'gt') SEP+;
-IF_ELSE_KW: L_PAREN ('if_else'|'ifelse') SEP+;
+FOR_EACH_KW: L_PAREN ('for'US'each') SEP+;
+FOR_KW: L_PAREN 'for' SEP+;
+FREE_KW: L_PAREN ('free'|'release'|'destroy') SEP+;
+GREATER_EQUAL_THAN_KW: L_PAREN ('greater'US'equal'US'than'|'>='|'ge') SEP+;
+GREATER_THAN_KW: L_PAREN ('greater'US'than'|'>'|'gt') SEP+;
+IF_ELSE_KW: L_PAREN ('if'US'else') SEP+;
IF_KW: L_PAREN 'if' SEP+;
IMACRO_KW: L_PAREN 'macro' SEP+;
-IMPLIES_KW: L_PAREN ('implies'|'=>') SEP+;
+IMPLIES_KW: L_PAREN ('implies'|'=>'|'->') SEP+;
INCLUDE_KW: L_PAREN 'include' SEP+;
-IS_MEMBER_KW: L_PAREN ('is_member'|'contains') SEP+;
-LOWER_EQUAL_THAN_KW: L_PAREN ('lower_equal_than'|'=<'|'<='|'le') SEP+;
-LOWER_THAN_KW: L_PAREN ('lower_than'|'<'|'lt') SEP+;
+INDEX_OF_KW: L_PAREN ('index'US'of') SEP+;
+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+;
+MODULO_KW: L_PAREN ('modulo'|'%'|'mod') SEP+;
NEWLINE_KW: L_PAREN 'newline)';
-NEW_KW: L_PAREN 'new' SEP+;
+NEW_KW: L_PAREN ('new'|'reserve'|'create') SEP+;
NOT_KW: L_PAREN ('not'|'~'|'!') SEP+;
-ONE_IN_KW: L_PAREN 'one_in' SEP+;
+ONE_IN_KW: L_PAREN 'one'US'in' SEP+;
OR_KW: L_PAREN ('or'|'\\/') SEP+;
PARAMETER_KW: L_PAREN ('param'|'parameter'|'par') SEP+;
-PLAYER_CHOICE_KW: L_PAREN ('choice'|'user_choice'|'player_choice') SEP+;
+PLAYER_CHOICE_KW: L_PAREN ('choice'|'user'US'choice'|'player'US'choice') SEP+;
PLUS_KW: L_PAREN ('plus'|'+') SEP+;
-POWER_KW: L_PAREN ('power'|'^'|'**') SEP+;
-RANDOM_KW: L_PAREN ('random'|'rand') SEP+;
+POWER_KW: L_PAREN ('power'|'^'|'**'|'pow') SEP+;
+RANDOM_KW: L_PAREN ('random'|'rand'|'rnd') SEP+;
REF_KW: L_PAREN 'ref' SEP+;
-REMOVE_ALL_KW: L_PAREN 'remove_all' SEP+;
-REMOVE_ONE_KW: L_PAREN 'remove_one' SEP+;
-REQUIRE_EXTENSION_KW: L_PAREN 'require_extension' SEP+;
+REMOVE_ALL_KW: L_PAREN 'remove'US'all' SEP+;
+REMOVE_ONE_KW: L_PAREN 'remove'US'one' SEP+;
+REMOVE_AT_KW: L_PAREN ('remove'US'at'|'rm'|'del'|'delete') SEP+;
+REQUIRE_EXTENSION_KW: L_PAREN 'require'US'extension' SEP+;
REQUIRE_KW: L_PAREN 'require' SEP+;
-SEQUENCE_KW: L_PAREN 'sequence' SEP+;
-SET_FIELDS_KW: L_PAREN 'set_fields' SEP+;
+SEQUENCE_KW: L_PAREN 'seq'('uence')? SEP+;
+SET_FIELDS_KW: L_PAREN 'set'US'fields' SEP+;
SET_KW: L_PAREN 'set' SEP+;
+SWITCH_KW: L_PAREN 'switch' SEP+;
TIMES_KW: L_PAREN ('times'|'*') SEP+;
TRUE_KW: L_PAREN 'true)';
VAL_KW: L_PAREN ('val'|'value') SEP+;
VARIABLE_KW: L_PAREN ('variable'|'var') SEP+;
VMACRO_KW: L_PAREN 'vmacro' SEP+;
+WHILE_KW: L_PAREN 'while' SEP+;
WORD: (~([ \t\r\n()])|'\\)'|'\\(')+;
diff --git a/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 b/src/core/src/tonkadur/fate/v1/parser/FateParser.g4
index b77ad98..cd8ca3a 100644
--- a/src/core/src/tonkadur/fate/v1/parser/FateParser.g4
+++ b/src/core/src/tonkadur/fate/v1/parser/FateParser.g4
@@ -602,6 +602,23 @@ returns [Instruction result]
);
}
+ | REMOVE_AT_KW value WS+ value_reference WS* R_PAREN
+ {
+ $result = null;
+ /*
+ RemoveElementAt.build
+ (
+ CONTEXT.get_origin_at
+ (
+ ($REMOVE_AT_KW.getLine()),
+ ($REMOVE_AT_KW.getCharPositionInLine())
+ ),
+ ($value.result),
+ ($value_reference.result)
+ );
+ */
+ }
+
| REMOVE_ALL_KW value WS+ value_reference WS* R_PAREN
{
$result =
@@ -646,6 +663,12 @@ returns [Instruction result]
);
}
+ | FREE_KW value_reference WS* R_PAREN
+ {
+ /* TODO */
+ $result = null;
+ }
+
| SET_FIELDS_KW value_reference WS* field_value_list WS* R_PAREN
{
final Origin origin;
@@ -685,6 +708,30 @@ returns [Instruction result]
$result = new InstructionList(origin, operations);
}
+ | WHILE_KW value WS* general_fate_sequence WS* R_PAREN
+ {
+ /* TODO */
+ $result = null;
+ }
+
+ | DO_WHILE_KW value WS* general_fate_sequence WS* R_PAREN
+ {
+ /* TODO */
+ $result = null;
+ }
+
+ | FOR_KW general_fate_instr WS * value WS* general_fate_instr WS* general_fate_sequence WS* R_PAREN
+ {
+ /* TODO */
+ $result = null;
+ }
+
+ | FOR_EACH_KW value_reference WS+ WORD WS+ general_fate_sequence WS* R_PAREN
+ {
+ /* TODO */
+ $result = null;
+ }
+
| EVENT_KW WORD WS+ value_list WS* R_PAREN
{
final Origin origin;
@@ -836,6 +883,22 @@ returns [Instruction result]
);
}
+ | SWITCH_KW value WS* instr_cond_list WS* general_fate_instr WS *R_PAREN
+ {
+ $result =
+ SwitchInstruction.build
+ (
+ CONTEXT.get_origin_at
+ (
+ ($SWITCH_KW.getLine()),
+ ($SWITCH_KW.getCharPositionInLine())
+ ),
+ ($value.result),
+ ($instr_cond_list.result),
+ ($general_fate_instr.result)
+ );
+ }
+
| PLAYER_CHOICE_KW player_choice_list WS* R_PAREN
{
$result =
@@ -1621,6 +1684,27 @@ returns [Computation result]:
($value_reference.result)
);
}
+
+ | INDEX_OF_KW value WS+ value_reference WS* R_PAREN
+ {
+ $result =
+ IndexOfOperator.build
+ (
+ CONTEXT.get_origin_at
+ (
+ ($INDEX_OF_KW.getLine()),
+ ($INDEX_OF_KW.getCharPositionInLine())
+ ),
+ ($value.result),
+ ($value_reference.result)
+ );
+ }
+
+ | NEW_KW WORD WS* R_PAREN
+ {
+ /* TODO */
+ $result = null;
+ }
;
catch [final Throwable e]
{
@@ -1666,6 +1750,21 @@ returns [Computation result]:
);
}
+ | MODULO_KW value_list WS* R_PAREN
+ {
+ $result =
+ Operation.build
+ (
+ CONTEXT.get_origin_at
+ (
+ ($MODULO_KW.getLine()),
+ ($MODULO_KW.getCharPositionInLine())
+ ),
+ Operator.MODULO,
+ ($value_list.result)
+ );
+ }
+
| TIMES_KW value_list WS* R_PAREN
{
$result =
@@ -1902,6 +2001,22 @@ returns [Computation result]
);
}
+ | SWITCH_KW target=value WS* value_cond_list WS* default_val=value WS* R_PAREN
+ {
+ $result =
+ SwitchValue.build
+ (
+ CONTEXT.get_origin_at
+ (
+ ($SWITCH_KW.getLine()),
+ ($SWITCH_KW.getCharPositionInLine())
+ ),
+ ($target.result),
+ ($value_cond_list.result),
+ ($default_val.result)
+ );
+ }
+
| boolean_expression
{
$result = ($boolean_expression.result);
@@ -2060,6 +2175,21 @@ returns [Reference result]
);
}
+ | ACCESS_KW value_reference value R_PAREN
+ {
+ $result =
+ Access.build
+ (
+ CONTEXT.get_origin_at
+ (
+ ($ACCESS_KW.getLine()),
+ ($ACCESS_KW.getCharPositionInLine())
+ ),
+ ($value_reference.result),
+ ($value.result)
+ );
+ }
+
| VARIABLE_KW WORD WS* R_PAREN
{
final Origin target_var_origin;
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 4766e73..dd3e707 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
@@ -960,6 +960,46 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor
}
@Override
+ public void visit_index_of_operator
+ (
+ final tonkadur.fate.v1.lang.computation.IndexOfOperator n
+ )
+ throws Throwable
+ {
+ /* TODO */
+ }
+
+ @Override
+ public void visit_new
+ (
+ final tonkadur.fate.v1.lang.computation.New n
+ )
+ throws Throwable
+ {
+ /* TODO */
+ }
+
+ @Override
+ public void visit_access
+ (
+ final tonkadur.fate.v1.lang.computation.Access n
+ )
+ throws Throwable
+ {
+ /* TODO */
+ }
+
+ @Override
+ public void visit_switch_value
+ (
+ final tonkadur.fate.v1.lang.computation.SwitchValue n
+ )
+ throws Throwable
+ {
+ /* TODO */
+ }
+
+ @Override
public void visit_paragraph
(
final tonkadur.fate.v1.lang.computation.Paragraph n
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 d0b3711..5277fd3 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
@@ -333,6 +333,16 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor
}
@Override
+ public void visit_switch_instruction
+ (
+ final tonkadur.fate.v1.lang.instruction.SwitchInstruction ci
+ )
+ throws Throwable
+ {
+ /* TODO */
+ }
+
+ @Override
public void visit_cond_instruction
(
final tonkadur.fate.v1.lang.instruction.CondInstruction ci