| summaryrefslogtreecommitdiff |
diff options
| -rw-r--r-- | src/core/src/tonkadur/fate/v1/lang/Cast.java | 4 | ||||
| -rw-r--r-- | src/core/src/tonkadur/fate/v1/lang/CollectionType.java | 6 | ||||
| -rw-r--r-- | src/core/src/tonkadur/fate/v1/lang/Operation.java | 2 | ||||
| -rw-r--r-- | src/core/src/tonkadur/fate/v1/lang/Operator.java | 2 | ||||
| -rw-r--r-- | src/core/src/tonkadur/fate/v1/lang/Type.java | 57 | ||||
| -rw-r--r-- | src/core/src/tonkadur/fate/v1/lang/World.java | 1 | ||||
| -rw-r--r-- | src/core/src/tonkadur/fate/v1/parser/FateLexer.g4 | 2 | ||||
| -rw-r--r-- | src/core/src/tonkadur/fate/v1/parser/FateParser.g4 | 88 | ||||
| -rw-r--r-- | src/core/src/tonkadur/functional/Cons.java | 68 |
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(); + } +} |


