summaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
authorNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2021-05-01 23:47:56 +0200
committerNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2021-05-01 23:47:56 +0200
commita7003a8b3e00ff36470f1aeb931919f57cac2039 (patch)
tree6b4795fa3811cc1c83f4a505624ab6ced8e73d01 /src/core
parent034153205de05ef2a4facf7aded9912ce8dfb6b5 (diff)
Updates Blackjack example, adds extra type support.
Diffstat (limited to 'src/core')
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/type/ExtraType.java92
-rw-r--r--src/core/src/tonkadur/fate/v1/parser/FateLexer.g43
-rw-r--r--src/core/src/tonkadur/fate/v1/parser/FateParser.g421
-rw-r--r--src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/TypeCompiler.java11
-rw-r--r--src/core/src/tonkadur/wyrd/v1/lang/World.java13
-rw-r--r--src/core/src/tonkadur/wyrd/v1/lang/type/ExtraType.java23
6 files changed, 162 insertions, 1 deletions
diff --git a/src/core/src/tonkadur/fate/v1/lang/type/ExtraType.java b/src/core/src/tonkadur/fate/v1/lang/type/ExtraType.java
new file mode 100644
index 0000000..8c48380
--- /dev/null
+++ b/src/core/src/tonkadur/fate/v1/lang/type/ExtraType.java
@@ -0,0 +1,92 @@
+package tonkadur.fate.v1.lang.type;
+
+import tonkadur.parser.Origin;
+
+import tonkadur.fate.v1.lang.meta.DeclaredEntity;
+
+public class ExtraType extends Type
+{
+ /***************************************************************************/
+ /**** MEMBERS **************************************************************/
+ /***************************************************************************/
+
+ /***************************************************************************/
+ /**** PUBLIC ***************************************************************/
+ /***************************************************************************/
+
+ /**** Constructors *********************************************************/
+ public ExtraType
+ (
+ final Origin origin,
+ final String name
+ )
+ {
+ super(origin, null, name);
+ }
+
+ public ExtraType
+ (
+ final Origin origin,
+ final ExtraType parent,
+ final String name
+ )
+ {
+ super(origin, parent, name);
+ }
+
+ /**** Accessors ************************************************************/
+
+ /**** Compatibility ********************************************************/
+ @Override
+ public boolean can_be_used_as (final Type t)
+ {
+ if (t instanceof ExtraType)
+ {
+ final ExtraType e;
+
+ e = (ExtraType) t;
+
+ return get_base_type().get_name().equals(e.get_base_type().get_name());
+
+ }
+
+ 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)
+ {
+ return Type.ANY;
+ }
+
+ @Override
+ public Type get_act_as_type ()
+ {
+ return get_base_type();
+ }
+
+ /**** Misc. ****************************************************************/
+
+ @Override
+ public Type generate_alias (final Origin origin, final String name)
+ {
+ return new ExtraType(origin, this, name);
+ }
+
+ @Override
+ public String toString ()
+ {
+ final StringBuilder sb = new StringBuilder();
+
+ sb.append("ExtraType::");
+ sb.append(name);
+
+ return sb.toString();
+ }
+}
diff --git a/src/core/src/tonkadur/fate/v1/parser/FateLexer.g4 b/src/core/src/tonkadur/fate/v1/parser/FateLexer.g4
index 7accac5..9c1cdb7 100644
--- a/src/core/src/tonkadur/fate/v1/parser/FateLexer.g4
+++ b/src/core/src/tonkadur/fate/v1/parser/FateLexer.g4
@@ -41,6 +41,7 @@ DECLARE_DICT_TYPE_KW: L_PAREN
('declare'|'define'|'def')US('dict'|('struct''ure'?))(US'type')? SEP+;
DECLARE_EXTRA_INSTRUCTION_KW: L_PAREN ('declare'|'define'|'def')US'extra'US'instruction' SEP+;
DECLARE_EXTRA_COMPUTATION_KW: L_PAREN ('declare'|'define'|'def')US'extra'US'computation' SEP+;
+DECLARE_EXTRA_TYPE_KW: L_PAREN ('declare'|'define'|'def')US'extra'US'type' SEP+;
DECLARE_EVENT_TYPE_KW: L_PAREN ('declare'|'define'|'def')(US'input')?US'event'(US'type')? SEP+;
DECLARE_TEXT_EFFECT_KW: L_PAREN ('declare'|'define'|'def')US'text'US'effect' SEP+;
DECLARE_VARIABLE_KW: L_PAREN 'global' SEP+;
@@ -126,7 +127,7 @@ PUSH_LEFT_KW: L_PAREN 'push'US'left' SEP+;
IMP_PUSH_LEFT_KW: L_PAREN 'push'US'left!' SEP+;
PUSH_RIGHT_KW: L_PAREN 'push'US'right' SEP+;
IMP_PUSH_RIGHT_KW: L_PAREN 'push'US'right!' SEP+;
-PLAYER_CHOICE_KW: L_PAREN ('choice'|'user'US'choice'|'player'US'choice') SEP+;
+PLAYER_CHOICE_KW: L_PAREN ('choice'|'user'US'choice'|'player'US'choice')'!' SEP+;
TEXT_OPTION_KW: L_PAREN ('option'|'user'US'option'|'player'US'option') SEP+;
EVENT_OPTION_KW: L_PAREN ('event'|'user'US'event'|'player'US'event') SEP+;
PLUS_KW: L_PAREN ('plus'|'+') SEP+;
diff --git a/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 b/src/core/src/tonkadur/fate/v1/parser/FateParser.g4
index 43b970c..1596104 100644
--- a/src/core/src/tonkadur/fate/v1/parser/FateParser.g4
+++ b/src/core/src/tonkadur/fate/v1/parser/FateParser.g4
@@ -357,6 +357,27 @@ first_level_fate_instr:
WORLD.types().add(new_type);
}
+ | DECLARE_EXTRA_TYPE_KW new_reference_name WS* R_PAREN
+ {
+ final Origin start_origin;
+
+ start_origin =
+ CONTEXT.get_origin_at
+ (
+ ($DECLARE_EXTRA_TYPE_KW.getLine()),
+ ($DECLARE_EXTRA_TYPE_KW.getCharPositionInLine())
+ );
+
+ WORLD.types().add
+ (
+ new ExtraType
+ (
+ start_origin,
+ ($new_reference_name.result)
+ )
+ );
+ }
+
| DECLARE_EXTRA_INSTRUCTION_KW new_reference_name WS* R_PAREN
{
final Origin start_origin;
diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/TypeCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/TypeCompiler.java
index 572fa19..8dcd70d 100644
--- a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/TypeCompiler.java
+++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/TypeCompiler.java
@@ -73,6 +73,17 @@ public class TypeCompiler
return Type.INT;
}
+ if (fate_type instanceof tonkadur.fate.v1.lang.type.ExtraType)
+ {
+ final ExtraType result;
+
+ result = new ExtraType(fate_type.get_base_type().get_name());
+
+ compiler.world().add_extra_type(result);
+
+ return result;
+ }
+
fate_type = fate_type.get_base_type();
if (fate_type.equals(tonkadur.fate.v1.lang.type.Type.BOOL))
diff --git a/src/core/src/tonkadur/wyrd/v1/lang/World.java b/src/core/src/tonkadur/wyrd/v1/lang/World.java
index cd4bf70..e1316c6 100644
--- a/src/core/src/tonkadur/wyrd/v1/lang/World.java
+++ b/src/core/src/tonkadur/wyrd/v1/lang/World.java
@@ -11,6 +11,7 @@ import java.util.Set;
import tonkadur.wyrd.v1.lang.Register;
import tonkadur.wyrd.v1.lang.type.DictType;
+import tonkadur.wyrd.v1.lang.type.ExtraType;
import tonkadur.wyrd.v1.lang.meta.Instruction;
@@ -24,6 +25,7 @@ public class World
/* This solves the issue of using other yet undefined dict types. */
protected final List<DictType> dict_types_in_order;
+ protected final Set<String> extra_types;
protected final List<Instruction> code;
@@ -35,6 +37,7 @@ public class World
sequence_labels = new HashMap<String, Integer>();
dict_types = new HashMap<String, DictType>();
dict_types_in_order = new ArrayList<DictType>();
+ extra_types = new HashSet<String>();
code = new ArrayList<Instruction>();
}
@@ -59,12 +62,22 @@ public class World
return dict_types_in_order;
}
+ public Set<String> get_extra_types ()
+ {
+ return extra_types;
+ }
+
public void add_dict_type (final DictType dict_type)
{
dict_types.put(dict_type.get_name(), dict_type);
dict_types_in_order.add(dict_type);
}
+ public void add_extra_type (final ExtraType type)
+ {
+ extra_types.add(type.get_name());
+ }
+
public Collection<Register> get_registers ()
{
return registers;
diff --git a/src/core/src/tonkadur/wyrd/v1/lang/type/ExtraType.java b/src/core/src/tonkadur/wyrd/v1/lang/type/ExtraType.java
new file mode 100644
index 0000000..58ce8b3
--- /dev/null
+++ b/src/core/src/tonkadur/wyrd/v1/lang/type/ExtraType.java
@@ -0,0 +1,23 @@
+package tonkadur.wyrd.v1.lang.type;
+
+public class ExtraType extends Type
+{
+ public ExtraType (final String name)
+ {
+ super(name);
+ }
+
+ @Override
+ public String toString ()
+ {
+ final StringBuilder sb;
+
+ sb = new StringBuilder();
+
+ sb.append("(ExtraType ");
+ sb.append(name);
+ sb.append(")");
+
+ return sb.toString();
+ }
+}