summaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
authorNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2020-07-11 15:37:46 +0200
committerNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2020-07-11 15:37:46 +0200
commite9f9708a43fa6030a943478f203f08fc37aa28ec (patch)
tree2136140a155362e33b60cb4bfcfa358a0de5b358 /src/core
parent88657c6dba477efeb42dd1b94d7636f5633b38d4 (diff)
...
Diffstat (limited to 'src/core')
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/RefOperator.java44
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/RefType.java91
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/Type.java3
-rw-r--r--src/core/src/tonkadur/fate/v1/parser/FateLexer.g43
-rw-r--r--src/core/src/tonkadur/fate/v1/parser/FateParser.g424
5 files changed, 165 insertions, 0 deletions
diff --git a/src/core/src/tonkadur/fate/v1/lang/RefOperator.java b/src/core/src/tonkadur/fate/v1/lang/RefOperator.java
new file mode 100644
index 0000000..f55be22
--- /dev/null
+++ b/src/core/src/tonkadur/fate/v1/lang/RefOperator.java
@@ -0,0 +1,44 @@
+package tonkadur.fate.v1.lang;
+
+import tonkadur.parser.Origin;
+
+import tonkadur.fate.v1.lang.meta.ValueNode;
+
+public class RefOperator extends ValueNode
+{
+ /***************************************************************************/
+ /**** MEMBERS **************************************************************/
+ /***************************************************************************/
+ protected final Variable variable;
+
+ /***************************************************************************/
+ /**** PROTECTED ************************************************************/
+ /***************************************************************************/
+ /**** Constructors *********************************************************/
+ public RefOperator (final Origin origin, final Variable variable)
+ {
+ super(origin, new RefType(origin, variable.get_type(), "auto generated"));
+ this.variable = variable;
+ }
+
+ /***************************************************************************/
+ /**** PUBLIC ***************************************************************/
+ /***************************************************************************/
+ /**** Constructors *********************************************************/
+
+ /**** Accessors ************************************************************/
+
+ /**** Misc. ****************************************************************/
+ @Override
+ public String toString ()
+ {
+ final StringBuilder sb = new StringBuilder();
+
+ sb.append(origin.toString());
+ sb.append("(Ref ");
+ sb.append(variable.get_name());
+ sb.append(") ");
+
+ return sb.toString();
+ }
+}
diff --git a/src/core/src/tonkadur/fate/v1/lang/RefType.java b/src/core/src/tonkadur/fate/v1/lang/RefType.java
new file mode 100644
index 0000000..4d0429e
--- /dev/null
+++ b/src/core/src/tonkadur/fate/v1/lang/RefType.java
@@ -0,0 +1,91 @@
+package tonkadur.fate.v1.lang;
+
+import tonkadur.parser.Origin;
+
+import tonkadur.fate.v1.lang.meta.DeclaredEntity;
+
+public class RefType extends Type
+{
+ /***************************************************************************/
+ /**** MEMBERS **************************************************************/
+ /***************************************************************************/
+ protected final Type referenced_type;
+
+ /***************************************************************************/
+ /**** PUBLIC ***************************************************************/
+ /***************************************************************************/
+
+ /**** Constructors *********************************************************/
+ public RefType
+ (
+ final Origin origin,
+ final Type referenced_type,
+ final String name
+ )
+ {
+ super(origin, Type.REF, name);
+
+ this.referenced_type = referenced_type;
+ }
+
+ /**** Accessors ************************************************************/
+ public referenced_type get_referenced_type ()
+ {
+ return referenced_type;
+ }
+
+ /**** Compatibility ********************************************************/
+ @Override
+ public boolean can_be_used_as (final Type t)
+ {
+ if (t instanceof RefType)
+ {
+ final RefType dt;
+
+ dt = (RefType) t;
+
+ return referenced_type.can_be_used_as(dt.referenced_type);
+ }
+
+ return false;
+ }
+
+ /*
+ * This is for the very special case where a type is used despite not being
+ * even a sub-type of the expected one. Using this rather expensive function,
+ * the most restrictive shared type will be returned. If no such type exists,
+ * the ANY time is returned.
+ */
+ @Override
+ public DeclaredEntity generate_comparable_to (final DeclaredEntity de)
+ {
+ final Type resulting_referenced_type;
+ final RefType dt;
+
+ if (!(de instanceof RefType))
+ {
+ return Type.ANY;
+ }
+
+ dt = (RefType) de;
+ resulting_referenced_type =
+ (Type) referenced_type.generate_comparable_to(de.referenced_type);
+
+ return new RefType(get_origin(), resulting_referenced_type, name);
+ }
+
+
+ /**** Misc. ****************************************************************/
+ @Override
+ public String toString ()
+ {
+ final StringBuilder sb = new StringBuilder();
+
+ sb.append("(Ref to ");
+ sb.append(resulting_referenced_type.toString())
+ sb.append(")::");
+ sb.append(name);
+
+ return sb.toString();
+ }
+}
diff --git a/src/core/src/tonkadur/fate/v1/lang/Type.java b/src/core/src/tonkadur/fate/v1/lang/Type.java
index d08b699..129f08b 100644
--- a/src/core/src/tonkadur/fate/v1/lang/Type.java
+++ b/src/core/src/tonkadur/fate/v1/lang/Type.java
@@ -26,6 +26,7 @@ public class Type extends DeclaredEntity
public static final Type INT;
public static final Type LIST;
public static final Type SET;
+ public static final Type REF;
public static final Type STRING;
public static final Set<Type> NUMBER_TYPES;
@@ -48,6 +49,7 @@ public class Type extends DeclaredEntity
INT = new Type(base, null, "int");
LIST = new Type(base, null, "list");
SET = new Type(base, null, "set");
+ REF = new Type(base, null, "ref");
STRING = new Type(base, null, "string");
NUMBER_TYPES = new HashSet<Type>();
@@ -60,6 +62,7 @@ public class Type extends DeclaredEntity
SIMPLE_BASE_TYPES.add(INT);
SIMPLE_BASE_TYPES.add(STRING);
SIMPLE_BASE_TYPES.add(BOOLEAN);
+ SIMPLE_BASE_TYPES.add(REF);
}
public static Type value_on_missing ()
diff --git a/src/core/src/tonkadur/fate/v1/parser/FateLexer.g4 b/src/core/src/tonkadur/fate/v1/parser/FateLexer.g4
index 6042ebc..f8fe10f 100644
--- a/src/core/src/tonkadur/fate/v1/parser/FateLexer.g4
+++ b/src/core/src/tonkadur/fate/v1/parser/FateLexer.g4
@@ -24,6 +24,7 @@ DECLARE_ALIAS_TYPE_KW: L_PAREN 'declare_subtype';
DECLARE_DICT_TYPE_KW: L_PAREN 'declare_dict_type';
DECLARE_EVENT_TYPE_KW: L_PAREN 'declare_event_type';
DECLARE_LIST_TYPE_KW: L_PAREN 'declare_list_type';
+DECLARE_REF_TYPE_KW: L_PAREN 'declare_ref_type';
DECLARE_SET_TYPE_KW: L_PAREN 'declare_set_type';
DECLARE_TEXT_EFFECT_KW: L_PAREN 'declare_text_effect';
DECLARE_VARIABLE_KW: L_PAREN 'declare_variable';
@@ -58,6 +59,7 @@ PLAYER_CHOICE_KW: L_PAREN ('choice'|'user_choice'|'player_choice');
PLUS_KW: L_PAREN ('plus'|'+');
POWER_KW: L_PAREN ('power'|'^'|'**');
RANDOM_KW: L_PAREN ('random'|'rand');
+REF_KW: L_PAREN 'ref';
REMOVE_ALL_KW: L_PAREN 'remove_all';
REMOVE_ONE_KW: L_PAREN 'remove_one';
REQUIRE_EXTENSION_KW: L_PAREN 'require_extension';
@@ -68,6 +70,7 @@ SET_FIELDS_KW: L_PAREN 'set_fields';
SET_KW: L_PAREN 'set';
TIMES_KW: L_PAREN ('times'|'*');
TRUE_KW: L_PAREN 'true)';
+VAL_KW: L_PAREN 'val';
VARIABLE_KW: L_PAREN 'variable';
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 12981cb..cc33b07 100644
--- a/src/core/src/tonkadur/fate/v1/parser/FateParser.g4
+++ b/src/core/src/tonkadur/fate/v1/parser/FateParser.g4
@@ -249,6 +249,30 @@ first_level_fate_instr:
WORLD.types().add(new_type);
}
+ | DECLARE_REF_TYPE_KW WS+ parent=type WS+ new_reference_name WS* R_PAREN
+ {
+ final Origin start_origin;
+ final Type new_type;
+
+ start_origin =
+ CONTEXT.get_origin_at
+ (
+ ($DECLARE_LIST_TYPE_KW.getLine()),
+ ($DECLARE_LIST_TYPE_KW.getCharPositionInLine())
+ );
+
+ new_type =
+ new RefType
+ (
+ start_origin,
+ ($parent.result),
+ false,
+ ($new_reference_name.result)
+ );
+
+ WORLD.types().add(new_type);
+ }
+
| DECLARE_DICT_TYPE_KW
WS+
new_reference_name