| summaryrefslogtreecommitdiff |
diff options
| author | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2020-12-28 01:35:33 +0100 |
|---|---|---|
| committer | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2020-12-28 01:35:33 +0100 |
| commit | 22ec7b935d4fbac94ddff580b9649f6748d7444d (patch) | |
| tree | ba963810b13f6d2a8e1ea62237a13517405dbd59 /src | |
| parent | 0269c0a2943e443179ae6261b265aa06998451f7 (diff) | |
First shot at storable procedures.
Diffstat (limited to 'src')
14 files changed, 925 insertions, 0 deletions
diff --git a/src/core/src/tonkadur/fate/v1/error/UnknownSequenceException.java b/src/core/src/tonkadur/fate/v1/error/UnknownSequenceException.java index bb12260..62c6744 100644 --- a/src/core/src/tonkadur/fate/v1/error/UnknownSequenceException.java +++ b/src/core/src/tonkadur/fate/v1/error/UnknownSequenceException.java @@ -1,6 +1,8 @@ package tonkadur.fate.v1.error; +import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.List; import tonkadur.functional.Cons; @@ -12,6 +14,8 @@ import tonkadur.parser.ParsingError; import tonkadur.fate.v1.lang.meta.Computation; +import tonkadur.fate.v1.lang.computation.SequenceReference; + public class UnknownSequenceException extends ParsingError { /***************************************************************************/ @@ -41,6 +45,32 @@ public class UnknownSequenceException extends ParsingError this.all_occurrences = all_occurrences; } + public UnknownSequenceException + ( + final String sequence_name, + final Collection<SequenceReference> all_occurrences + ) + { + super + ( + ErrorLevel.ERROR, + ErrorCategory.UNKNOWN, + all_occurrences.iterator().next().get_origin() + ); + + this.sequence_name = sequence_name; + + this.all_occurrences = new ArrayList<Cons<Origin, List<Computation>>>(); + + for (final SequenceReference occ: all_occurrences) + { + this.all_occurrences.add + ( + new Cons(occ.get_origin(), Collections.singleton(occ)) + ); + } + } + @Override public String toString () { diff --git a/src/core/src/tonkadur/fate/v1/lang/World.java b/src/core/src/tonkadur/fate/v1/lang/World.java index c813312..d07d9b7 100644 --- a/src/core/src/tonkadur/fate/v1/lang/World.java +++ b/src/core/src/tonkadur/fate/v1/lang/World.java @@ -22,9 +22,13 @@ import tonkadur.fate.v1.lang.meta.Computation; import tonkadur.fate.v1.lang.meta.DeclarationCollection; import tonkadur.fate.v1.lang.meta.ExtensionInstruction; import tonkadur.fate.v1.lang.meta.ExtensionComputation; +import tonkadur.fate.v1.lang.meta.RecurrentChecks; import tonkadur.fate.v1.lang.meta.Instruction; import tonkadur.fate.v1.lang.type.Type; +import tonkadur.fate.v1.lang.type.SequenceType; + +import tonkadur.fate.v1.lang.computation.SequenceReference; public class World { @@ -36,6 +40,7 @@ public class World protected final Map<String, List<Cons<Origin, List<Computation>>>> sequence_uses; + protected final Map<String, List<SequenceReference>> sequence_variables; protected final Map<String, ExtensionComputation> extension_value_nodes; protected final Map<String, ExtensionInstruction> extension_instructions; protected final Map<String, ExtensionInstruction> @@ -63,6 +68,8 @@ public class World sequence_uses = new HashMap<String, List<Cons<Origin, List<Computation>>>>(); + sequence_variables = new HashMap<String, List<SequenceReference>>(); + extension_value_nodes = new HashMap<String, ExtensionComputation>(); extension_instructions = new HashMap<String, ExtensionInstruction>(); extension_first_level_instructions = @@ -141,6 +148,22 @@ public class World list_of_uses.add(new Cons(origin, parameters)); } + public void add_sequence_variable (final SequenceReference sr) + { + List<SequenceReference> list_of_variables; + + list_of_variables = sequence_variables.get(sr.get_sequence_name()); + + if (list_of_variables == null) + { + list_of_variables = new ArrayList<SequenceReference>(); + + sequence_variables.put(sr.get_sequence_name(), list_of_variables); + } + + list_of_variables.add(sr); + } + /**** Extension Stuff ****/ public Map<String, ExtensionInstruction> extension_instructions () { @@ -209,6 +232,7 @@ public class World is_sane = true; is_sane = assert_sane_sequence_uses() & is_sane; + is_sane = assert_sane_sequence_variables() & is_sane; return is_sane; } @@ -365,4 +389,74 @@ public class World return is_sane; } + + protected boolean assert_sane_sequence_variables () + throws Throwable + { + Sequence seq; + + boolean is_sane; + + is_sane = true; + + for + ( + final Map.Entry<String, List<SequenceReference>> entry: + sequence_variables.entrySet() + ) + { + seq = sequences().get_or_null(entry.getKey()); + + if (seq == null) + { + final List<SequenceReference> variables; + + variables = entry.getValue(); + + if (variables.isEmpty()) + { + continue; + } + + is_sane = false; + + ErrorManager.handle + ( + new UnknownSequenceException + ( + entry.getKey(), + ((variables.size() == 1) ? null : variables) + ) + ); + } + else + { + final List<Type> signature_types; + + signature_types = new ArrayList<Type>(); + + for (final Variable v: seq.get_signature()) + { + signature_types.add(v.get_type()); + } + + for (final SequenceReference sr: entry.getValue()) + { + ((SequenceType) sr.get_type()).propose_signature + ( + signature_types + ); + + RecurrentChecks.assert_types_matches_signature + ( + sr.get_origin(), + ((SequenceType) sr.get_type()).get_signature(), + signature_types + ); + } + } + } + + return is_sane; + } } diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/SequenceReference.java b/src/core/src/tonkadur/fate/v1/lang/computation/SequenceReference.java new file mode 100644 index 0000000..f7984df --- /dev/null +++ b/src/core/src/tonkadur/fate/v1/lang/computation/SequenceReference.java @@ -0,0 +1,63 @@ +package tonkadur.fate.v1.lang.computation; + +import tonkadur.parser.Origin; + +import tonkadur.fate.v1.lang.type.SequenceType; + +import tonkadur.fate.v1.lang.meta.ComputationVisitor; +import tonkadur.fate.v1.lang.meta.Computation; + +public class SequenceReference extends Computation +{ + /***************************************************************************/ + /**** MEMBERS **************************************************************/ + /***************************************************************************/ + protected final String sequence_name; + + /***************************************************************************/ + /**** PROTECTED ************************************************************/ + /***************************************************************************/ + + /***************************************************************************/ + /**** PUBLIC ***************************************************************/ + /***************************************************************************/ + /**** Constructors *********************************************************/ + public SequenceReference + ( + final Origin origin, + final String sequence_name + ) + { + super(origin, new SequenceType(origin, "(seq " + sequence_name + ")")); + + this.sequence_name = sequence_name; + } + + + /**** Accessors ************************************************************/ + @Override + public void get_visited_by (final ComputationVisitor cv) + throws Throwable + { + cv.visit_sequence_reference(this); + } + + public String get_sequence_name () + { + return sequence_name; + } + + /**** Misc. ****************************************************************/ + @Override + public String toString () + { + final StringBuilder sb = new StringBuilder(); + + sb.append("(SequenceReference "); + sb.append(sequence_name); + + sb.append(")"); + + return sb.toString(); + } +} diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/SequenceVariableCall.java b/src/core/src/tonkadur/fate/v1/lang/instruction/SequenceVariableCall.java new file mode 100644 index 0000000..407f430 --- /dev/null +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/SequenceVariableCall.java @@ -0,0 +1,125 @@ +package tonkadur.fate.v1.lang.instruction; + +import java.util.Collections; +import java.util.List; + +import tonkadur.parser.Origin; +import tonkadur.parser.ParsingError; + +import tonkadur.error.ErrorManager; + +import tonkadur.fate.v1.error.InvalidTypeException; + +import tonkadur.fate.v1.lang.type.SequenceType; +import tonkadur.fate.v1.lang.type.Type; + +import tonkadur.fate.v1.lang.meta.Computation; +import tonkadur.fate.v1.lang.meta.InstructionVisitor; +import tonkadur.fate.v1.lang.meta.Instruction; +import tonkadur.fate.v1.lang.meta.RecurrentChecks; + +public class SequenceVariableCall extends Instruction +{ + /***************************************************************************/ + /**** MEMBERS **************************************************************/ + /***************************************************************************/ + protected final List<Computation> parameters; + protected final Computation sequence; + + /***************************************************************************/ + /**** PROTECTED ************************************************************/ + /***************************************************************************/ + /**** Constructors *********************************************************/ + protected SequenceVariableCall + ( + final Origin origin, + final Computation sequence, + final List<Computation> parameters + ) + { + super(origin); + + this.sequence = sequence; + this.parameters = parameters; + } + + /***************************************************************************/ + /**** PUBLIC ***************************************************************/ + /***************************************************************************/ + /**** Constructors *********************************************************/ + public static SequenceVariableCall build + ( + final Origin origin, + final Computation sequence, + final List<Computation> parameters + ) + throws ParsingError + { + final List<Type> signature; + + ((SequenceType) sequence.get_type()).propose_signature_from_parameters + ( + parameters + ); + + if (!sequence.get_type().get_act_as_type().equals(Type.SEQUENCE)) + { + ErrorManager.handle + ( + new InvalidTypeException + ( + origin, + sequence.get_type(), + Collections.singleton(Type.SEQUENCE) + ) + ); + } + + RecurrentChecks.assert_computations_matches_signature + ( + origin, + parameters, + ((SequenceType) sequence.get_type()).get_signature() + ); + + return new SequenceVariableCall(origin, sequence, parameters); + } + + /**** Accessors ************************************************************/ + @Override + public void get_visited_by (final InstructionVisitor iv) + throws Throwable + { + iv.visit_sequence_variable_call(this); + } + + public Computation get_sequence () + { + return sequence; + } + + public List<Computation> get_parameters () + { + return parameters; + } + + /**** Misc. ****************************************************************/ + @Override + public String toString () + { + final StringBuilder sb = new StringBuilder(); + + sb.append("(SequenceVariableCall "); + sb.append(sequence); + + for (final Computation c: parameters) + { + sb.append(" "); + sb.append(c.toString()); + } + + sb.append(")"); + + return sb.toString(); + } +} diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/SequenceVariableJump.java b/src/core/src/tonkadur/fate/v1/lang/instruction/SequenceVariableJump.java new file mode 100644 index 0000000..52aa947 --- /dev/null +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/SequenceVariableJump.java @@ -0,0 +1,125 @@ +package tonkadur.fate.v1.lang.instruction; + +import java.util.Collections; +import java.util.List; + +import tonkadur.parser.Origin; +import tonkadur.parser.ParsingError; + +import tonkadur.error.ErrorManager; + +import tonkadur.fate.v1.error.InvalidTypeException; + +import tonkadur.fate.v1.lang.type.SequenceType; +import tonkadur.fate.v1.lang.type.Type; + +import tonkadur.fate.v1.lang.meta.Computation; +import tonkadur.fate.v1.lang.meta.InstructionVisitor; +import tonkadur.fate.v1.lang.meta.Instruction; +import tonkadur.fate.v1.lang.meta.RecurrentChecks; + +public class SequenceVariableJump extends Instruction +{ + /***************************************************************************/ + /**** MEMBERS **************************************************************/ + /***************************************************************************/ + protected final List<Computation> parameters; + protected final Computation sequence; + + /***************************************************************************/ + /**** PROTECTED ************************************************************/ + /***************************************************************************/ + /**** Constructors *********************************************************/ + protected SequenceVariableJump + ( + final Origin origin, + final Computation sequence, + final List<Computation> parameters + ) + { + super(origin); + + this.sequence = sequence; + this.parameters = parameters; + } + + /***************************************************************************/ + /**** PUBLIC ***************************************************************/ + /***************************************************************************/ + /**** Constructors *********************************************************/ + public static SequenceVariableJump build + ( + final Origin origin, + final Computation sequence, + final List<Computation> parameters + ) + throws ParsingError + { + final List<Type> signature; + + ((SequenceType) sequence.get_type()).propose_signature_from_parameters + ( + parameters + ); + + if (!sequence.get_type().get_act_as_type().equals(Type.SEQUENCE)) + { + ErrorManager.handle + ( + new InvalidTypeException + ( + origin, + sequence.get_type(), + Collections.singleton(Type.SEQUENCE) + ) + ); + } + + RecurrentChecks.assert_computations_matches_signature + ( + origin, + parameters, + ((SequenceType) sequence.get_type()).get_signature() + ); + + return new SequenceVariableJump(origin, sequence, parameters); + } + + /**** Accessors ************************************************************/ + @Override + public void get_visited_by (final InstructionVisitor iv) + throws Throwable + { + iv.visit_sequence_variable_jump(this); + } + + public Computation get_sequence () + { + return sequence; + } + + public List<Computation> get_parameters () + { + return parameters; + } + + /**** Misc. ****************************************************************/ + @Override + public String toString () + { + final StringBuilder sb = new StringBuilder(); + + sb.append("(SequenceVariableJump "); + sb.append(sequence); + + for (final Computation c: parameters) + { + sb.append(" "); + sb.append(c.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 4631a2f..adb3a05 100644 --- a/src/core/src/tonkadur/fate/v1/lang/meta/ComputationVisitor.java +++ b/src/core/src/tonkadur/fate/v1/lang/meta/ComputationVisitor.java @@ -79,6 +79,9 @@ public interface ComputationVisitor public void visit_operation (final Operation n) throws Throwable; + public void visit_sequence_reference (final SequenceReference n) + throws Throwable; + public void visit_paragraph (final Paragraph 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 a672f3c..406cd7f 100644 --- a/src/core/src/tonkadur/fate/v1/lang/meta/InstructionVisitor.java +++ b/src/core/src/tonkadur/fate/v1/lang/meta/InstructionVisitor.java @@ -140,6 +140,12 @@ public interface InstructionVisitor public void visit_sequence_jump (final SequenceJump n) throws Throwable; + public void visit_sequence_variable_call (final SequenceVariableCall n) + throws Throwable; + + public void visit_sequence_variable_jump (final SequenceVariableJump n) + throws Throwable; + public void visit_local_variable (final LocalVariable n) throws Throwable; diff --git a/src/core/src/tonkadur/fate/v1/lang/type/SequenceType.java b/src/core/src/tonkadur/fate/v1/lang/type/SequenceType.java new file mode 100644 index 0000000..c6e7ef3 --- /dev/null +++ b/src/core/src/tonkadur/fate/v1/lang/type/SequenceType.java @@ -0,0 +1,193 @@ +package tonkadur.fate.v1.lang.type; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +import tonkadur.parser.Origin; + +import tonkadur.fate.v1.lang.meta.DeclaredEntity; +import tonkadur.fate.v1.lang.meta.Computation; + +public class SequenceType extends Type +{ + /***************************************************************************/ + /**** MEMBERS **************************************************************/ + /***************************************************************************/ + protected final List<Type> signature; + protected boolean signature_is_defined; + + /***************************************************************************/ + /**** PUBLIC ***************************************************************/ + /***************************************************************************/ + + /**** Constructors *********************************************************/ + public SequenceType + ( + final Origin origin, + final String name, + final List<Type> signature + ) + { + super(origin, null, name); + + this.signature = signature; + this.signature_is_defined = true; + } + + public SequenceType + ( + final Origin origin, + final String name + ) + { + super(origin, null, name); + + this.signature = new ArrayList<Type>(); + this.signature_is_defined = false; + } + + /**** Accessors ************************************************************/ + public List<Type> get_signature () + { + return signature; + } + + public void propose_signature (final List<Type> signature) + { + if (signature_is_defined) + { + return; + } + + this.signature.addAll(signature); + + signature_is_defined = true; + } + + public void propose_signature_from_parameters + ( + final List<Computation> params + ) + { + if (signature_is_defined) + { + return; + } + + for (final Computation c: params) + { + signature.add(c.get_type()); + } + + signature_is_defined = true; + } + + /**** Compatibility ********************************************************/ + @Override + public boolean can_be_used_as (final Type t) + { + if (t instanceof SequenceType) + { + final Iterator<Type> i0, i1; + final SequenceType lt; + + lt = (SequenceType) t; + + propose_signature(lt.get_signature()); + + if (signature.size() != lt.signature.size()) + { + return false; + } + + i0 = signature.iterator(); + i1 = lt.signature.iterator(); + + while(i0.hasNext()) + { + if (!i0.next().can_be_used_as(i1.next())) + { + return false; + } + } + + return true; + } + + return false; + } + + /* + * This is for the very special case where a type is used despite not being + * even a sub-type of the expected one. Using this rather expensive function, + * the most restrictive shared type will be returned. If no such type exists, + * the ANY time is returned. + */ + @Override + public DeclaredEntity generate_comparable_to (final DeclaredEntity de) + { + final Iterator<Type> i0, i1; + final List<Type> resulting_signature; + final SequenceType lt; + + if (!(de instanceof SequenceType)) + { + return Type.ANY; + } + + lt = (SequenceType) de; + + if (lt.signature.size() != signature.size()) + { + return Type.ANY; + } + + resulting_signature = new ArrayList<Type>(); + + i0 = signature.iterator(); + i1 = lt.signature.iterator(); + + while(i0.hasNext()) + { + resulting_signature.add + ( + (Type) i0.next().generate_comparable_to(i1.next()) + ); + } + + return new SequenceType(get_origin(), name, resulting_signature); + } + + @Override + public Type get_act_as_type () + { + return Type.SEQUENCE; + } + + /**** Misc. ****************************************************************/ + @Override + public Type generate_alias (final Origin origin, final String name) + { + return new SequenceType(origin, name, signature); + } + + @Override + public String toString () + { + final StringBuilder sb = new StringBuilder(); + + sb.append("(Sequence ("); + + for (final Type t: signature) + { + sb.append(t.get_name()); + sb.append(" "); + } + + sb.append("))::"); + sb.append(name); + + return sb.toString(); + } +} 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 ac4bcb3..ce93e9e 100644 --- a/src/core/src/tonkadur/fate/v1/lang/type/Type.java +++ b/src/core/src/tonkadur/fate/v1/lang/type/Type.java @@ -29,6 +29,7 @@ public class Type extends DeclaredEntity public static final Type LIST; public static final Type REF; public static final Type RICH_TEXT; + public static final Type SEQUENCE; public static final Type SET; public static final Type STRING; @@ -57,6 +58,7 @@ public class Type extends DeclaredEntity LIST = new Type(base, null, "list"); REF = new Type(base, null, "ref"); RICH_TEXT = new Type(base, null, "text"); + SEQUENCE = new Type(base, null, "sequence"); SET = new Type(base, null, "set"); STRING = new Type(base, null, "string"); @@ -71,6 +73,7 @@ public class Type extends DeclaredEntity ALL_TYPES.add(LIST); ALL_TYPES.add(REF); ALL_TYPES.add(RICH_TEXT); + ALL_TYPES.add(SEQUENCE); ALL_TYPES.add(SET); ALL_TYPES.add(STRING); @@ -83,6 +86,7 @@ public class Type extends DeclaredEntity COMPARABLE_TYPES.add(FLOAT); COMPARABLE_TYPES.add(INT); + COMPARABLE_TYPES.add(SEQUENCE); COMPARABLE_TYPES.add(LAMBDA); COMPARABLE_TYPES.add(STRING); COMPARABLE_TYPES.add(BOOL); diff --git a/src/core/src/tonkadur/fate/v1/parser/FateLexer.g4 b/src/core/src/tonkadur/fate/v1/parser/FateLexer.g4 index b7b64dd..4b6edfc 100644 --- a/src/core/src/tonkadur/fate/v1/parser/FateLexer.g4 +++ b/src/core/src/tonkadur/fate/v1/parser/FateLexer.g4 @@ -154,6 +154,7 @@ SUB_LIST_KW: L_PAREN 'sub'US'list' SEP+; IMP_SUB_LIST_KW: L_PAREN 'sub'US'list!' SEP+; LIST_KW: L_PAREN 'list' SEP+; SIZE_KW: L_PAREN 'size' SEP+; +SEQUENCE_KW: L_PAREN ('seq'|'sequence') SEP+; SWITCH_KW: L_PAREN 'switch' SEP+; TIMES_KW: L_PAREN ('times'|'*') SEP+; 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 16a9472..8465af6 100644 --- a/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 +++ b/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 @@ -1801,6 +1801,86 @@ returns [Instruction result] $result = new SequenceJump(origin, sequence_name, params); } + | VISIT_KW value WS+ value_list WS* R_PAREN + { + final Origin origin; + + origin = + CONTEXT.get_origin_at + ( + ($VISIT_KW.getLine()), + ($VISIT_KW.getCharPositionInLine()) + ); + + $result = + SequenceVariableCall.build + ( + origin, + ($value.result), + ($value_list.result) + ); + } + + | VISIT_KW value WS* R_PAREN + { + final Origin origin; + + origin = + CONTEXT.get_origin_at + ( + ($VISIT_KW.getLine()), + ($VISIT_KW.getCharPositionInLine()) + ); + + $result = + SequenceVariableCall.build + ( + origin, + ($value.result), + new ArrayList<Computation>() + ); + } + + | CONTINUE_AS_KW value WS+ value_list WS* R_PAREN + { + final Origin origin; + + origin = + CONTEXT.get_origin_at + ( + ($CONTINUE_AS_KW.getLine()), + ($CONTINUE_AS_KW.getCharPositionInLine()) + ); + + $result = + SequenceVariableJump.build + ( + origin, + ($value.result), + ($value_list.result) + ); + } + + | CONTINUE_AS_KW value WS* R_PAREN + { + final Origin origin; + + origin = + CONTEXT.get_origin_at + ( + ($CONTINUE_AS_KW.getLine()), + ($CONTINUE_AS_KW.getCharPositionInLine()) + ); + + $result = + SequenceVariableJump.build + ( + origin, + ($value.result), + new ArrayList<Computation>() + ); + } + | ASSERT_KW non_text_value WS+ paragraph WS* R_PAREN { $result = @@ -2798,6 +2878,26 @@ returns [Type result] ($type_list.result) ); } + + | SEQUENCE_KW type_list WS* R_PAREN + { + final Origin start_origin; + + start_origin = + CONTEXT.get_origin_at + ( + ($SEQUENCE_KW.getLine()), + ($SEQUENCE_KW.getCharPositionInLine()) + ); + + $result = + new SequenceType + ( + start_origin, + "auto_generated", + ($type_list.result) + ); + } ; catch [final Throwable e] { @@ -4092,6 +4192,24 @@ returns [Computation result] } } + | SEQUENCE_KW WORD WS* R_PAREN + { + final SequenceReference sr; + final Origin origin; + + origin = + CONTEXT.get_origin_at + ( + ($SEQUENCE_KW.getLine()), + ($SEQUENCE_KW.getCharPositionInLine()) + ); + + sr = new SequenceReference(origin, ($WORD.text)); + $result = sr; + + WORLD.add_sequence_variable(sr); + } + | EVAL_KW value_reference WS* R_PAREN { final Origin 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 2df0868..110c670 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 @@ -3955,4 +3955,18 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor cc.release_registers(init_instructions); } } + + @Override + public void visit_sequence_reference + ( + final tonkadur.fate.v1.lang.computation.SequenceReference n + ) + throws Throwable + { + result_as_computation = + compiler.assembler().get_label_constant + ( + n.get_sequence_name() + ); + } } 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 5986682..dda6d2e 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 @@ -3514,6 +3514,79 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor } @Override + public void visit_sequence_variable_call + ( + final tonkadur.fate.v1.lang.instruction.SequenceVariableCall n + ) + throws Throwable + { + final ComputationCompiler sequence_cc; + final List<ComputationCompiler> parameter_ccs; + final List<Computation> parameters; + + final String return_to_label; + + return_to_label = + compiler.assembler().generate_label("<seq_call#return_to>"); + + sequence_cc = new ComputationCompiler(compiler); + parameter_ccs = new ArrayList<ComputationCompiler>(); + parameters = new ArrayList<Computation>(); + + n.get_sequence().get_visited_by(sequence_cc); + + if (sequence_cc.has_init()) + { + result.add(sequence_cc.get_init()); + } + + for + ( + final tonkadur.fate.v1.lang.meta.Computation param: n.get_parameters() + ) + { + final ComputationCompiler cc; + + cc = new ComputationCompiler(compiler); + + param.get_visited_by(cc); + + if (cc.has_init()) + { + result.add(cc.get_init()); + } + + parameters.add(cc.get_computation()); + parameter_ccs.add(cc); + } + + result.addAll(compiler.registers().store_parameters(parameters)); + + result.add + ( + compiler.assembler().mark_after + ( + compiler.assembler().merge + ( + compiler.registers().get_visit_context_instructions + ( + sequence_cc.get_computation(), + compiler.assembler().get_label_constant(return_to_label) + ) + ), + return_to_label + ) + ); + + sequence_cc.release_registers(result); + + for (final ComputationCompiler cc: parameter_ccs) + { + cc.release_registers(result); + } + } + + @Override public void visit_sequence_jump ( final tonkadur.fate.v1.lang.instruction.SequenceJump n @@ -3574,6 +3647,72 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor } @Override + public void visit_sequence_variable_jump + ( + final tonkadur.fate.v1.lang.instruction.SequenceVariableJump n + ) + throws Throwable + { + final ComputationCompiler sequence_cc; + final List<ComputationCompiler> parameter_ccs; + final List<Computation> parameters; + + sequence_cc = new ComputationCompiler(compiler); + parameter_ccs = new ArrayList<ComputationCompiler>(); + parameters = new ArrayList<Computation>(); + + n.get_sequence().get_visited_by(sequence_cc); + + if (sequence_cc.has_init()) + { + result.add(sequence_cc.get_init()); + } + + for + ( + final tonkadur.fate.v1.lang.meta.Computation param: n.get_parameters() + ) + { + final ComputationCompiler cc; + + cc = new ComputationCompiler(compiler); + + param.get_visited_by(cc); + + if (cc.has_init()) + { + result.add(cc.get_init()); + } + + parameters.add(cc.get_computation()); + parameter_ccs.add(cc); + } + + result.addAll(compiler.registers().store_parameters(parameters)); + + for (final ComputationCompiler cc: parameter_ccs) + { + cc.release_registers(result); + } + + /* Terminate current context */ + result.addAll + ( + compiler.registers().get_finalize_context_instructions() + ); + + result.addAll + ( + compiler.registers().get_jump_to_context_instructions + ( + sequence_cc.get_computation() + ) + ); + + sequence_cc.release_registers(result); + } + + @Override public void visit_set_value ( final tonkadur.fate.v1.lang.instruction.SetValue n diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/TypeCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/TypeCompiler.java index f820d7b..af4f703 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/TypeCompiler.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/TypeCompiler.java @@ -68,6 +68,11 @@ public class TypeCompiler return Type.INT; } + if (fate_type instanceof tonkadur.fate.v1.lang.type.SequenceType) + { + return Type.INT; + } + fate_type = fate_type.get_base_type(); if (fate_type.equals(tonkadur.fate.v1.lang.type.Type.BOOL)) @@ -181,6 +186,11 @@ public class TypeCompiler return MapType.MAP_TO_INT; } + if (fate_content_type instanceof tonkadur.fate.v1.lang.type.SequenceType) + { + return MapType.MAP_TO_INT; + } + return new MapType(compile(compiler, fate_content_type)); } } |


