summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2020-07-07 20:18:36 +0200
committerNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2020-07-07 20:18:36 +0200
commit6a30ee067c8ef61193873c2a598e91d524d2e51b (patch)
treea9721db856031662694a01473e4a2b3181bd0bfc
parent55dedea5a27e0eb9719c4ec913d6ced7892b6e19 (diff)
...
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/Cast.java4
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/CollectionType.java6
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/Operation.java2
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/Operator.java2
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/Type.java57
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/World.java1
-rw-r--r--src/core/src/tonkadur/fate/v1/parser/FateLexer.g42
-rw-r--r--src/core/src/tonkadur/fate/v1/parser/FateParser.g488
-rw-r--r--src/core/src/tonkadur/functional/Cons.java68
9 files changed, 197 insertions, 33 deletions
diff --git a/src/core/src/tonkadur/fate/v1/lang/Cast.java b/src/core/src/tonkadur/fate/v1/lang/Cast.java
index 482d203..f8b4a75 100644
--- a/src/core/src/tonkadur/fate/v1/lang/Cast.java
+++ b/src/core/src/tonkadur/fate/v1/lang/Cast.java
@@ -67,7 +67,7 @@ public class Cast extends ValueNode
allowed_type_changes.put
(
Type.STRING,
- Type.COLLECTION_COMPATIBLE_TYPES
+ Type.SIMPLE_BASE_TYPES
);
}
/***************************************************************************/
@@ -116,7 +116,7 @@ public class Cast extends ValueNode
(
allowed_type_changes.get(to).contains
(
- value.get_type().get_true_type()
+ value.get_type().get_base_type()
)
)
)
diff --git a/src/core/src/tonkadur/fate/v1/lang/CollectionType.java b/src/core/src/tonkadur/fate/v1/lang/CollectionType.java
index e581f13..0fc52d0 100644
--- a/src/core/src/tonkadur/fate/v1/lang/CollectionType.java
+++ b/src/core/src/tonkadur/fate/v1/lang/CollectionType.java
@@ -32,9 +32,9 @@ public class CollectionType extends Type
{
if
(
- !Type.COLLECTION_COMPATIBLE_TYPES.contains
+ !Type.SIMPLE_BASE_TYPES.contains
(
- content_type.get_true_type()
+ content_type.get_base_type()
)
)
{
@@ -44,7 +44,7 @@ public class CollectionType extends Type
(
origin,
content_type,
- Type.COLLECTION_COMPATIBLE_TYPES
+ Type.SIMPLE_BASE_TYPES
)
);
}
diff --git a/src/core/src/tonkadur/fate/v1/lang/Operation.java b/src/core/src/tonkadur/fate/v1/lang/Operation.java
index d7efc6c..b3549e6 100644
--- a/src/core/src/tonkadur/fate/v1/lang/Operation.java
+++ b/src/core/src/tonkadur/fate/v1/lang/Operation.java
@@ -88,7 +88,7 @@ public class Operation extends ValueNode
operand_type = operand.get_type();
- if (!allowed_base_types.contains(operand_type.get_true_type()))
+ if (!allowed_base_types.contains(operand_type.get_base_type()))
{
ErrorManager.handle
(
diff --git a/src/core/src/tonkadur/fate/v1/lang/Operator.java b/src/core/src/tonkadur/fate/v1/lang/Operator.java
index 1541fb9..5a8f303 100644
--- a/src/core/src/tonkadur/fate/v1/lang/Operator.java
+++ b/src/core/src/tonkadur/fate/v1/lang/Operator.java
@@ -73,7 +73,7 @@ public class Operator
"equals",
2,
0,
- Type.COLLECTION_COMPATIBLE_TYPES,
+ Type.SIMPLE_BASE_TYPES,
Type.BOOLEAN
);
diff --git a/src/core/src/tonkadur/fate/v1/lang/Type.java b/src/core/src/tonkadur/fate/v1/lang/Type.java
index 6c245e3..d08b699 100644
--- a/src/core/src/tonkadur/fate/v1/lang/Type.java
+++ b/src/core/src/tonkadur/fate/v1/lang/Type.java
@@ -7,10 +7,14 @@ import java.util.Iterator;
import java.util.List;
import java.util.Set;
+import tonkadur.error.ErrorManager;
+
import tonkadur.parser.Context;
import tonkadur.parser.Location;
import tonkadur.parser.Origin;
+import tonkadur.fate.v1.error.InvalidTypeException;
+
import tonkadur.fate.v1.lang.meta.DeclaredEntity;
public class Type extends DeclaredEntity
@@ -25,7 +29,7 @@ public class Type extends DeclaredEntity
public static final Type STRING;
public static final Set<Type> NUMBER_TYPES;
- public static final Set<Type> COLLECTION_COMPATIBLE_TYPES;
+ public static final Set<Type> SIMPLE_BASE_TYPES;
static
{
@@ -50,12 +54,12 @@ public class Type extends DeclaredEntity
NUMBER_TYPES.add(FLOAT);
NUMBER_TYPES.add(INT);
- COLLECTION_COMPATIBLE_TYPES = new HashSet<Type>();
+ SIMPLE_BASE_TYPES = new HashSet<Type>();
- COLLECTION_COMPATIBLE_TYPES.add(FLOAT);
- COLLECTION_COMPATIBLE_TYPES.add(INT);
- COLLECTION_COMPATIBLE_TYPES.add(STRING);
- COLLECTION_COMPATIBLE_TYPES.add(BOOLEAN);
+ SIMPLE_BASE_TYPES.add(FLOAT);
+ SIMPLE_BASE_TYPES.add(INT);
+ SIMPLE_BASE_TYPES.add(STRING);
+ SIMPLE_BASE_TYPES.add(BOOLEAN);
}
public static Type value_on_missing ()
@@ -81,29 +85,27 @@ public class Type extends DeclaredEntity
/***************************************************************************/
/**** Constructors *********************************************************/
- public Type
+ public static Type build
(
final Origin origin,
final Type parent,
final String name
)
+ throws InvalidTypeException
{
- super(origin, name);
-
- if (parent == null)
- {
- true_type = this;
- }
- else
+ if (!SIMPLE_BASE_TYPES.contains(parent.get_base_type()))
{
- true_type = parent.true_type;
+ ErrorManager.handle
+ (
+ new InvalidTypeException(origin, parent, SIMPLE_BASE_TYPES)
+ );
}
- this.parent = parent;
+ return new Type(origin, parent, name);
}
/**** Accessors ************************************************************/
- public Type get_true_type ()
+ public Type get_base_type ()
{
return true_type;
}
@@ -201,6 +203,27 @@ public class Type extends DeclaredEntity
/***************************************************************************/
/**** PROTECTED ************************************************************/
/***************************************************************************/
+ protected Type
+ (
+ final Origin origin,
+ final Type parent,
+ final String name
+ )
+ {
+ super(origin, name);
+
+ if (parent == null)
+ {
+ true_type = this;
+ }
+ else
+ {
+ true_type = parent.true_type;
+ }
+
+ this.parent = parent;
+ }
+
protected boolean this_or_parent_equals (final Type t)
{
if (equals(t))
diff --git a/src/core/src/tonkadur/fate/v1/lang/World.java b/src/core/src/tonkadur/fate/v1/lang/World.java
index d323457..d71dfe8 100644
--- a/src/core/src/tonkadur/fate/v1/lang/World.java
+++ b/src/core/src/tonkadur/fate/v1/lang/World.java
@@ -167,7 +167,6 @@ public class World
/***************************************************************************/
protected void add_base_types ()
{
-
try
{
type_collection.add(Type.BOOLEAN);
diff --git a/src/core/src/tonkadur/fate/v1/parser/FateLexer.g4 b/src/core/src/tonkadur/fate/v1/parser/FateLexer.g4
index 582b30b..4714d8e 100644
--- a/src/core/src/tonkadur/fate/v1/parser/FateLexer.g4
+++ b/src/core/src/tonkadur/fate/v1/parser/FateLexer.g4
@@ -63,7 +63,7 @@ REQUIRE_EXTENSION_KW: L_PAREN 'require_extension';
REQUIRE_KW: L_PAREN 'require';
SEQUENCE_KW: L_PAREN 'sequence';
SET_EXPRESSION_KW: L_PAREN 'set_expression';
-SET_FIELD_KW: L_PAREN 'set_field';
+SET_FIELDS_KW: L_PAREN 'set_fields';
SET_KW: L_PAREN 'set';
TIMES_KW: L_PAREN ('times'|'*');
TRUE_KW: L_PAREN 'true)';
diff --git a/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 b/src/core/src/tonkadur/fate/v1/parser/FateParser.g4
index 67a3c4f..eb065bb 100644
--- a/src/core/src/tonkadur/fate/v1/parser/FateParser.g4
+++ b/src/core/src/tonkadur/fate/v1/parser/FateParser.g4
@@ -15,6 +15,8 @@ options
import tonkadur.error.ErrorManager;
+ import tonkadur.functional.Cons;
+
import tonkadur.parser.Context;
import tonkadur.parser.Origin;
@@ -181,7 +183,7 @@ first_level_fate_instr:
);
new_type =
- new Type
+ Type.build
(
start_origin,
($parent.result),
@@ -343,46 +345,58 @@ catch [final Throwable e]
throw new ParseCancellationException(e);
}
-general_fate_instr:
+general_fate_instr
+returns [InstructionNode result]
+:
L_PAREN WS+ general_fate_sequence WS* R_PAREN
{
+ $result = null;
}
| CLEAR_KW WS+ value_reference WS* R_PAREN
{
+ $result = null;
}
| SET_KW WS+ value WS+ value_reference WS* R_PAREN
{
+ $result = null;
}
- | SET_FIELD_KW WS+ WORD WS+ value WS+ value_reference WS* R_PAREN
+ | SET_FIELDS_KW WS+ field_value_list WS* value_reference WS* R_PAREN
{
+ $result = null;
}
| SET_EXPRESSION_KW WS+ value WS+ value_reference WS* R_PAREN
{
/* that one isn't resolved until the value is referenced */
+ $result = null;
}
| EVENT_KW WS+ WORD WS+ value_list WS* R_PAREN
{
+ $result = null;
}
| MACRO_KW WS+ WORD WS+ value_list WS* R_PAREN
{
+ $result = null;
}
| SEQUENCE_KW WS+ WORD WS* R_PAREN
{
+ $result = null;
}
| ASSERT_KW WS+ value WS* R_PAREN
{
+ $result = null;
}
| IF_KW WS+ value WS* general_fate_instr WS* R_PAREN
{
+ $result = null;
}
| IF_ELSE_KW
@@ -391,29 +405,45 @@ general_fate_instr:
WS+ general_fate_instr
WS* R_PAREN
{
+ $result = null;
}
| COND_KW WS+ instr_cond_list WS* R_PAREN
{
+ $result = null;
}
| PLAYER_CHOICE_KW WS+ player_choice+ WS* R_PAREN
{
+ $result = null;
}
| EXTENSION_INSTRUCTION_KW WORD WS+ general_fate_sequence WS* R_PAREN
{
/* Extension stuff */
System.out.println("Using extension instruction " + ($WORD.text));
+ $result = null;
}
| text+
{
+ $result = null;
}
;
-instr_cond_list:
- (L_PAREN WS* value WS+ general_fate_instr WS* R_PAREN)+
+instr_cond_list
+returns [List<Cons<ValueNode,InstructionNode>> result]
+@init
+{
+ $result = new ArrayList<Cons<ValueNode,InstructionNode>>();
+}
+:
+ (
+ L_PAREN WS* value WS+ general_fate_instr WS* R_PAREN
+ {
+ $result.add(new Cons(($value.result), ($general_fate_instr.result)));
+ }
+ )+
{
}
;
@@ -556,6 +586,39 @@ catch [final Throwable e]
throw new ParseCancellationException(e);
}
+field_value_list
+returns [List<Cons<Origin, Cons<String, ValueNode>>> result]
+@init
+{
+ $result = new ArrayList<Cons<Origin, Cons<String, ValueNode>>>();
+}
+:
+ (
+ WS*
+ L_PAREN WS* WORD WS+ value WS* R_PAREN
+ {
+ $result.add
+ (
+ new Cons
+ (
+ CONTEXT.get_origin_at
+ (
+ ($L_PAREN.getLine()),
+ ($L_PAREN.getCharPositionInLine())
+ ),
+ new Cons
+ (
+ ($WORD.text),
+ ($value.result)
+ )
+ )
+ );
+ }
+ )*
+ {
+ }
+;
+
new_reference_name
returns [String result]
:
@@ -1056,8 +1119,19 @@ catch [final Throwable e]
throw new ParseCancellationException(e);
}
-value_cond_list:
- (L_PAREN WS* value WS+ value WS* R_PAREN)+
+value_cond_list
+returns [List<Cons<ValueNode, ValueNode>> result]
+@init
+{
+ $result = new ArrayList<Cons<ValueNode, ValueNode>>();
+}
+:
+ (
+ L_PAREN WS* c=value WS+ v=value WS* R_PAREN
+ {
+ $result.add(new Cons(($c.result), ($v.result)));
+ }
+ )+
{
}
;
diff --git a/src/core/src/tonkadur/functional/Cons.java b/src/core/src/tonkadur/functional/Cons.java
new file mode 100644
index 0000000..2663145
--- /dev/null
+++ b/src/core/src/tonkadur/functional/Cons.java
@@ -0,0 +1,68 @@
+package tonkadur.functional;
+
+public class Cons <T0, T1>
+{
+ protected T0 car;
+ protected T1 cdr;
+
+ public Cons (final T0 car, final T1 cdr)
+ {
+ this.car = car;
+ this.cdr = cdr;
+ }
+
+ public T0 get_car ()
+ {
+ return car;
+ }
+
+ public T1 get_cdr ()
+ {
+ return cdr;
+ }
+
+ public void set_car (final T0 car)
+ {
+ this.car = car;
+ }
+
+ public void set_cdr (final T1 cdr)
+ {
+ this.cdr = cdr;
+ }
+
+ @Override
+ public boolean equals (final Object o)
+ {
+ if (o instanceof Cons)
+ {
+ final Cons c;
+
+ c = (Cons) o;
+
+ return (c.car.equals(car) && c.cdr.equals(cdr));
+ }
+
+ return false;
+ }
+
+ @Override
+ public int hashCode ()
+ {
+ return toString().hashCode();
+ }
+
+ @Override
+ public String toString ()
+ {
+ final StringBuilder sb = new StringBuilder();
+
+ sb.append("(cons ");
+ sb.append(car.toString());
+ sb.append(" ");
+ sb.append(cdr.toString());
+ sb.append(")");
+
+ return sb.toString();
+ }
+}