| summaryrefslogtreecommitdiff | 
diff options
Diffstat (limited to 'src')
| -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(); +   } +} | 


