| summaryrefslogtreecommitdiff | 
diff options
Diffstat (limited to 'src')
17 files changed, 784 insertions, 600 deletions
| diff --git a/src/core/src/tonkadur/fate/v1/lang/World.java b/src/core/src/tonkadur/fate/v1/lang/World.java index 8355a2e..846ead8 100644 --- a/src/core/src/tonkadur/fate/v1/lang/World.java +++ b/src/core/src/tonkadur/fate/v1/lang/World.java @@ -20,8 +20,6 @@ import tonkadur.fate.v1.error.UnknownSequenceException;  import tonkadur.fate.v1.lang.meta.Computation;  import tonkadur.fate.v1.lang.meta.DeclarationCollection; -import tonkadur.fate.v1.lang.meta.ExtraInstruction; -import tonkadur.fate.v1.lang.meta.ExtraComputation;  import tonkadur.fate.v1.lang.meta.RecurrentChecks;  import tonkadur.fate.v1.lang.meta.Instruction; @@ -47,8 +45,6 @@ public class World        sequence_uses;     protected final Map<String, List<SequenceReference>> sequence_variables; -   protected final DeclarationCollection<ExtraInstruction> ei_collection; -   protected final DeclarationCollection<ExtraComputation> ec_collection;     protected final DeclarationCollection<Event> event_collection;     protected final DeclarationCollection<Sequence> sequence_collection;     protected final DeclarationCollection<TextEffect> text_effect_collection; @@ -72,17 +68,6 @@ public class World        sequence_variables = new HashMap<String, List<SequenceReference>>(); -      ei_collection = -         new DeclarationCollection<ExtraInstruction> -         ( -            ExtraInstruction.value_on_missing() -         ); -      ec_collection = -         new DeclarationCollection<ExtraComputation> -         ( -            ExtraComputation.value_on_missing() -         ); -        event_collection =           new DeclarationCollection<Event>(Event.value_on_missing());        sequence_collection = new DeclarationCollection<Sequence>(null); @@ -171,16 +156,6 @@ public class World     }     /**** Collections ****/ -   public DeclarationCollection<ExtraInstruction> extra_instructions () -   { -      return ei_collection; -   } - -   public DeclarationCollection<ExtraComputation> extra_computations () -   { -      return ec_collection; -   } -     public DeclarationCollection<Event> events ()     {        return event_collection; @@ -260,20 +235,6 @@ public class World        }        sb.append(System.lineSeparator()); -      sb.append("Extra Instructions:"); -      sb.append(System.lineSeparator()); -      sb.append(ei_collection.toString()); -      sb.append(System.lineSeparator()); -      sb.append(System.lineSeparator()); - -      sb.append(System.lineSeparator()); -      sb.append("Extra Computations:"); -      sb.append(System.lineSeparator()); -      sb.append(ec_collection.toString()); -      sb.append(System.lineSeparator()); -      sb.append(System.lineSeparator()); - -      sb.append(System.lineSeparator());        sb.append("Events:");        sb.append(System.lineSeparator());        sb.append(event_collection.toString()); diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/ExtraComputationInstance.java b/src/core/src/tonkadur/fate/v1/lang/computation/ExtraComputationInstance.java deleted file mode 100644 index 83960b7..0000000 --- a/src/core/src/tonkadur/fate/v1/lang/computation/ExtraComputationInstance.java +++ /dev/null @@ -1,97 +0,0 @@ -package tonkadur.fate.v1.lang.computation; - -import java.util.List; - -import tonkadur.parser.Context; -import tonkadur.parser.Origin; -import tonkadur.parser.ParsingError; - -import tonkadur.fate.v1.lang.meta.Computation; -import tonkadur.fate.v1.lang.meta.ComputationVisitor; -import tonkadur.fate.v1.lang.meta.ExtraComputation; -import tonkadur.fate.v1.lang.meta.RecurrentChecks; - -public class ExtraComputationInstance extends Computation -{ -   protected final ExtraComputation computation; -   protected final List<Computation> parameters; - -   /***************************************************************************/ -   /**** PROTECTED ************************************************************/ -   /***************************************************************************/ -   /**** Constructors *********************************************************/ -   protected ExtraComputationInstance -   ( -      final Origin origin, -      final ExtraComputation computation, -      final List<Computation> parameters -   ) -   { -      super(origin, computation.get_returned_type()); - -      this.computation = computation; -      this.parameters = parameters; -   } - -   /***************************************************************************/ -   /**** PUBLIC ***************************************************************/ -   /***************************************************************************/ -   /**** Constructors *********************************************************/ -   public static ExtraComputationInstance build -   ( -      final Origin origin, -      final ExtraComputation computation, -      final List<Computation> parameters -   ) -   throws ParsingError -   { -      RecurrentChecks.propagate_expected_types_and_assert_computations_matches_signature -      ( -         origin, -         parameters, -         computation.get_signature() -      ); - -      return new ExtraComputationInstance(origin, computation, parameters); -   } - -   /**** Accessors ************************************************************/ -   public ExtraComputation get_computation_type () -   { -      return computation; -   } - -   public List<Computation> get_parameters () -   { -      return parameters; -   } - -   @Override -   public void get_visited_by (final ComputationVisitor cv) -   throws Throwable -   { -      cv.visit_extra_computation(this); -   } - -   /**** Misc. ****************************************************************/ -   @Override -   public String toString () -   { -      final StringBuilder sb; - -      sb = new StringBuilder(); - -      sb.append("("); -      sb.append(computation.get_name()); - -      for (final Computation p: parameters) -      { -         sb.append(" "); -         sb.append(p.toString()); -      } - -      sb.append(")"); - -      return sb.toString(); -   } -} diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/GenericComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/GenericComputation.java index 4f50166..25e541b 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/GenericComputation.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/GenericComputation.java @@ -86,6 +86,50 @@ public abstract class GenericComputation extends Computation        }     } +   public static void register (final String alias, final Class c) +   { +      try +      { +         final Class previous_entry; + +         previous_entry = REGISTERED.get(alias); + +         if (previous_entry != null) +         { +            ErrorManager.handle +            ( +               new BasicError +               ( +                  ErrorLevel.FATAL, +                  ErrorCategory.PROGRAMMING_ERROR, +                  ( +                     "Unable to add alias for Generic Fate Computation '" +                     + alias +                     + "' from class '" +                     + c.getName() +                     + "': it has already been claimed by class '" +                     + previous_entry.getName() +                     + "'." +                  ) +               ) +            ); +         } + +         REGISTERED.put(alias, c); +      } +      catch (final Throwable t) +      { +         System.err.println +         ( +            "Could not register Generic Fate Computation class '" +            + c.getName() +            + "': " +         ); + +         t.printStackTrace(); +      } +   } +     public static Computation build     (        final Origin origin, diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/ExtraComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/ExtraComputation.java new file mode 100644 index 0000000..578200b --- /dev/null +++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/ExtraComputation.java @@ -0,0 +1,151 @@ +package tonkadur.fate.v1.lang.computation.generic; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import tonkadur.functional.Cons; + +import tonkadur.parser.Context; +import tonkadur.parser.Origin; +import tonkadur.parser.ParsingError; + +import tonkadur.fate.v1.lang.meta.Computation; +import tonkadur.fate.v1.lang.meta.ComputationVisitor; +import tonkadur.fate.v1.lang.meta.RecurrentChecks; + +import tonkadur.fate.v1.lang.computation.GenericComputation; + +import tonkadur.fate.v1.lang.type.Type; + +public class ExtraComputation extends GenericComputation +{ +   protected static final Map<String, Cons<Type, List<Type>>> SIGNATURES; + +   static +   { +      SIGNATURES = new HashMap<String, Cons<Type, List<Type>>>(); +   } + +   public static Collection<String> get_aliases () +   { +      // These are added individually later. +      return new ArrayList<String>(); +   } + +   public static void register +   ( +      final Type return_type, +      final String name, +      final List<Type> signature +   ) +   { +      GenericComputation.register(name, ExtraComputation.class); + +      SIGNATURES.put(name, new Cons(return_type, signature)); +   } + +   /***************************************************************************/ +   /**** MEMBERS **************************************************************/ +   /***************************************************************************/ +   protected final String computation_name; +   protected final List<Computation> parameters; + +   /***************************************************************************/ +   /**** PROTECTED ************************************************************/ +   /***************************************************************************/ +   /**** Constructors *********************************************************/ +   protected ExtraComputation +   ( +      final Origin origin, +      final Type return_type, +      final String computation_name, +      final List<Computation> parameters +   ) +   { +      super(origin, return_type); + +      this.computation_name = computation_name; +      this.parameters = parameters; +   } + +   /***************************************************************************/ +   /**** PUBLIC ***************************************************************/ +   /***************************************************************************/ +   /**** Constructors *********************************************************/ +   public static Computation build +   ( +      final Origin origin, +      final String alias, +      final List<Computation> call_parameters +   ) +   throws Throwable +   { +      final Cons<Type, List<Type>> signature; + +      signature = SIGNATURES.get(alias); + +      if (signature == null) +      { +         System.err.println(origin.toString()); +         System.err.println +         ( +            "[F] Programming error: the Extra Computation'" +            + alias +            + "' was registered without a signature." +         ); +         System.exit(-1); +      } + +      RecurrentChecks.propagate_expected_types_and_assert_computations_matches_signature +      ( +         origin, +         call_parameters, +         signature.get_cdr() +      ); + +      return +         new ExtraComputation +         ( +            origin, +            signature.get_car(), +            alias, +            call_parameters +         ); +   } + +   /**** Accessors ************************************************************/ +   public String get_computation_name () +   { +      return computation_name; +   } + +   public List<Computation> get_parameters () +   { +      return parameters; +   } + +   /**** Misc. ****************************************************************/ +   @Override +   public String toString () +   { +      final StringBuilder sb; + +      sb = new StringBuilder(); + +      sb.append("("); +      sb.append(get_computation_name()); + +      for (final Computation p: parameters) +      { +         sb.append(" "); +         sb.append(p.toString()); +      } + +      sb.append(")"); + +      return sb.toString(); +   } +} diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/ExtraInstructionInstance.java b/src/core/src/tonkadur/fate/v1/lang/instruction/ExtraInstructionInstance.java deleted file mode 100644 index efeafaa..0000000 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/ExtraInstructionInstance.java +++ /dev/null @@ -1,98 +0,0 @@ -package tonkadur.fate.v1.lang.instruction; - -import java.util.List; - -import tonkadur.parser.Context; -import tonkadur.parser.Origin; -import tonkadur.parser.ParsingError; - -import tonkadur.fate.v1.lang.meta.Computation; -import tonkadur.fate.v1.lang.meta.Instruction; -import tonkadur.fate.v1.lang.meta.InstructionVisitor; -import tonkadur.fate.v1.lang.meta.ExtraInstruction; -import tonkadur.fate.v1.lang.meta.RecurrentChecks; - -public class ExtraInstructionInstance extends Instruction -{ -   protected final ExtraInstruction instruction; -   protected final List<Computation> parameters; - -   /***************************************************************************/ -   /**** PROTECTED ************************************************************/ -   /***************************************************************************/ -   /**** Constructors *********************************************************/ -   protected ExtraInstructionInstance -   ( -      final Origin origin, -      final ExtraInstruction instruction, -      final List<Computation> parameters -   ) -   { -      super(origin); - -      this.instruction = instruction; -      this.parameters = parameters; -   } - -   /***************************************************************************/ -   /**** PUBLIC ***************************************************************/ -   /***************************************************************************/ -   /**** Constructors *********************************************************/ -   public static ExtraInstructionInstance build -   ( -      final Origin origin, -      final ExtraInstruction instruction, -      final List<Computation> parameters -   ) -   throws ParsingError -   { -      RecurrentChecks.propagate_expected_types_and_assert_computations_matches_signature -      ( -         origin, -         parameters, -         instruction.get_signature() -      ); - -      return new ExtraInstructionInstance(origin, instruction, parameters); -   } - -   /**** Accessors ************************************************************/ -   @Override -   public void get_visited_by (final InstructionVisitor iv) -   throws Throwable -   { -      iv.visit_extra_instruction(this); -   } - -   public ExtraInstruction get_instruction_type () -   { -      return instruction; -   } - -   public List<Computation> get_parameters () -   { -      return parameters; -   } - -   /**** Misc. ****************************************************************/ -   @Override -   public String toString () -   { -      final StringBuilder sb; - -      sb = new StringBuilder(); - -      sb.append("("); -      sb.append(instruction.get_name()); - -      for (final Computation p: parameters) -      { -         sb.append(" "); -         sb.append(p.toString()); -      } - -      sb.append(")"); - -      return sb.toString(); -   } -} diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/GenericInstruction.java b/src/core/src/tonkadur/fate/v1/lang/instruction/GenericInstruction.java index 8c2b77e..ce75974 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/GenericInstruction.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/GenericInstruction.java @@ -87,6 +87,50 @@ public abstract class GenericInstruction extends Instruction        }     } +   public static void register (final String alias, final Class c) +   { +      try +      { +         final Class previous_entry; + +         previous_entry = REGISTERED.get(alias); + +         if (previous_entry != null) +         { +            ErrorManager.handle +            ( +               new BasicError +               ( +                  ErrorLevel.FATAL, +                  ErrorCategory.PROGRAMMING_ERROR, +                  ( +                     "Unable to add alias for Generic Fate Instruction '" +                     + alias +                     + "' from class '" +                     + c.getName() +                     + "': it has already been claimed by class '" +                     + previous_entry.getName() +                     + "'." +                  ) +               ) +            ); +         } + +         REGISTERED.put(alias, c); +      } +      catch (final Throwable t) +      { +         System.err.println +         ( +            "Could not register Generic Fate Instruction class '" +            + c.getName() +            + "': " +         ); + +         t.printStackTrace(); +      } +   } +     public static Instruction build     (        final Origin origin, diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/ExtraInstruction.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/ExtraInstruction.java new file mode 100644 index 0000000..1ed6f1b --- /dev/null +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/ExtraInstruction.java @@ -0,0 +1,137 @@ +package tonkadur.fate.v1.lang.instruction.generic; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import tonkadur.parser.Context; +import tonkadur.parser.Origin; +import tonkadur.parser.ParsingError; + +import tonkadur.fate.v1.lang.meta.Computation; +import tonkadur.fate.v1.lang.meta.Instruction; +import tonkadur.fate.v1.lang.meta.InstructionVisitor; +import tonkadur.fate.v1.lang.meta.RecurrentChecks; + +import tonkadur.fate.v1.lang.instruction.GenericInstruction; + +import tonkadur.fate.v1.lang.type.Type; + +public class ExtraInstruction extends GenericInstruction +{ +   protected static final Map<String, List<Type>> SIGNATURES; + +   static +   { +      SIGNATURES = new HashMap<String, List<Type>>(); +   } + +   public static Collection<String> get_aliases () +   { +      // These are added individually later. +      return new ArrayList<String>(); +   } + +   public static void register (final String name, final List<Type> signature) +   { +      GenericInstruction.register(name, ExtraInstruction.class); + +      SIGNATURES.put(name, signature); +   } + +   /***************************************************************************/ +   /**** PROTECTED ************************************************************/ +   /***************************************************************************/ +   /**** Constructors *********************************************************/ +   protected ExtraInstruction +   ( +      final Origin origin, +      final String instruction_name, +      final List<Computation> parameters +   ) +   { +      super(origin); + +      this.instruction_name = instruction_name; +      this.parameters = parameters; +   } + +   /***************************************************************************/ +   /**** PUBLIC ***************************************************************/ +   /***************************************************************************/ +   /**** Constructors *********************************************************/ +   public static Instruction build +   ( +      final Origin origin, +      final String alias, +      final List<Computation> call_parameters +   ) +   throws Throwable +   { +      final List<Type> signature; + +      signature = SIGNATURES.get(alias); + +      if (signature == null) +      { +         System.err.println(origin.toString()); +         System.err.println +         ( +            "[F] Programming error: the Extra Instruction '" +            + alias +            + "' was registered without a signature." +         ); +         System.exit(-1); +      } + +      RecurrentChecks.propagate_expected_types_and_assert_computations_matches_signature +      ( +         origin, +         call_parameters, +         signature +      ); + +      return new ExtraInstruction(origin, alias, call_parameters); +   } + +   /***************************************************************************/ +   /**** MEMBERS **************************************************************/ +   /***************************************************************************/ +   protected final String instruction_name; +   protected final List<Computation> parameters; + +   /**** Accessors ************************************************************/ +   public String get_instruction_name () +   { +      return instruction_name; +   } + +   public List<Computation> get_parameters () +   { +      return parameters; +   } + +   /**** Misc. ****************************************************************/ +   @Override +   public String toString () +   { +      final StringBuilder sb; + +      sb = new StringBuilder(); + +      sb.append("("); +      sb.append(get_instruction_name()); + +      for (final Computation p: get_parameters()) +      { +         sb.append(" "); +         sb.append(p.toString()); +      } + +      sb.append(")"); + +      return sb.toString(); +   } +} diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/generic/UserInstruction.java b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/UserInstruction.java new file mode 100644 index 0000000..9c32c20 --- /dev/null +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/generic/UserInstruction.java @@ -0,0 +1,135 @@ +package tonkadur.fate.v1.lang.instruction.generic; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import tonkadur.parser.Origin; + +import tonkadur.fate.v1.lang.Sequence; + +import tonkadur.fate.v1.lang.meta.Instruction; +import tonkadur.fate.v1.lang.meta.Computation; + +import tonkadur.fate.v1.lang.instruction.GenericInstruction; + +public class UserInstruction extends GenericInstruction +{ +   protected static final Map<String, Sequence> DEFINITIONS; + +   static +   { +      DEFINITIONS = new HashMap<String, Sequence>(); +   } + +   public static Collection<String> get_aliases () +   { +      // Will be added individually later. +      return new ArrayList<String>(); +   } + +   public static void register (final Sequence sequence) +   { +      GenericInstruction.register(sequence.get_name(), UserInstruction.class); + +      DEFINITIONS.put(sequence.get_name(), sequence); +   } + +   public static Collection<Sequence> get_all_definitions () +   { +      return DEFINITIONS.values(); +   } + +   public static Instruction build +   ( +      final Origin origin, +      final String alias, +      final List<Computation> call_parameters +   ) +   throws Throwable +   { +      final Sequence definition; + +      definition = DEFINITIONS.get(alias); + +      if (definition == null) +      { +         System.err.println(origin.toString()); +         System.err.println +         ( +            "[F] Programming error: the User Instruction '" +            + alias +            + "' was registered without an associated Sequence." +         ); +         System.exit(-1); +      } + +      definition.propagate_expected_types_and_assert_can_take_parameters +      ( +         origin, +         call_parameters +      ); + +      return new UserInstruction(origin, definition, call_parameters); +   } + +   /***************************************************************************/ +   /**** MEMBERS **************************************************************/ +   /***************************************************************************/ +   protected final Sequence definition; +   protected final List<Computation> parameters; + +   /***************************************************************************/ +   /**** PROTECTED ************************************************************/ +   /***************************************************************************/ +   /**** Constructors *********************************************************/ +   protected UserInstruction +   ( +      final Origin origin, +      final Sequence definition, +      final List<Computation> parameters +   ) +   { +      super(origin); + +      this.definition = definition; +      this.parameters = parameters; +   } + +   /***************************************************************************/ +   /**** PUBLIC ***************************************************************/ +   /***************************************************************************/ + +   /**** Accessors ************************************************************/ +   public Sequence get_definition () +   { +      return definition; +   } + +   public List<Computation> get_parameters () +   { +      return parameters; +   } + +   /**** Misc. ****************************************************************/ +   @Override +   public String toString () +   { +      final StringBuilder sb = new StringBuilder(); + +      sb.append("("); +      sb.append(definition.get_name()); + +      for (final Computation param: parameters) +      { +         sb.append(" "); +         sb.append(param.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 7f93acf..feb63ff 100644 --- a/src/core/src/tonkadur/fate/v1/lang/meta/ComputationVisitor.java +++ b/src/core/src/tonkadur/fate/v1/lang/meta/ComputationVisitor.java @@ -2,6 +2,8 @@ package tonkadur.fate.v1.lang.meta;  import tonkadur.fate.v1.lang.computation.*; +import tonkadur.fate.v1.lang.computation.generic.ExtraComputation; +  public interface ComputationVisitor  {     public void visit_field_access (final FieldAccess n) @@ -46,9 +48,6 @@ public interface ComputationVisitor     public void visit_set_fields (final SetFieldsComputation n)     throws Throwable; -   public void visit_extra_computation (final ExtraComputationInstance n) -   throws Throwable; -     public void visit_generic_computation (final GenericComputation n)     throws Throwable;  } diff --git a/src/core/src/tonkadur/fate/v1/lang/meta/ExtraComputation.java b/src/core/src/tonkadur/fate/v1/lang/meta/ExtraComputation.java deleted file mode 100644 index f3a913e..0000000 --- a/src/core/src/tonkadur/fate/v1/lang/meta/ExtraComputation.java +++ /dev/null @@ -1,134 +0,0 @@ -package tonkadur.fate.v1.lang.meta; - -import java.util.ArrayList; -import java.util.List; - -import tonkadur.parser.Context; -import tonkadur.parser.Origin; -import tonkadur.parser.ParsingError; - -import tonkadur.fate.v1.lang.World; - -import tonkadur.fate.v1.lang.type.Type; - -import tonkadur.fate.v1.lang.computation.ExtraComputationInstance; - - -// This is for computations that are not compiled to Wyrd, but simply declared -// in Fate and implemented by the wyrd interpreter. -// This class should become something like a sub-GenericComputation thing. -// Declaring an ExtraComputation should register an ExtraComputation object as a -// GenericComputation, thus making it seamless from the user's point of view. -public class ExtraComputation extends DeclaredEntity -{ -   protected static final ExtraComputation ANY; - -   static -   { -      ANY = -         new ExtraComputation -         ( -            Origin.BASE_LANGUAGE, -            Type.ANY, -            /* -             * Use of a space necessary to avoid conflicting with a user created -             * type. -             */ -            "undetermined extra_computation", -            new ArrayList<Type>() -         ); -   } - -   public static ExtraComputation value_on_missing () -   { -      return ANY; -   } - -   @Override -   public /* static */ String get_type_name () -   { -      return "ExtraComputation"; -   } - -   /***************************************************************************/ -   /**** MEMBERS **************************************************************/ -   /***************************************************************************/ -   protected final Type returned_type; -   protected final List<Type> signature; - -   /***************************************************************************/ -   /**** PUBLIC ***************************************************************/ -   /***************************************************************************/ -   /**** Constructors *********************************************************/ -   public ExtraComputation -   ( -      final Origin origin, -      final Type returned_type, -      final String name, -      final List<Type> signature -   ) -   { -      super(origin, name); - -      this.returned_type = returned_type; -      this.signature = signature; -   } - -   public ExtraComputation -   ( -      final Type returned_type, -      final String name, -      final List<Type> signature -   ) -   { -      super(Origin.BASE_LANGUAGE, name); - -      this.returned_type = returned_type; -      this.signature = signature; -   } - -   /**** Accessors ************************************************************/ -   public Type get_returned_type () -   { -      return returned_type; -   } - -   public List<Type> get_signature () -   { -      return signature; -   } - -   /**** Instantiating ********************************************************/ -   public ExtraComputationInstance instantiate -   ( -      final World world, -      final Context context, -      final Origin origin, -      final List<Computation> parameters -   ) -   throws ParsingError -   { -      return ExtraComputationInstance.build(origin, this, parameters); -   } - -   /**** Misc. ****************************************************************/ -   @Override -   public String toString () -   { -      final StringBuilder sb; - -      sb = new StringBuilder(); - -      sb.append(returned_type.toString()); -      sb.append(" "); -      sb.append(name); - -      for (final Type t: signature) -      { -         sb.append(" "); -         sb.append(t.toString()); -      } - -      return name; -   } -} diff --git a/src/core/src/tonkadur/fate/v1/lang/meta/ExtraInstruction.java b/src/core/src/tonkadur/fate/v1/lang/meta/ExtraInstruction.java deleted file mode 100644 index cd056dd..0000000 --- a/src/core/src/tonkadur/fate/v1/lang/meta/ExtraInstruction.java +++ /dev/null @@ -1,115 +0,0 @@ -package tonkadur.fate.v1.lang.meta; - -import java.util.ArrayList; -import java.util.List; - -import tonkadur.parser.Context; -import tonkadur.parser.Origin; -import tonkadur.parser.ParsingError; - -import tonkadur.fate.v1.lang.World; - -import tonkadur.fate.v1.lang.type.Type; - -import tonkadur.fate.v1.lang.instruction.ExtraInstructionInstance; - -public class ExtraInstruction extends DeclaredEntity -{ -   protected static final ExtraInstruction ANY; - -   static -   { -      ANY = -         new ExtraInstruction -         ( -            Origin.BASE_LANGUAGE, -            /* -             * Use of a space necessary to avoid conflicting with a user created -             * type. -             */ -            "undetermined extra_instruction", -            new ArrayList<Type>() -         ); -   } - -   public static ExtraInstruction value_on_missing () -   { -      return ANY; -   } - -   @Override -   public /* static */ String get_type_name () -   { -      return "ExtraInstruction"; -   } - -   /***************************************************************************/ -   /**** MEMBERS **************************************************************/ -   /***************************************************************************/ -   protected final List<Type> signature; - -   /***************************************************************************/ -   /**** PUBLIC ***************************************************************/ -   /***************************************************************************/ -   /**** Constructors *********************************************************/ -   public ExtraInstruction -   ( -      final Origin origin, -      final String name, -      final List<Type> signature -   ) -   { -      super(origin, name); - -      this.signature = signature; -   } - -   public ExtraInstruction -   ( -      final String name, -      final List<Type> signature -   ) -   { -      super(Origin.BASE_LANGUAGE, name); - -      this.signature = signature; -   } - -   /**** Accessors ************************************************************/ -   public List<Type> get_signature () -   { -      return signature; -   } - -   /**** Instantiating ********************************************************/ -   public ExtraInstructionInstance instantiate -   ( -      final World world, -      final Context context, -      final Origin origin, -      final List<Computation> parameters -   ) -   throws ParsingError -   { -      return ExtraInstructionInstance.build(origin, this, parameters); -   } - -   /**** Misc. ****************************************************************/ -   @Override -   public String toString () -   { -      final StringBuilder sb; - -      sb = new StringBuilder(); - -      sb.append(name); - -      for (final Type t: signature) -      { -         sb.append(" "); -         sb.append(t.toString()); -      } - -      return name; -   } -} 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 521e850..33fae6b 100644 --- a/src/core/src/tonkadur/fate/v1/lang/meta/InstructionVisitor.java +++ b/src/core/src/tonkadur/fate/v1/lang/meta/InstructionVisitor.java @@ -2,6 +2,8 @@ package tonkadur.fate.v1.lang.meta;  import tonkadur.fate.v1.lang.instruction.*; +import tonkadur.fate.v1.lang.instruction.generic.ExtraInstruction; +  public interface InstructionVisitor  {     /* Instruction Nodes */ @@ -65,9 +67,6 @@ public interface InstructionVisitor     public void visit_set_fields (final SetFields n)     throws Throwable; -   public void visit_extra_instruction (final ExtraInstructionInstance n) -   throws Throwable; -     public void visit_generic_instruction (final GenericInstruction n)     throws Throwable;  } diff --git a/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 b/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 index 62de7e0..a06487b 100644 --- a/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 +++ b/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 @@ -47,7 +47,10 @@ options     import tonkadur.fate.v1.lang.type.*;     import tonkadur.fate.v1.lang.computation.*; +   import tonkadur.fate.v1.lang.computation.generic.ExtraComputation; +     import tonkadur.fate.v1.lang.instruction.generic.SetValue; +   import tonkadur.fate.v1.lang.instruction.generic.ExtraInstruction;  }  @members @@ -185,15 +188,11 @@ first_level_instruction              ($DECLARE_EXTRA_INSTRUCTION_KW.getCharPositionInLine())           ); -      extra_instruction = -         new ExtraInstruction -         ( -            start_origin, -            ($identifier.result), -            ($maybe_type_list.result) -         ); - -      PARSER.get_world().extra_instructions().add(extra_instruction); +      ExtraInstruction.register +      ( +         ($identifier.result), +         ($maybe_type_list.result) +      );        RecurrentChecks.assert_has_user_content_prefix        ( @@ -218,16 +217,12 @@ first_level_instruction              ($DECLARE_EXTRA_COMPUTATION_KW.getCharPositionInLine())           ); -      extra_computation = -         new ExtraComputation -         ( -            start_origin, -            ($type.result), -            ($identifier.result), -            ($maybe_type_list.result) -         ); - -      PARSER.get_world().extra_computations().add(extra_computation); +      ExtraComputation.register +      ( +         ($type.result), +         ($identifier.result), +         ($maybe_type_list.result) +      );        RecurrentChecks.assert_has_user_content_prefix        ( @@ -517,6 +512,114 @@ first_level_instruction        PARSER.restore_local_variables_stack(previous_local_variables_stack);     } +   | DECLARE_INSTRUCTION_KW +         { +            previous_local_variables_stack = PARSER.get_local_variables_stack(); +            PARSER.discard_local_variables_stack(); +            PARSER.increase_local_variables_hierarchy(); +         } +         identifier +         WS* +         ( +            L_PAREN WS* variable_list WS* R_PAREN +            { +               PARSER.add_local_variables(($variable_list.result).as_map()); +               PARSER.increase_local_variables_hierarchy(); +            } +         ) +         pre_sequence_point=WS+ +         maybe_instruction_list +         WS* +      R_PAREN +   { +      final Origin start_origin, sequence_origin; +      final Sequence new_sequence; + +      start_origin = +         PARSER.get_origin_at +         ( +            ($DECLARE_INSTRUCTION_KW.getLine()), +            ($DECLARE_INSTRUCTION_KW.getCharPositionInLine()) +         ); + +      sequence_origin = +         PARSER.get_origin_at +         ( +            ($pre_sequence_point.getLine()), +            ($pre_sequence_point.getCharPositionInLine()) +         ); + +      new_sequence = +         new Sequence +         ( +            start_origin, +            new InstructionList +            ( +               sequence_origin, +               ($maybe_instruction_list.result) +            ), +            ($identifier.result), +            ($variable_list.result).get_entries() +         ); + +      //PARSER.get_world().user_defined_instructions().add(new_sequence); +      PARSER.restore_local_variables_stack(previous_local_variables_stack); + +      RecurrentChecks.assert_has_user_content_prefix +      ( +         start_origin, +         ($identifier.result) +      ); +   } + +   | DECLARE_COMPUTATION_KW +      { +         previous_local_variables_stack = PARSER.get_local_variables_stack(); +         PARSER.discard_local_variables_stack(); +         PARSER.increase_local_variables_hierarchy(); +      } +         identifier WS* +         L_PAREN WS* variable_list WS* R_PAREN +         { +            PARSER.add_local_variables(($variable_list.result).as_map()); +         } +         WS* +         computation +         WS* +      R_PAREN +      { +         final Origin start_origin; +         final LambdaExpression computation; + +         PARSER.restore_local_variables_stack(previous_local_variables_stack); + +         start_origin = +            PARSER.get_origin_at +            ( +               ($DECLARE_COMPUTATION_KW.getLine()), +               ($DECLARE_COMPUTATION_KW.getCharPositionInLine()) +            ); + +         computation = +            LambdaExpression.build +            ( +               start_origin, +               ($variable_list.result).get_entries(), +               ($computation.result) +            ); +         /* +         PARSER.get_world().user_defined_computations().add +         ( +            ($identifier.result), +            new_sequence +         ); +         */ +         RecurrentChecks.assert_has_user_content_prefix +         ( +            start_origin, +            ($identifier.result) +         ); +      }     | IMP_IGNORE_ERROR_KW word WS+ first_level_instruction WS* R_PAREN     { 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 b9f62e9..721f6d8 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 @@ -382,43 +382,6 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor     }     @Override -   public void visit_extra_computation -   ( -      final tonkadur.fate.v1.lang.computation.ExtraComputationInstance n -   ) -   throws Throwable -   { -      final List<Computation> parameters; - -      parameters = new ArrayList<Computation>(); - -      for (final tonkadur.fate.v1.lang.meta.Computation p: n.get_parameters()) -      { -         final ComputationCompiler cc; - -         cc = new ComputationCompiler(compiler); - -         p.get_visited_by(cc); - -         assimilate(cc); - -         parameters.add(cc.get_computation()); -      } - -      result_as_computation = -         new ExtraComputation -         ( -            TypeCompiler.compile -            ( -               compiler, -               n.get_computation_type().get_returned_type() -            ), -            n.get_computation_type().get_name(), -            parameters -         ); -   } - -   @Override     public void visit_default     (        final tonkadur.fate.v1.lang.computation.Default 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 cc30524..22767f0 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 @@ -34,7 +34,6 @@ import tonkadur.wyrd.v1.lang.instruction.AddEventOption;  import tonkadur.wyrd.v1.lang.instruction.Assert;  import tonkadur.wyrd.v1.lang.instruction.Display;  import tonkadur.wyrd.v1.lang.instruction.End; -import tonkadur.wyrd.v1.lang.instruction.ExtraInstruction;  import tonkadur.wyrd.v1.lang.instruction.Initialize;  import tonkadur.wyrd.v1.lang.instruction.PromptInteger;  import tonkadur.wyrd.v1.lang.instruction.PromptString; @@ -786,60 +785,6 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor     }     @Override -   public void visit_extra_instruction -   ( -      final tonkadur.fate.v1.lang.instruction.ExtraInstructionInstance n -   ) -   throws Throwable -   { -      /* -       * Fate: (event_call <string> c0 ... cn) -       * -       * Wyrd (event_call <string> c0 ... cn) -       */ -      final List<ComputationCompiler> cc_list; -      final List<Computation> parameters; - -      cc_list = new ArrayList<ComputationCompiler>(); -      parameters = new ArrayList<Computation>(); - -      for -      ( -         final tonkadur.fate.v1.lang.meta.Computation fate_computation: -            n.get_parameters() -      ) -      { -         final ComputationCompiler cc; - -         cc = new ComputationCompiler(compiler); - -         fate_computation.get_visited_by(cc); - -         if (cc.has_init()) -         { -            result.add(cc.get_init()); -         } - -         cc_list.add(cc); -         parameters.add(cc.get_computation()); -      } - -      result.add -      ( -         new ExtraInstruction -         ( -            n.get_instruction_type().get_name(), -            parameters -         ) -      ); - -      for (final ComputationCompiler cc: cc_list) -      { -         cc.release_registers(result); -      } -   } - -   @Override     public void visit_if_else_instruction     (        final tonkadur.fate.v1.lang.instruction.IfElseInstruction n diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/computation/generic/ExtraComputationCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/computation/generic/ExtraComputationCompiler.java new file mode 100644 index 0000000..660120a --- /dev/null +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/computation/generic/ExtraComputationCompiler.java @@ -0,0 +1,65 @@ +package tonkadur.wyrd.v1.compiler.fate.v1.computation.generic; + +import java.util.ArrayList; +import java.util.List; + +import tonkadur.fate.v1.lang.computation.generic.ExtraComputation; + +import tonkadur.wyrd.v1.lang.meta.Computation; + +import tonkadur.wyrd.v1.compiler.fate.v1.Compiler; +import tonkadur.wyrd.v1.compiler.fate.v1.TypeCompiler; +import tonkadur.wyrd.v1.compiler.fate.v1.ComputationCompiler; + +import tonkadur.wyrd.v1.compiler.fate.v1.computation.GenericComputationCompiler; + +public class ExtraComputationCompiler extends GenericComputationCompiler +{ +   public static Class get_target_class () +   { +      return ExtraComputation.class; +   } + +   public ExtraComputationCompiler (final Compiler compiler) +   { +      super(compiler); +   } + +   public void compile +   ( +      final tonkadur.fate.v1.lang.computation.GenericComputation computation +   ) +   throws Throwable +   { +      final ExtraComputation source; +      final List<Computation> parameters; + +      source = (ExtraComputation) computation; + +      parameters = new ArrayList<Computation>(); + +      for +      ( +         final tonkadur.fate.v1.lang.meta.Computation p: source.get_parameters() +      ) +      { +         final ComputationCompiler cc; + +         cc = new ComputationCompiler(compiler); + +         p.get_visited_by(cc); + +         assimilate(cc); + +         parameters.add(cc.get_computation()); +      } + +      result_as_computation = +         new tonkadur.wyrd.v1.lang.computation.ExtraComputation +         ( +            TypeCompiler.compile(compiler, source.get_type()), +            source.get_computation_name(), +            parameters +         ); +   } +} diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/ExtraInstructionCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/ExtraInstructionCompiler.java new file mode 100644 index 0000000..7d87068 --- /dev/null +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic/ExtraInstructionCompiler.java @@ -0,0 +1,82 @@ +package tonkadur.wyrd.v1.compiler.fate.v1.instruction.generic; + +import java.util.List; +import java.util.ArrayList; + +import tonkadur.fate.v1.lang.instruction.generic.ExtraInstruction; + +import tonkadur.wyrd.v1.lang.meta.Computation; + +import tonkadur.wyrd.v1.compiler.fate.v1.Compiler; +import tonkadur.wyrd.v1.compiler.fate.v1.ComputationCompiler; + +import tonkadur.wyrd.v1.compiler.fate.v1.instruction.GenericInstructionCompiler; + +public class ExtraInstructionCompiler extends GenericInstructionCompiler +{ +   public static Class get_target_class () +   { +      return ExtraInstruction.class; +   } + +   public ExtraInstructionCompiler (final Compiler compiler) +   { +      super(compiler); +   } + +   /* +    * Fate: (event_call <string> c0 ... cn) +    * +    * Wyrd (event_call <string> c0 ... cn) +    */ +   public void compile +   ( +      final tonkadur.fate.v1.lang.instruction.GenericInstruction instruction +   ) +   throws Throwable +   { +      final ExtraInstruction source; +      final List<ComputationCompiler> cc_list; +      final List<Computation> parameters; + +      source = (ExtraInstruction) instruction; + +      cc_list = new ArrayList<ComputationCompiler>(); +      parameters = new ArrayList<Computation>(); + +      for +      ( +         final tonkadur.fate.v1.lang.meta.Computation fate_computation: +            source.get_parameters() +      ) +      { +         final ComputationCompiler cc; + +         cc = new ComputationCompiler(compiler); + +         fate_computation.get_visited_by(cc); + +         if (cc.has_init()) +         { +            result.add(cc.get_init()); +         } + +         cc_list.add(cc); +         parameters.add(cc.get_computation()); +      } + +      result.add +      ( +         new tonkadur.wyrd.v1.lang.instruction.ExtraInstruction +         ( +            source.get_instruction_name(), +            parameters +         ) +      ); + +      for (final ComputationCompiler cc: cc_list) +      { +         cc.release_registers(result); +      } +   } +} | 


