| summaryrefslogtreecommitdiff | 
diff options
Diffstat (limited to 'src')
13 files changed, 979 insertions, 31 deletions
| diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/Access.java b/src/core/src/tonkadur/fate/v1/lang/computation/Access.java new file mode 100644 index 0000000..7aae4ca --- /dev/null +++ b/src/core/src/tonkadur/fate/v1/lang/computation/Access.java @@ -0,0 +1,142 @@ +package tonkadur.fate.v1.lang.computation; + +import java.util.Collections; +import java.util.List; + +import tonkadur.parser.Origin; + +import tonkadur.error.ErrorManager; + +import tonkadur.fate.v1.error.InvalidTypeException; +import tonkadur.fate.v1.error.UnknownDictionaryFieldException; + +import tonkadur.fate.v1.lang.meta.ComputationVisitor; +import tonkadur.fate.v1.lang.meta.Computation; +import tonkadur.fate.v1.lang.meta.Reference; + +import tonkadur.fate.v1.lang.type.CollectionType; +import tonkadur.fate.v1.lang.type.Type; + +public class Access extends Reference +{ +   /***************************************************************************/ +   /**** MEMBERS **************************************************************/ +   /***************************************************************************/ +   protected final Reference parent; +   protected final Computation index; + +   /***************************************************************************/ +   /**** PROTECTED ************************************************************/ +   /***************************************************************************/ +   /**** Constructors *********************************************************/ +   protected Access +   ( +      final Origin origin, +      final Reference parent, +      final Type type, +      final Computation index +   ) +   { +      super(origin, type, (parent.get_name() + "." + index.toString())); + +      this.parent = parent; +      this.index = index; +   } + +   /***************************************************************************/ +   /**** PUBLIC ***************************************************************/ +   /***************************************************************************/ +   /**** Constructors *********************************************************/ +   public static Access build +   ( +      final Origin origin, +      Reference parent, +      final Computation index +   ) +   throws +      InvalidTypeException, +      UnknownDictionaryFieldException +   { +      Type current_type; + +      current_type = parent.get_type(); + +      if (current_type.get_base_type().equals(Type.REF)) +      { +         parent = AtReference.build(origin, parent); +         current_type = parent.get_type(); +      } + +      if (!index.get_type().can_be_used_as(Type.INT)) +      { +         ErrorManager.handle +         ( +            new InvalidTypeException +            ( +               index.get_origin(), +               current_type, +               Collections.singleton(Type.INT), +               parent.get_name() +            ) +         ); +      } + +      if (!(current_type instanceof CollectionType)) +      { +         ErrorManager.handle +         ( +            new InvalidTypeException +            ( +               origin, +               current_type, +               Collections.singleton(Type.LIST), +               parent.get_name() +            ) +         ); + +         current_type = Type.ANY; +      } +      else +      { +         current_type = ((CollectionType) current_type).get_content_type(); +      } + +      return new Access(origin, parent, current_type, index); +   } + + +   /**** Accessors ************************************************************/ +   @Override +   public void get_visited_by (final ComputationVisitor cv) +   throws Throwable +   { +      cv.visit_access(this); +   } + +   public Computation get_index () +   { +      return index; +   } + +   public Reference get_parent () +   { +      return parent; +   } + +   /**** Misc. ****************************************************************/ +   @Override +   public String toString () +   { +      final StringBuilder sb = new StringBuilder(); + +      sb.append("(Access ("); +      sb.append(type.get_name()); +      sb.append(") "); +      sb.append(name); +      sb.append("."); +      sb.append(index.toString()); +      sb.append(")"); + +      return sb.toString(); +   } +} diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/IndexOfOperator.java b/src/core/src/tonkadur/fate/v1/lang/computation/IndexOfOperator.java new file mode 100644 index 0000000..687be29 --- /dev/null +++ b/src/core/src/tonkadur/fate/v1/lang/computation/IndexOfOperator.java @@ -0,0 +1,169 @@ +package tonkadur.fate.v1.lang.computation; + +import tonkadur.error.ErrorManager; + +import tonkadur.parser.Origin; + +import tonkadur.fate.v1.error.ConflictingTypeException; +import tonkadur.fate.v1.error.IncomparableTypeException; +import tonkadur.fate.v1.error.InvalidTypeException; + +import tonkadur.fate.v1.lang.type.CollectionType; +import tonkadur.fate.v1.lang.type.Type; + +import tonkadur.fate.v1.lang.meta.ComputationVisitor; +import tonkadur.fate.v1.lang.meta.Computation; + +public class IndexOfOperator extends Computation +{ +   /***************************************************************************/ +   /**** MEMBERS **************************************************************/ +   /***************************************************************************/ +   protected final Computation element; +   protected final Computation collection; + +   /***************************************************************************/ +   /**** PROTECTED ************************************************************/ +   /***************************************************************************/ +   /**** Constructors *********************************************************/ +   protected IndexOfOperator +   ( +      final Origin origin, +      final Computation element, +      final Computation collection +   ) +   { +      super(origin, Type.INT); + +      this.collection = collection; +      this.element = element; +   } + +   /***************************************************************************/ +   /**** PUBLIC ***************************************************************/ +   /***************************************************************************/ +   /**** Constructors *********************************************************/ +   public static IndexOfOperator build +   ( +      final Origin origin, +      final Computation element, +      final Computation collection +   ) +   throws +      InvalidTypeException, +      ConflictingTypeException, +      IncomparableTypeException +   { +      final Type hint; +      final Type collection_type; +      final CollectionType collection_true_type; +      final Type collection_element_type; + +      collection_type = collection.get_type(); + +      if +      ( +         !Type.COLLECTION_TYPES.contains(collection_type.get_base_type()) +         || !(collection_type instanceof CollectionType) +      ) +      { +         ErrorManager.handle +         ( +            new InvalidTypeException +            ( +               collection.get_origin(), +               collection.get_type(), +               Type.COLLECTION_TYPES +            ) +         ); +      } + +      collection_true_type = (CollectionType) collection_type; +      collection_element_type = collection_true_type.get_content_type(); + +      if +      ( +         element.get_type().can_be_used_as(collection_element_type) +         || +         (element.get_type().try_merging_with(collection_element_type) != null) +      ) +      { +         return new IndexOfOperator(origin, element, collection); +      } + +      ErrorManager.handle +      ( +         new ConflictingTypeException +         ( +            element.get_origin(), +            element.get_type(), +            collection_element_type +         ) +      ); + +      hint = +         (Type) element.get_type().generate_comparable_to +         ( +            collection_element_type +         ); + +      if (hint.equals(Type.ANY)) +      { +         ErrorManager.handle +         ( +            new IncomparableTypeException +            ( +               element.get_origin(), +               element.get_type(), +               collection_element_type +            ) +         ); +      } + +      return new IndexOfOperator(origin, element, collection); +   } + +   /**** Accessors ************************************************************/ +   @Override +   public void get_visited_by (final ComputationVisitor cv) +   throws Throwable +   { +      cv.visit_index_of_operator(this); +   } + +   public Computation get_collection () +   { +      return collection; +   } + +   public Computation get_element () +   { +      return element; +   } + +   /**** Misc. ****************************************************************/ +   @Override +   public String toString () +   { +      final StringBuilder sb = new StringBuilder(); + +      sb.append(origin.toString()); +      sb.append("(IndexOfOperator"); +      sb.append(System.lineSeparator()); +      sb.append(System.lineSeparator()); + +      sb.append("element:"); +      sb.append(System.lineSeparator()); +      sb.append(element.toString()); +      sb.append(System.lineSeparator()); +      sb.append(System.lineSeparator()); + +      sb.append("collection:"); +      sb.append(System.lineSeparator()); +      sb.append(collection.toString()); + +      sb.append(")"); + +      return sb.toString(); +   } +} diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/New.java b/src/core/src/tonkadur/fate/v1/lang/computation/New.java new file mode 100644 index 0000000..83eef1f --- /dev/null +++ b/src/core/src/tonkadur/fate/v1/lang/computation/New.java @@ -0,0 +1,57 @@ +package tonkadur.fate.v1.lang.computation; + +import tonkadur.parser.Origin; + +import tonkadur.fate.v1.lang.type.RefType; +import tonkadur.fate.v1.lang.type.Type; + +import tonkadur.fate.v1.lang.meta.ComputationVisitor; +import tonkadur.fate.v1.lang.meta.Computation; + +public class New extends Computation +{ +   /***************************************************************************/ +   /**** MEMBERS **************************************************************/ +   /***************************************************************************/ +   protected final Type target_type; + +   /***************************************************************************/ +   /**** PROTECTED ************************************************************/ +   /***************************************************************************/ +   /**** Constructors *********************************************************/ +   public New (final Origin origin, final Type t) +   { +      super(origin, new RefType(origin, t, "auto generated")); +      this.target_type = t; +   } + +   /***************************************************************************/ +   /**** PUBLIC ***************************************************************/ +   /***************************************************************************/ +   /**** Accessors ************************************************************/ +   @Override +   public void get_visited_by (final ComputationVisitor cv) +   throws Throwable +   { +      cv.visit_new(this); +   } + +   public Type get_target_type () +   { +      return target_type; +   } + +   /**** Misc. ****************************************************************/ +   @Override +   public String toString () +   { +      final StringBuilder sb = new StringBuilder(); + +      sb.append(origin.toString()); +      sb.append("(New "); +      sb.append(target_type.get_name()); +      sb.append(") "); + +      return sb.toString(); +   } +} diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/Operator.java b/src/core/src/tonkadur/fate/v1/lang/computation/Operator.java index 2950636..12b3283 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/Operator.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/Operator.java @@ -72,7 +72,7 @@ public class Operator           );        EQUALS = -         new Operator("equals", 2, 0, Type.SIMPLE_BASE_TYPES, Type.BOOLEAN); +         new Operator("equals", 2, 0, Type.ALL_TYPES, Type.BOOLEAN);        LOWER_THAN =           new Operator("<", 2, 2, Type.SIMPLE_BASE_TYPES, Type.BOOLEAN);        LOWER_EQUAL_THAN = diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/SwitchValue.java b/src/core/src/tonkadur/fate/v1/lang/computation/SwitchValue.java new file mode 100644 index 0000000..3f22e51 --- /dev/null +++ b/src/core/src/tonkadur/fate/v1/lang/computation/SwitchValue.java @@ -0,0 +1,225 @@ +package tonkadur.fate.v1.lang.computation; + +import java.util.List; +import java.util.Collections; + +import tonkadur.functional.Cons; + +import tonkadur.error.ErrorManager; + +import tonkadur.parser.Origin; + +import tonkadur.fate.v1.error.ConflictingTypeException; +import tonkadur.fate.v1.error.IncomparableTypeException; +import tonkadur.fate.v1.error.InvalidTypeException; + +import tonkadur.fate.v1.lang.type.Type; + +import tonkadur.fate.v1.lang.meta.ComputationVisitor; +import tonkadur.fate.v1.lang.meta.Computation; + +public class SwitchValue extends Computation +{ +   /***************************************************************************/ +   /**** MEMBERS **************************************************************/ +   /***************************************************************************/ +   protected final Computation target; +   protected final Computation default_value; +   protected final List<Cons<Computation, Computation>> branches; + +   /***************************************************************************/ +   /**** PROTECTED ************************************************************/ +   /***************************************************************************/ +   /**** Constructors *********************************************************/ +   protected SwitchValue +   ( +      final Origin origin, +      final Type return_type, +      final Computation target, +      final List<Cons<Computation, Computation>> branches, +      final Computation default_value +   ) +   { +      super(origin, return_type); + +      this.target = target; +      this.branches = branches; +      this.default_value = default_value; +   } + +   /***************************************************************************/ +   /**** PUBLIC ***************************************************************/ +   /***************************************************************************/ +   /**** Constructors *********************************************************/ +   public static SwitchValue build +   ( +      final Origin origin, +      final Computation target, +      final List<Cons<Computation, Computation>> branches, +      final Computation default_value +   ) +   throws +      InvalidTypeException, +      ConflictingTypeException, +      IncomparableTypeException +   { +      final Type target_type; +      final Type first_type; +      Type candidate_hint, hint; + +      target_type = target.get_type(); +      first_type = branches.get(0).get_cdr().get_type(); +      hint = first_type; + +      for (final Cons<Computation, Computation> entry: branches) +      { +         if (!entry.get_car().get_type().can_be_used_as(target_type)) +         { +            ErrorManager.handle +            ( +               new InvalidTypeException +               ( +                  entry.get_car().get_origin(), +                  entry.get_car().get_type(), +                  Collections.singleton(target_type) +               ) +            ); +         } + +         if (entry.get_cdr().get_type().equals(hint)) +         { +            continue; +         } + +         candidate_hint = entry.get_cdr().get_type().try_merging_with(hint); + +         if (candidate_hint != null) +         { +            hint = candidate_hint; + +            continue; +         } + +         ErrorManager.handle +         ( +            new ConflictingTypeException +            ( +               entry.get_cdr().get_origin(), +               entry.get_cdr().get_type(), +               first_type +            ) +         ); + +         hint = (Type) hint.generate_comparable_to(entry.get_cdr().get_type()); + +         if (hint.equals(Type.ANY)) +         { +            ErrorManager.handle +            ( +               new IncomparableTypeException +               ( +                  entry.get_cdr().get_origin(), +                  entry.get_cdr().get_type(), +                  first_type +               ) +            ); +         } +      } + +      if (default_value.get_type().equals(hint)) +      { +         return new SwitchValue(origin, hint, target, branches, default_value); +      } + +      candidate_hint = default_value.get_type().try_merging_with(hint); + +      if (candidate_hint != null) +      { +         hint = candidate_hint; + +         return new SwitchValue(origin, hint, target, branches, default_value); +      } + +      ErrorManager.handle +      ( +         new ConflictingTypeException +         ( +            default_value.get_origin(), +            default_value.get_type(), +            first_type +         ) +      ); + +      hint = (Type) hint.generate_comparable_to(default_value.get_type()); + +      if (hint.equals(Type.ANY)) +      { +         ErrorManager.handle +         ( +            new IncomparableTypeException +            ( +               default_value.get_origin(), +               default_value.get_type(), +               first_type +            ) +         ); +      } + +      return new SwitchValue(origin, hint, target, branches, default_value); +   } + +   /**** Accessors ************************************************************/ +   @Override +   public void get_visited_by (final ComputationVisitor cv) +   throws Throwable +   { +      cv.visit_switch_value(this); +   } + +   public List<Cons<Computation, Computation>> get_branches () +   { +      return branches; +   } + +   public Computation get_target () +   { +      return target; +   } + +   public Computation get_default () +   { +      return default_value; +   } + +   /**** Misc. ****************************************************************/ +   @Override +   public String toString () +   { +      final StringBuilder sb = new StringBuilder(); + +      sb.append(origin.toString()); +      sb.append("(SwitchValue"); +      sb.append(System.lineSeparator()); + +      for (final Cons<Computation, Computation> entry: branches) +      { +         sb.append(System.lineSeparator()); +         sb.append("On value:"); +         sb.append(System.lineSeparator()); +         sb.append(entry.get_car().toString()); +         sb.append(System.lineSeparator()); +         sb.append("Return:"); +         sb.append(entry.get_cdr().toString()); +         sb.append(System.lineSeparator()); +      } + +      sb.append(System.lineSeparator()); +      sb.append("default:"); +      sb.append(default_value.toString()); +      sb.append(System.lineSeparator()); + +      sb.append(")"); + +      return sb.toString(); +   } +} diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/SwitchInstruction.java b/src/core/src/tonkadur/fate/v1/lang/instruction/SwitchInstruction.java new file mode 100644 index 0000000..b67dc42 --- /dev/null +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/SwitchInstruction.java @@ -0,0 +1,135 @@ +package tonkadur.fate.v1.lang.instruction; + +import java.util.Collections; +import java.util.List; + +import tonkadur.error.ErrorManager; + +import tonkadur.functional.Cons; + +import tonkadur.parser.Origin; + +import tonkadur.fate.v1.error.InvalidTypeException; + +import tonkadur.fate.v1.lang.type.Type; + +import tonkadur.fate.v1.lang.meta.InstructionVisitor; +import tonkadur.fate.v1.lang.meta.Instruction; +import tonkadur.fate.v1.lang.meta.Computation; + +public class SwitchInstruction extends Instruction +{ +   /***************************************************************************/ +   /**** MEMBERS **************************************************************/ +   /***************************************************************************/ +   protected final Computation target; +   protected final List<Cons<Computation, Instruction>> branches; +   protected final Instruction default_instruction; + +   /***************************************************************************/ +   /**** PROTECTED ************************************************************/ +   /***************************************************************************/ +   /**** Constructors *********************************************************/ +   protected SwitchInstruction +   ( +      final Origin origin, +      final Computation target, +      final List<Cons<Computation, Instruction>> branches, +      final Instruction default_instruction +   ) +   { +      super(origin); + +      this.target = target; +      this.branches = branches; +      this.default_instruction = default_instruction; +   } + +   /***************************************************************************/ +   /**** PUBLIC ***************************************************************/ +   /***************************************************************************/ +   /**** Constructors *********************************************************/ +   public static SwitchInstruction build +   ( +      final Origin origin, +      final Computation target, +      final List<Cons<Computation, Instruction>> branches, +      final Instruction default_instruction +   ) +   throws InvalidTypeException +   { +      final Type target_type; + +      target_type = target.get_type(); + +      for (final Cons<Computation, Instruction> branch: branches) +      { +         if (!branch.get_car().get_type().get_base_type().equals(target_type)) +         { +            ErrorManager.handle +            ( +               new InvalidTypeException +               ( +                  branch.get_car().get_origin(), +                  branch.get_car().get_type(), +                  Collections.singleton(target_type) +               ) +            ); +         } +      } + +      return new SwitchInstruction(origin, target, branches, default_instruction); +   } + +   /**** Accessors ************************************************************/ +   @Override +   public void get_visited_by (final InstructionVisitor iv) +   throws Throwable +   { +      iv.visit_switch_instruction(this); +   } + +   public Computation get_target () +   { +      return target; +   } + +   public List<Cons<Computation, Instruction>> get_branches () +   { +      return branches; +   } + +   public Instruction get_default_instruction () +   { +      return default_instruction; +   } + +   /**** Misc. ****************************************************************/ +   @Override +   public String toString () +   { +      final StringBuilder sb = new StringBuilder(); + +      sb.append("(SwitchInstruction"); +      sb.append(System.lineSeparator()); + +      for (final Cons<Computation, Instruction> branch: branches) +      { +         sb.append(System.lineSeparator()); +         sb.append("case:"); +         sb.append(branch.get_car().toString()); + +         sb.append(System.lineSeparator()); +         sb.append("then:"); +         sb.append(branch.get_cdr().toString()); +      } + +      sb.append(System.lineSeparator()); +      sb.append("default:"); +      sb.append(default_instruction.toString()); + +      sb.append(")"); + +      return sb.toString(); +   } +} diff --git a/src/core/src/tonkadur/fate/v1/lang/meta/ComputationVisitor.java b/src/core/src/tonkadur/fate/v1/lang/meta/ComputationVisitor.java index 9223c7b..203289e 100644 --- a/src/core/src/tonkadur/fate/v1/lang/meta/ComputationVisitor.java +++ b/src/core/src/tonkadur/fate/v1/lang/meta/ComputationVisitor.java @@ -7,12 +7,21 @@ public interface ComputationVisitor     public void visit_at_reference (final AtReference n)     throws Throwable; +   public void visit_access (final Access n) +   throws Throwable; + +   public void visit_new (final New n) +   throws Throwable; +     public void visit_cast (final Cast n)     throws Throwable;     public void visit_cond_value (final CondValue n)     throws Throwable; +   public void visit_switch_value (final SwitchValue n) +   throws Throwable; +     public void visit_constant (final Constant n)     throws Throwable; @@ -28,6 +37,9 @@ public interface ComputationVisitor     public void visit_is_member_operator (final IsMemberOperator n)     throws Throwable; +   public void visit_index_of_operator (final IndexOfOperator n) +   throws Throwable; +     public void visit_macro_value_call (final MacroValueCall n)     throws Throwable; diff --git a/src/core/src/tonkadur/fate/v1/lang/meta/InstructionVisitor.java b/src/core/src/tonkadur/fate/v1/lang/meta/InstructionVisitor.java index 5f78fc0..fc542bd 100644 --- a/src/core/src/tonkadur/fate/v1/lang/meta/InstructionVisitor.java +++ b/src/core/src/tonkadur/fate/v1/lang/meta/InstructionVisitor.java @@ -17,6 +17,9 @@ public interface InstructionVisitor     public void visit_cond_instruction (final CondInstruction ci)     throws Throwable; +   public void visit_switch_instruction (final SwitchInstruction ci) +   throws Throwable; +     public void visit_display (final Display n)     throws Throwable; diff --git a/src/core/src/tonkadur/fate/v1/lang/type/Type.java b/src/core/src/tonkadur/fate/v1/lang/type/Type.java index 0cf19b4..aa3e01c 100644 --- a/src/core/src/tonkadur/fate/v1/lang/type/Type.java +++ b/src/core/src/tonkadur/fate/v1/lang/type/Type.java @@ -31,6 +31,7 @@ public class Type extends DeclaredEntity     public static final Type STRING;     public static final Set<Type> NUMBER_TYPES; +   public static final Set<Type> ALL_TYPES;     public static final Set<Type> SIMPLE_BASE_TYPES;     public static final Set<Type> COLLECTION_TYPES; @@ -55,6 +56,19 @@ public class Type extends DeclaredEntity        SET = new Type(base, null, "set");        STRING = new Type(base, null, "string"); +      ALL_TYPES = new HashSet<Type>(); +      ALL_TYPES.add(ANY); +      ALL_TYPES.add(BOOLEAN); +      ALL_TYPES.add(DICT); +      ALL_TYPES.add(FLOAT); +      ALL_TYPES.add(INT); +      ALL_TYPES.add(LIST); +      ALL_TYPES.add(REF); +      ALL_TYPES.add(RICH_TEXT); +      ALL_TYPES.add(SET); +      ALL_TYPES.add(STRING); + +        NUMBER_TYPES = new HashSet<Type>();        NUMBER_TYPES.add(FLOAT);        NUMBER_TYPES.add(INT); diff --git a/src/core/src/tonkadur/fate/v1/parser/FateLexer.g4 b/src/core/src/tonkadur/fate/v1/parser/FateLexer.g4 index 6c12fa4..db257bf 100644 --- a/src/core/src/tonkadur/fate/v1/parser/FateLexer.g4 +++ b/src/core/src/tonkadur/fate/v1/parser/FateLexer.g4 @@ -6,6 +6,7 @@ lexer grammar FateLexer;  }  fragment SEP: [ \t\r\n]+; +fragment US: '_'?;  WS: SEP; @@ -13,6 +14,7 @@ L_PAREN: '(';  R_PAREN: ')'; +ACCESS_KW: L_PAREN 'access' SEP+;  ADD_KW: L_PAREN 'add' SEP+;  AND_KW: L_PAREN ('and'|'/\\') SEP+;  ASSERT_KW: L_PAREN 'assert' SEP+; @@ -21,19 +23,20 @@ CAST_KW: L_PAREN 'cast' SEP+;  CLEAR_KW: L_PAREN 'clear' SEP+;  COND_KW: L_PAREN 'cond' SEP+;  COUNT_KW: L_PAREN 'count' SEP+; -DECLARE_ALIAS_TYPE_KW: L_PAREN ((('declare'|'define'|'def')'_'('sub'('_'?))?'type')|'typedef') SEP+; -DECLARE_DICT_TYPE_KW: L_PAREN ('declare'|'define'|'def')'_dict_type' SEP+; -DECLARE_EVENT_TYPE_KW: L_PAREN ('declare'|'define'|'def')'_event_type' SEP+; -DECLARE_LIST_TYPE_KW: L_PAREN ('declare'|'define'|'def')'_list_type' SEP+; -DECLARE_REF_TYPE_KW: L_PAREN ('declare'|'define'|'def')'_ref_type' SEP+; -DECLARE_SET_TYPE_KW: L_PAREN ('declare'|'define'|'def')'_set_type' SEP+; -DECLARE_TEXT_EFFECT_KW: L_PAREN ('declare'|'define'|'def')'_text_effect' SEP+; -DECLARE_VARIABLE_KW: L_PAREN ('declare'|'define'|'def')'_var'('iable')? SEP+; -DEFINE_MACRO_KW: L_PAREN ('declare'|'define'|'def')'_macro' SEP+; -DEFINE_SEQUENCE_KW: L_PAREN ('declare'|'define'|'def')'_sequence' SEP+; -DELETE_KW: L_PAREN 'delete' SEP+; +DECLARE_ALIAS_TYPE_KW: +   L_PAREN ((('declare'|'define'|'def')US('sub'US)?'type')|'typedef') SEP+; +DECLARE_DICT_TYPE_KW: L_PAREN ('declare'|'define'|'def')US'dict'(US'type')? SEP+; +DECLARE_EVENT_TYPE_KW: L_PAREN ('declare'|'define'|'def')US'event'(US'type')? SEP+; +DECLARE_LIST_TYPE_KW: L_PAREN ('declare'|'define'|'def')US'list'(US'type')? SEP+; +DECLARE_REF_TYPE_KW: L_PAREN ('declare'|'define'|'def')US'ref'(US'type')? SEP+; +DECLARE_SET_TYPE_KW: L_PAREN ('declare'|'define'|'def')US'set'(US'type')? SEP+; +DECLARE_TEXT_EFFECT_KW: L_PAREN ('declare'|'define'|'def')US'text'US'effect' SEP+; +DECLARE_VARIABLE_KW: L_PAREN ('declare'|'define'|'def')US'var'('iable')? SEP+; +DEFINE_MACRO_KW: L_PAREN ('declare'|'define'|'def')US'macro' SEP+; +DEFINE_SEQUENCE_KW: L_PAREN ('declare'|'define'|'def')US'seq'('uence')? SEP+;  DIVIDE_KW: L_PAREN ('divide'|'/'|'div') SEP+; -ENABLE_TEXT_EFFECT_KW: L_PAREN 'text_effect' SEP+; +DO_WHILE_KW: L_PAREN ('do'US'while') SEP+; +ENABLE_TEXT_EFFECT_KW: L_PAREN 'text'US'effect' SEP+;  END_KW: L_PAREN 'end)';  EQUALS_KW: L_PAREN ('equals'|'='|'=='|'eq') SEP+;  EVENT_KW: L_PAREN 'event' SEP+; @@ -41,42 +44,50 @@ EXTENSION_FIRST_LEVEL_KW: L_PAREN '@';  EXTENSION_INSTRUCTION_KW: L_PAREN '#';  EXTENSION_VALUE_KW: L_PAREN '$';  FALSE_KW: L_PAREN 'false)'; -FATE_VERSION_KW: L_PAREN 'fate_version' SEP+; +FATE_VERSION_KW: L_PAREN 'fate'US'version' SEP+;  FIELD_KW: L_PAREN 'field' SEP+; -GREATER_EQUAL_THAN_KW: L_PAREN ('greater_equal_than'|'>='|'ge') SEP+; -GREATER_THAN_KW: L_PAREN ('greater_than'|'>'|'gt') SEP+; -IF_ELSE_KW: L_PAREN ('if_else'|'ifelse') SEP+; +FOR_EACH_KW: L_PAREN ('for'US'each') SEP+; +FOR_KW: L_PAREN 'for' SEP+; +FREE_KW: L_PAREN ('free'|'release'|'destroy') SEP+; +GREATER_EQUAL_THAN_KW: L_PAREN ('greater'US'equal'US'than'|'>='|'ge') SEP+; +GREATER_THAN_KW: L_PAREN ('greater'US'than'|'>'|'gt') SEP+; +IF_ELSE_KW: L_PAREN ('if'US'else') SEP+;  IF_KW: L_PAREN 'if' SEP+;  IMACRO_KW: L_PAREN 'macro' SEP+; -IMPLIES_KW: L_PAREN ('implies'|'=>') SEP+; +IMPLIES_KW: L_PAREN ('implies'|'=>'|'->') SEP+;  INCLUDE_KW: L_PAREN 'include' SEP+; -IS_MEMBER_KW: L_PAREN ('is_member'|'contains') SEP+; -LOWER_EQUAL_THAN_KW: L_PAREN ('lower_equal_than'|'=<'|'<='|'le') SEP+; -LOWER_THAN_KW: L_PAREN ('lower_than'|'<'|'lt') SEP+; +INDEX_OF_KW: L_PAREN ('index'US'of') SEP+; +IS_MEMBER_KW: L_PAREN ('is'US'member'|'contains'|'has') SEP+; +LOWER_EQUAL_THAN_KW: L_PAREN ('lower'US'equal'US'than'|'=<'|'<='|'le') SEP+; +LOWER_THAN_KW: L_PAREN ('lower'US'than'|'<'|'lt') SEP+;  MINUS_KW: L_PAREN ('minus'|'-') SEP+; +MODULO_KW: L_PAREN ('modulo'|'%'|'mod') SEP+;  NEWLINE_KW: L_PAREN 'newline)'; -NEW_KW: L_PAREN 'new' SEP+; +NEW_KW: L_PAREN ('new'|'reserve'|'create') SEP+;  NOT_KW: L_PAREN ('not'|'~'|'!') SEP+; -ONE_IN_KW: L_PAREN 'one_in' SEP+; +ONE_IN_KW: L_PAREN 'one'US'in' SEP+;  OR_KW: L_PAREN ('or'|'\\/') SEP+;  PARAMETER_KW: L_PAREN ('param'|'parameter'|'par') SEP+; -PLAYER_CHOICE_KW: L_PAREN ('choice'|'user_choice'|'player_choice') SEP+; +PLAYER_CHOICE_KW: L_PAREN ('choice'|'user'US'choice'|'player'US'choice') SEP+;  PLUS_KW: L_PAREN ('plus'|'+') SEP+; -POWER_KW: L_PAREN ('power'|'^'|'**') SEP+; -RANDOM_KW: L_PAREN ('random'|'rand') SEP+; +POWER_KW: L_PAREN ('power'|'^'|'**'|'pow') SEP+; +RANDOM_KW: L_PAREN ('random'|'rand'|'rnd') SEP+;  REF_KW: L_PAREN 'ref' SEP+; -REMOVE_ALL_KW: L_PAREN 'remove_all' SEP+; -REMOVE_ONE_KW: L_PAREN 'remove_one' SEP+; -REQUIRE_EXTENSION_KW: L_PAREN 'require_extension' SEP+; +REMOVE_ALL_KW: L_PAREN 'remove'US'all' SEP+; +REMOVE_ONE_KW: L_PAREN 'remove'US'one' SEP+; +REMOVE_AT_KW: L_PAREN ('remove'US'at'|'rm'|'del'|'delete') SEP+; +REQUIRE_EXTENSION_KW: L_PAREN 'require'US'extension' SEP+;  REQUIRE_KW: L_PAREN 'require' SEP+; -SEQUENCE_KW: L_PAREN 'sequence' SEP+; -SET_FIELDS_KW: L_PAREN 'set_fields' SEP+; +SEQUENCE_KW: L_PAREN 'seq'('uence')? SEP+; +SET_FIELDS_KW: L_PAREN 'set'US'fields' SEP+;  SET_KW: L_PAREN 'set' SEP+; +SWITCH_KW: L_PAREN 'switch' SEP+;  TIMES_KW: L_PAREN ('times'|'*') SEP+;  TRUE_KW: L_PAREN 'true)';  VAL_KW: L_PAREN ('val'|'value') SEP+;  VARIABLE_KW: L_PAREN ('variable'|'var') SEP+;  VMACRO_KW: L_PAREN 'vmacro' SEP+; +WHILE_KW: L_PAREN 'while' SEP+;  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 b77ad98..cd8ca3a 100644 --- a/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 +++ b/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 @@ -602,6 +602,23 @@ returns [Instruction result]           );     } +   | REMOVE_AT_KW value WS+ value_reference WS* R_PAREN +   { +      $result = null; +         /* +         RemoveElementAt.build +         ( +            CONTEXT.get_origin_at +            ( +               ($REMOVE_AT_KW.getLine()), +               ($REMOVE_AT_KW.getCharPositionInLine()) +            ), +            ($value.result), +            ($value_reference.result) +         ); +         */ +   } +     | REMOVE_ALL_KW value WS+ value_reference WS* R_PAREN     {        $result = @@ -646,6 +663,12 @@ returns [Instruction result]           );     } +   | FREE_KW value_reference WS* R_PAREN +   { +      /* TODO */ +      $result = null; +   } +     | SET_FIELDS_KW value_reference WS* field_value_list WS* R_PAREN     {        final Origin origin; @@ -685,6 +708,30 @@ returns [Instruction result]        $result = new InstructionList(origin, operations);     } +   | WHILE_KW value WS* general_fate_sequence WS* R_PAREN +   { +      /* TODO */ +      $result = null; +   } + +   | DO_WHILE_KW value WS* general_fate_sequence WS* R_PAREN +   { +      /* TODO */ +      $result = null; +   } + +   | FOR_KW general_fate_instr WS * value WS* general_fate_instr WS* general_fate_sequence WS* R_PAREN +   { +      /* TODO */ +      $result = null; +   } + +   | FOR_EACH_KW value_reference WS+ WORD WS+ general_fate_sequence WS* R_PAREN +   { +      /* TODO */ +      $result = null; +   } +     | EVENT_KW WORD WS+ value_list WS* R_PAREN     {        final Origin origin; @@ -836,6 +883,22 @@ returns [Instruction result]           );     } +   | SWITCH_KW value WS* instr_cond_list WS* general_fate_instr WS *R_PAREN +   { +      $result = +         SwitchInstruction.build +         ( +            CONTEXT.get_origin_at +            ( +               ($SWITCH_KW.getLine()), +               ($SWITCH_KW.getCharPositionInLine()) +            ), +            ($value.result), +            ($instr_cond_list.result), +            ($general_fate_instr.result) +         ); +   } +     | PLAYER_CHOICE_KW player_choice_list WS* R_PAREN     {        $result = @@ -1621,6 +1684,27 @@ returns [Computation result]:              ($value_reference.result)           );     } + +   | INDEX_OF_KW value WS+ value_reference WS* R_PAREN +   { +      $result = +         IndexOfOperator.build +         ( +            CONTEXT.get_origin_at +            ( +               ($INDEX_OF_KW.getLine()), +               ($INDEX_OF_KW.getCharPositionInLine()) +            ), +            ($value.result), +            ($value_reference.result) +         ); +   } + +   | NEW_KW WORD WS* R_PAREN +   { +      /* TODO */ +      $result = null; +   }  ;  catch [final Throwable e]  { @@ -1666,6 +1750,21 @@ returns [Computation result]:           );     } +   | MODULO_KW value_list WS* R_PAREN +   { +      $result = +         Operation.build +         ( +            CONTEXT.get_origin_at +            ( +               ($MODULO_KW.getLine()), +               ($MODULO_KW.getCharPositionInLine()) +            ), +            Operator.MODULO, +            ($value_list.result) +         ); +   } +     | TIMES_KW value_list WS* R_PAREN     {        $result = @@ -1902,6 +2001,22 @@ returns [Computation result]           );     } +   | SWITCH_KW target=value WS* value_cond_list WS* default_val=value WS* R_PAREN +   { +      $result = +         SwitchValue.build +         ( +            CONTEXT.get_origin_at +            ( +               ($SWITCH_KW.getLine()), +               ($SWITCH_KW.getCharPositionInLine()) +            ), +            ($target.result), +            ($value_cond_list.result), +            ($default_val.result) +         ); +   } +     | boolean_expression     {        $result = ($boolean_expression.result); @@ -2060,6 +2175,21 @@ returns [Reference result]           );     } +   | ACCESS_KW value_reference value R_PAREN +   { +      $result = +         Access.build +         ( +            CONTEXT.get_origin_at +            ( +               ($ACCESS_KW.getLine()), +               ($ACCESS_KW.getCharPositionInLine()) +            ), +            ($value_reference.result), +            ($value.result) +         ); +   } +     | VARIABLE_KW WORD WS* R_PAREN     {        final Origin target_var_origin; diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/ComputationCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/ComputationCompiler.java index 4766e73..dd3e707 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/ComputationCompiler.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/ComputationCompiler.java @@ -960,6 +960,46 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor     }     @Override +   public void visit_index_of_operator +   ( +      final tonkadur.fate.v1.lang.computation.IndexOfOperator n +   ) +   throws Throwable +   { +      /* TODO */ +   } + +   @Override +   public void visit_new +   ( +      final tonkadur.fate.v1.lang.computation.New n +   ) +   throws Throwable +   { +      /* TODO */ +   } + +   @Override +   public void visit_access +   ( +      final tonkadur.fate.v1.lang.computation.Access n +   ) +   throws Throwable +   { +      /* TODO */ +   } + +   @Override +   public void visit_switch_value +   ( +      final tonkadur.fate.v1.lang.computation.SwitchValue n +   ) +   throws Throwable +   { +      /* TODO */ +   } + +   @Override     public void visit_paragraph     (        final tonkadur.fate.v1.lang.computation.Paragraph n diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/InstructionCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/InstructionCompiler.java index d0b3711..5277fd3 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/InstructionCompiler.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/InstructionCompiler.java @@ -333,6 +333,16 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor     }     @Override +   public void visit_switch_instruction +   ( +      final tonkadur.fate.v1.lang.instruction.SwitchInstruction ci +   ) +   throws Throwable +   { +      /* TODO */ +   } + +   @Override     public void visit_cond_instruction     (        final tonkadur.fate.v1.lang.instruction.CondInstruction ci | 


