| summaryrefslogtreecommitdiff | 
diff options
| author | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2020-07-11 15:37:46 +0200 | 
|---|---|---|
| committer | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2020-07-11 15:37:46 +0200 | 
| commit | e9f9708a43fa6030a943478f203f08fc37aa28ec (patch) | |
| tree | 2136140a155362e33b60cb4bfcfa358a0de5b358 /src | |
| parent | 88657c6dba477efeb42dd1b94d7636f5633b38d4 (diff) | |
...
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/src/tonkadur/fate/v1/lang/RefOperator.java | 44 | ||||
| -rw-r--r-- | src/core/src/tonkadur/fate/v1/lang/RefType.java | 91 | ||||
| -rw-r--r-- | src/core/src/tonkadur/fate/v1/lang/Type.java | 3 | ||||
| -rw-r--r-- | src/core/src/tonkadur/fate/v1/parser/FateLexer.g4 | 3 | ||||
| -rw-r--r-- | src/core/src/tonkadur/fate/v1/parser/FateParser.g4 | 24 | 
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 | 


