From 4b58719598fccac6decb92ba787b40178e2f1f32 Mon Sep 17 00:00:00 2001 From: Nathanael Sensfelder Date: Mon, 3 Aug 2020 14:51:20 +0200 Subject: Some issues with Types are showing up. From the fact that I just added the pointer type to Wyrd, and at no point do I ever look up what type a pointer type points to, I assume some issues persist. --- src/core/src/tonkadur/fate/v1/lang/World.java | 6 +- .../tonkadur/fate/v1/lang/computation/Access.java | 2 +- .../tonkadur/fate/v1/lang/computation/Cast.java | 2 +- .../fate/v1/lang/computation/CountOperator.java | 6 +- .../fate/v1/lang/computation/FieldReference.java | 2 +- .../fate/v1/lang/computation/IndexOfOperator.java | 6 +- .../fate/v1/lang/computation/IsMemberOperator.java | 6 +- .../fate/v1/lang/computation/Operation.java | 2 +- .../fate/v1/lang/instruction/AddElement.java | 6 +- .../tonkadur/fate/v1/lang/instruction/Break.java | 37 ++ .../tonkadur/fate/v1/lang/instruction/Clear.java | 5 +- .../v1/lang/instruction/RemoveAllOfElement.java | 6 +- .../fate/v1/lang/instruction/RemoveElement.java | 6 +- .../fate/v1/lang/instruction/RemoveElementAt.java | 6 +- .../fate/v1/lang/meta/InstructionVisitor.java | 3 + .../tonkadur/fate/v1/lang/type/CollectionType.java | 12 +- .../src/tonkadur/fate/v1/lang/type/DictType.java | 7 +- .../src/tonkadur/fate/v1/lang/type/RefType.java | 7 +- src/core/src/tonkadur/fate/v1/lang/type/Type.java | 9 +- src/core/src/tonkadur/fate/v1/parser/FateLexer.g4 | 2 + src/core/src/tonkadur/fate/v1/parser/FateParser.g4 | 51 +- .../v1/compiler/fate/v1/ComputationCompiler.java | 29 +- .../v1/compiler/fate/v1/InstructionCompiler.java | 574 ++++++++++++++++++--- .../wyrd/v1/compiler/fate/v1/TypeCompiler.java | 47 +- .../v1/compiler/util/AnonymousVariableManager.java | 1 - .../wyrd/v1/compiler/util/InstructionManager.java | 29 ++ .../src/tonkadur/wyrd/v1/lang/computation/New.java | 3 +- .../src/tonkadur/wyrd/v1/lang/computation/Ref.java | 3 +- .../wyrd/v1/lang/instruction/AddChoice.java | 12 +- .../src/tonkadur/wyrd/v1/lang/instruction/End.java | 25 + .../src/tonkadur/wyrd/v1/lang/type/MapType.java | 4 +- .../tonkadur/wyrd/v1/lang/type/PointerType.java | 26 + src/core/src/tonkadur/wyrd/v1/lang/type/Type.java | 2 - 33 files changed, 797 insertions(+), 147 deletions(-) create mode 100644 src/core/src/tonkadur/fate/v1/lang/instruction/Break.java create mode 100644 src/core/src/tonkadur/wyrd/v1/lang/instruction/End.java create mode 100644 src/core/src/tonkadur/wyrd/v1/lang/type/PointerType.java diff --git a/src/core/src/tonkadur/fate/v1/lang/World.java b/src/core/src/tonkadur/fate/v1/lang/World.java index d6c8ac0..7b15f3f 100644 --- a/src/core/src/tonkadur/fate/v1/lang/World.java +++ b/src/core/src/tonkadur/fate/v1/lang/World.java @@ -270,11 +270,11 @@ public class World try { type_collection.add(Type.BOOLEAN); - type_collection.add(Type.DICT); + //type_collection.add(Type.DICT); type_collection.add(Type.FLOAT); type_collection.add(Type.INT); - type_collection.add(Type.LIST); - type_collection.add(Type.SET); + //type_collection.add(Type.LIST); + //type_collection.add(Type.SET); type_collection.add(Type.STRING); } catch (final Throwable t) diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/Access.java b/src/core/src/tonkadur/fate/v1/lang/computation/Access.java index 7aae4ca..f99d04b 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/Access.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/Access.java @@ -61,7 +61,7 @@ public class Access extends Reference current_type = parent.get_type(); - if (current_type.get_base_type().equals(Type.REF)) + if (current_type.get_act_as_type().equals(Type.REF)) { parent = AtReference.build(origin, parent); current_type = parent.get_type(); diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/Cast.java b/src/core/src/tonkadur/fate/v1/lang/computation/Cast.java index 98e9746..10ccd1b 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/Cast.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/Cast.java @@ -130,7 +130,7 @@ public class Cast extends Computation ( allowed_type_changes.get(to).contains ( - value.get_type().get_base_type() + value.get_type().get_act_as_type() ) ) ) diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/CountOperator.java b/src/core/src/tonkadur/fate/v1/lang/computation/CountOperator.java index e53f748..56d4cac 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/CountOperator.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/CountOperator.java @@ -61,11 +61,7 @@ public class CountOperator extends Computation collection_type = collection.get_type(); - if - ( - !Type.COLLECTION_TYPES.contains(collection_type.get_base_type()) - || !(collection_type instanceof CollectionType) - ) + if (!(collection_type instanceof CollectionType)) { ErrorManager.handle ( diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/FieldReference.java b/src/core/src/tonkadur/fate/v1/lang/computation/FieldReference.java index 57d4836..6ca0024 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/FieldReference.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/FieldReference.java @@ -60,7 +60,7 @@ public class FieldReference extends Reference current_type = parent.get_type(); - if (current_type.get_base_type().equals(Type.REF)) + if (current_type.get_act_as_type().equals(Type.REF)) { parent = AtReference.build(origin, parent); current_type = parent.get_type(); diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/IndexOfOperator.java b/src/core/src/tonkadur/fate/v1/lang/computation/IndexOfOperator.java index 687be29..73123f6 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/IndexOfOperator.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/IndexOfOperator.java @@ -61,11 +61,7 @@ public class IndexOfOperator extends Computation collection_type = collection.get_type(); - if - ( - !Type.COLLECTION_TYPES.contains(collection_type.get_base_type()) - || !(collection_type instanceof CollectionType) - ) + if (!(collection_type instanceof CollectionType)) { ErrorManager.handle ( diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/IsMemberOperator.java b/src/core/src/tonkadur/fate/v1/lang/computation/IsMemberOperator.java index b23fcc4..ce110ab 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/IsMemberOperator.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/IsMemberOperator.java @@ -61,11 +61,7 @@ public class IsMemberOperator extends Computation collection_type = collection.get_type(); - if - ( - !Type.COLLECTION_TYPES.contains(collection_type.get_base_type()) - || !(collection_type instanceof CollectionType) - ) + if (!(collection_type instanceof CollectionType)) { ErrorManager.handle ( diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/Operation.java b/src/core/src/tonkadur/fate/v1/lang/computation/Operation.java index d67fa1d..d83fe85 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/Operation.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/Operation.java @@ -91,7 +91,7 @@ public class Operation extends Computation operand_type = operand.get_type(); - if (!allowed_base_types.contains(operand_type.get_base_type())) + if (!allowed_base_types.contains(operand_type.get_act_as_type())) { ErrorManager.handle ( diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/AddElement.java b/src/core/src/tonkadur/fate/v1/lang/instruction/AddElement.java index 792a68f..c60b87d 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/AddElement.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/AddElement.java @@ -62,11 +62,7 @@ public class AddElement extends Instruction collection_type = collection.get_type(); - if - ( - !Type.COLLECTION_TYPES.contains(collection_type.get_base_type()) - || !(collection_type instanceof CollectionType) - ) + if (!(collection_type instanceof CollectionType)) { ErrorManager.handle ( diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/Break.java b/src/core/src/tonkadur/fate/v1/lang/instruction/Break.java new file mode 100644 index 0000000..653061d --- /dev/null +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/Break.java @@ -0,0 +1,37 @@ +package tonkadur.fate.v1.lang.instruction; + +import tonkadur.parser.Origin; + +import tonkadur.fate.v1.lang.meta.InstructionVisitor; +import tonkadur.fate.v1.lang.meta.Instruction; + +public class Break extends Instruction +{ + /***************************************************************************/ + /**** MEMBERS **************************************************************/ + /***************************************************************************/ + + /***************************************************************************/ + /**** PUBLIC ***************************************************************/ + /***************************************************************************/ + /**** Constructors *********************************************************/ + public Break (final Origin origin) + { + super(origin); + } + + /**** Accessors ************************************************************/ + @Override + public void get_visited_by (final InstructionVisitor iv) + throws Throwable + { + iv.visit_break(this); + } + + /**** Misc. ****************************************************************/ + @Override + public String toString () + { + return "(Break)"; + } +} diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/Clear.java b/src/core/src/tonkadur/fate/v1/lang/instruction/Clear.java index 5d036fa..fd8090f 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/Clear.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/Clear.java @@ -48,7 +48,10 @@ public class Clear extends Instruction { if ( - !Type.COLLECTION_TYPES.contains(collection.get_type().get_base_type()) + !Type.COLLECTION_TYPES.contains + ( + collection.get_type().get_act_as_type() + ) ) { ErrorManager.handle diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/RemoveAllOfElement.java b/src/core/src/tonkadur/fate/v1/lang/instruction/RemoveAllOfElement.java index 0aeb614..acce7d0 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/RemoveAllOfElement.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/RemoveAllOfElement.java @@ -63,11 +63,7 @@ public class RemoveAllOfElement extends Instruction collection_type = collection.get_type(); - if - ( - !Type.COLLECTION_TYPES.contains(collection_type.get_base_type()) - || !(collection_type instanceof CollectionType) - ) + if (!(collection_type instanceof CollectionType)) { ErrorManager.handle ( diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/RemoveElement.java b/src/core/src/tonkadur/fate/v1/lang/instruction/RemoveElement.java index b067e9d..d721614 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/RemoveElement.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/RemoveElement.java @@ -62,11 +62,7 @@ public class RemoveElement extends Instruction collection_type = collection.get_type(); - if - ( - !Type.COLLECTION_TYPES.contains(collection_type.get_base_type()) - || !(collection_type instanceof CollectionType) - ) + if (!(collection_type instanceof CollectionType)) { ErrorManager.handle ( diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/RemoveElementAt.java b/src/core/src/tonkadur/fate/v1/lang/instruction/RemoveElementAt.java index 89d0649..3bf0104 100644 --- a/src/core/src/tonkadur/fate/v1/lang/instruction/RemoveElementAt.java +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/RemoveElementAt.java @@ -58,11 +58,7 @@ public class RemoveElementAt extends Instruction collection_type = collection.get_type(); - if - ( - !Type.COLLECTION_TYPES.contains(collection_type.get_base_type()) - || !(collection_type instanceof CollectionType) - ) + if (!(collection_type instanceof CollectionType)) { ErrorManager.handle ( 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 ef3fe3e..7550895 100644 --- a/src/core/src/tonkadur/fate/v1/lang/meta/InstructionVisitor.java +++ b/src/core/src/tonkadur/fate/v1/lang/meta/InstructionVisitor.java @@ -11,6 +11,9 @@ public interface InstructionVisitor public void visit_assert (final Assert a) throws Throwable; + public void visit_break (final Break n) + throws Throwable; + public void visit_free (final Free n) throws Throwable; diff --git a/src/core/src/tonkadur/fate/v1/lang/type/CollectionType.java b/src/core/src/tonkadur/fate/v1/lang/type/CollectionType.java index 830cd03..bf2fc90 100644 --- a/src/core/src/tonkadur/fate/v1/lang/type/CollectionType.java +++ b/src/core/src/tonkadur/fate/v1/lang/type/CollectionType.java @@ -34,7 +34,7 @@ public class CollectionType extends Type ( !Type.SIMPLE_BASE_TYPES.contains ( - content_type.get_base_type() + content_type.get_act_as_type() ) ) { @@ -64,6 +64,12 @@ public class CollectionType extends Type return is_set; } + @Override + public Type get_act_as_type () + { + return is_set? Type.SET : Type.LIST; + } + /**** Compatibility ********************************************************/ @Override public boolean can_be_used_as (final Type t) @@ -106,7 +112,7 @@ public class CollectionType extends Type new CollectionType ( get_origin(), - ((Type) content_type.generate_comparable_to (ct.content_type)), + ((Type) content_type.generate_comparable_to(ct.content_type)), (ct.is_set || is_set), name ); @@ -148,7 +154,7 @@ public class CollectionType extends Type final String name ) { - super(origin, (is_set ? Type.SET : Type.LIST), name); + super(origin, null, name); this.is_set = is_set; this.content_type = content_type; diff --git a/src/core/src/tonkadur/fate/v1/lang/type/DictType.java b/src/core/src/tonkadur/fate/v1/lang/type/DictType.java index 93b9106..ce84863 100644 --- a/src/core/src/tonkadur/fate/v1/lang/type/DictType.java +++ b/src/core/src/tonkadur/fate/v1/lang/type/DictType.java @@ -32,7 +32,7 @@ public class DictType extends Type final String name ) { - super(origin, Type.DICT, name); + super(origin, null, name); this.field_types = field_types; } @@ -151,6 +151,11 @@ public class DictType extends Type return new DictType(get_origin(), result_field_types, name); } + @Override + public Type get_act_as_type () + { + return Type.DICT; + } /**** Misc. ****************************************************************/ @Override diff --git a/src/core/src/tonkadur/fate/v1/lang/type/RefType.java b/src/core/src/tonkadur/fate/v1/lang/type/RefType.java index 277e369..15d9c53 100644 --- a/src/core/src/tonkadur/fate/v1/lang/type/RefType.java +++ b/src/core/src/tonkadur/fate/v1/lang/type/RefType.java @@ -23,7 +23,7 @@ public class RefType extends Type final String name ) { - super(origin, Type.REF, name); + super(origin, null, name); this.referenced_type = referenced_type; } @@ -74,6 +74,11 @@ public class RefType extends Type return new RefType(get_origin(), resulting_referenced_type, name); } + @Override + public Type get_act_as_type () + { + return Type.REF; + } /**** Misc. ****************************************************************/ @Override 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 aa3e01c..71bf900 100644 --- a/src/core/src/tonkadur/fate/v1/lang/type/Type.java +++ b/src/core/src/tonkadur/fate/v1/lang/type/Type.java @@ -118,7 +118,7 @@ public class Type extends DeclaredEntity ) throws InvalidTypeException { - if (!SIMPLE_BASE_TYPES.contains(parent.get_base_type())) + if (!SIMPLE_BASE_TYPES.contains(parent.get_act_as_type())) { ErrorManager.handle ( @@ -135,6 +135,11 @@ public class Type extends DeclaredEntity return true_type; } + public Type get_act_as_type () + { + return true_type; + } + public boolean is_base_type () { return (parent == null); @@ -163,7 +168,7 @@ public class Type extends DeclaredEntity /**** Compatibility ********************************************************/ public boolean can_be_used_as (final Type t) { - if (!true_type.equals(t.true_type)) + if (!get_act_as_type().equals(t.get_act_as_type())) { return false; } diff --git a/src/core/src/tonkadur/fate/v1/parser/FateLexer.g4 b/src/core/src/tonkadur/fate/v1/parser/FateLexer.g4 index db257bf..ca10603 100644 --- a/src/core/src/tonkadur/fate/v1/parser/FateLexer.g4 +++ b/src/core/src/tonkadur/fate/v1/parser/FateLexer.g4 @@ -19,6 +19,7 @@ ADD_KW: L_PAREN 'add' SEP+; AND_KW: L_PAREN ('and'|'/\\') SEP+; ASSERT_KW: L_PAREN 'assert' SEP+; AT_KW: L_PAREN 'at' SEP+; +BREAK_KW: L_PAREN 'break)'; CAST_KW: L_PAREN 'cast' SEP+; CLEAR_KW: L_PAREN 'clear' SEP+; COND_KW: L_PAREN 'cond' SEP+; @@ -44,6 +45,7 @@ EXTENSION_FIRST_LEVEL_KW: L_PAREN '@'; EXTENSION_INSTRUCTION_KW: L_PAREN '#'; EXTENSION_VALUE_KW: L_PAREN '$'; FALSE_KW: L_PAREN 'false)'; +IGNORE_ERROR_KW: L_PAREN 'ignore'US('error'|'warning') SEP+; FATE_VERSION_KW: L_PAREN 'fate'US'version' SEP+; FIELD_KW: L_PAREN 'field' SEP+; FOR_EACH_KW: L_PAREN ('for'US'each') SEP+; diff --git a/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 b/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 index a86ca91..f5868fb 100644 --- a/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 +++ b/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 @@ -45,6 +45,7 @@ options World WORLD; TypedEntryList PARAMETERS; List> ODD_VARS; + int BREAKABLE_LEVELS; } /******************************************************************************/ @@ -57,6 +58,7 @@ fate_file [Context context, World world] WORLD = world; PARAMETERS = null; ODD_VARS = new ArrayList>(); + BREAKABLE_LEVELS = 0; } : WS* FATE_VERSION_KW WORD WS* R_PAREN WS* @@ -164,6 +166,11 @@ first_level_fate_instr: WORLD.variables().add(new_variable); } + | IGNORE_ERROR_KW WORD WS+ first_level_fate_instr WS* R_PAREN + { + /* TODO: temporarily disable an compiler error category */ + } + | DECLARE_VARIABLE_KW scope=WORD WS+ @@ -590,6 +597,12 @@ returns [Instruction result] ); } + | IGNORE_ERROR_KW WORD WS+ general_fate_instr WS* R_PAREN + { + /* TODO: temporarily disable an compiler error category */ + $result = ($general_fate_instr.result); + } + | REMOVE_ONE_KW value WS+ value_reference WS* R_PAREN { $result = @@ -666,7 +679,6 @@ returns [Instruction result] | FREE_KW value_reference WS* R_PAREN { - /* TODO */ $result = new Free ( @@ -718,7 +730,10 @@ returns [Instruction result] $result = new InstructionList(origin, operations); } - | WHILE_KW value WS* general_fate_sequence WS* R_PAREN + | WHILE_KW value WS* + {BREAKABLE_LEVELS++;} general_fate_sequence {BREAKABLE_LEVELS--;} + WS* + R_PAREN { $result = While.build @@ -733,7 +748,10 @@ returns [Instruction result] ); } - | DO_WHILE_KW value WS* general_fate_sequence WS* R_PAREN + | DO_WHILE_KW value WS* + {BREAKABLE_LEVELS++;} general_fate_sequence {BREAKABLE_LEVELS--;} + WS* + R_PAREN { $result = DoWhile.build @@ -748,7 +766,22 @@ returns [Instruction result] ); } - | FOR_KW pre=general_fate_instr WS * value WS* post=general_fate_instr WS* general_fate_sequence WS* R_PAREN + | {BREAKABLE_LEVELS > 0}? BREAK_KW + { + $result = + new Break + ( + CONTEXT.get_origin_at + ( + ($BREAK_KW.getLine()), + ($BREAK_KW.getCharPositionInLine()) + ) + ); + } + + | FOR_KW pre=general_fate_instr WS * value WS* post=general_fate_instr WS* + {BREAKABLE_LEVELS++;} general_fate_sequence {BREAKABLE_LEVELS--;} + WS* R_PAREN { $result = For.build @@ -812,7 +845,9 @@ returns [Instruction result] ($new_reference_name.result) ); } - WS+ general_fate_sequence WS* + WS+ + {BREAKABLE_LEVELS++;} general_fate_sequence {BREAKABLE_LEVELS--;} + WS* R_PAREN { PARAMETERS.remove(($new_reference_name.result)); @@ -1981,6 +2016,12 @@ returns [Computation result] ); } + | IGNORE_ERROR_KW WORD WS+ value WS* R_PAREN + { + $result = ($value.result); + /* TODO: temporarily disable an compiler error category */ + } + | L_PAREN WS+ paragraph WS* R_PAREN { $result = ($paragraph.result); 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 dd3e707..121eda7 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 @@ -976,7 +976,8 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor ) throws Throwable { - /* TODO */ + result_as_computation = + new New(TypeCompiler.compile(compiler, n.get_target_type())); } @Override @@ -986,7 +987,31 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor ) throws Throwable { - /* TODO */ + final ComputationCompiler i_cc, n_cc; + + n_cc = new ComputationCompiler(compiler); + i_cc = new ComputationCompiler(compiler); + + n.get_parent().get_visited_by(n_cc); + n.get_index().get_visited_by(i_cc); + + assimilate(n_cc); + assimilate(i_cc); + + result_as_ref = + new RelativeRef + ( + n_cc.get_ref(), + new Cast(i_cc.get_computation(), Type.STRING), + TypeCompiler.compile + ( + compiler, + ( + (tonkadur.fate.v1.lang.type.CollectionType) + n.get_parent().get_type() + ).get_content_type() + ) + ); } @Override 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 ddb5350..6eaf4b8 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 @@ -1,7 +1,5 @@ package tonkadur.wyrd.v1.compiler.fate.v1; -/* TODO: clean this up, way too many `new ...` could be reused. */ - import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -59,16 +57,6 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor result = new ArrayList(); } - public InstructionCompiler - ( - final Compiler compiler, - final List result - ) - { - this.compiler = compiler; - this.result = result; - } - protected Instruction get_result () { return compiler.assembler().merge(result); @@ -254,7 +242,14 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor !(collection_type instanceof tonkadur.fate.v1.lang.type.CollectionType) ) { - /* TODO: error */ + System.err.println + ( + "[P] (add_element item collection), but this is not a collection: " + + ae.get_collection() + + ". It's a " + + collection_type.get_name() + + "." + ); } collection_true_type = @@ -335,55 +330,439 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor @Override public void visit_switch_instruction ( - final tonkadur.fate.v1.lang.instruction.SwitchInstruction ci + final tonkadur.fate.v1.lang.instruction.SwitchInstruction n ) throws Throwable { - /* TODO */ + /* + * Fate: + * (switch target + * (c0 i0) + * (... ...) + * (cn in) + * default + * ) + * + * Wyrd: + * (declare_variable .anon) + * + * (set .anon target) ;; in case target requires computation. + * + * + * > + * > + */ + Ref anon; + final List + < + Cons + < + tonkadur.fate.v1.lang.meta.Computation, + tonkadur.fate.v1.lang.meta.Instruction + > + > branches; + InstructionCompiler ic; + ComputationCompiler target_cc, cc; + Computation value_of_anon; + List current_branch, previous_else_branch; + + branches = new ArrayList(n.get_branches()); // shallow copy. + + previous_else_branch = new ArrayList(); + + ic = new InstructionCompiler(compiler); + n.get_default_instruction().get_visited_by(ic); + + previous_else_branch.add(ic.get_result()); + + target_cc = new ComputationCompiler(compiler); + + n.get_target().get_visited_by(target_cc); + + target_cc.generate_ref(); + + if (target_cc.has_init()) + { + result.add(target_cc.get_init()); + } + + anon = target_cc.get_ref(); + value_of_anon = new ValueOf(anon); + + for + ( + final + Cons + < + tonkadur.fate.v1.lang.meta.Computation, + tonkadur.fate.v1.lang.meta.Instruction + > + branch: + branches + ) + { + current_branch = new ArrayList(); + + ic = new InstructionCompiler(compiler); + cc = new ComputationCompiler(compiler); + + branch.get_car().get_visited_by(cc); + + if (cc.has_init()) + { + current_branch.add(cc.get_init()); + } + + current_branch.add + ( + IfElse.generate + ( + compiler.anonymous_variables(), + compiler.assembler(), + Operation.equals(value_of_anon, cc.get_computation()), + ic.get_result(), + compiler.assembler().merge(previous_else_branch) + ) + ); + + previous_else_branch = current_branch; + + cc.release_variables(); + } + + result.add(compiler.assembler().merge(previous_else_branch)); + } + + @Override + public void visit_display (final tonkadur.fate.v1.lang.instruction.Display n) + throws Throwable + { + /* + * Fate: (display Computation) + * + * Wyrd: (display Computation) + */ + final ComputationCompiler cc; + + cc = new ComputationCompiler(compiler); + + n.get_content().get_visited_by(cc); + + if (cc.has_init()) + { + result.add(cc.get_init()); + } + + result.add(new Display(cc.get_computation())); + + cc.release_variables(); } @Override public void visit_free (final tonkadur.fate.v1.lang.instruction.Free n) throws Throwable { - /* TODO */ + final ComputationCompiler cc; + final Ref target; + + cc = new ComputationCompiler(compiler); + + n.get_reference().get_visited_by(cc); + + if (cc.has_init()) + { + result.add(cc.get_init()); + } + + target = cc.get_ref(); + + if (target == null) + { + System.err.println + ( + "[P] Argument in (free " + + n.get_reference() + + ") did not compile to a reference." + ); + } + + result.add(new Remove(target)); + + cc.release_variables(); } @Override public void visit_while (final tonkadur.fate.v1.lang.instruction.While n) throws Throwable { - /* TODO */ + final ComputationCompiler cc; + final List body; + final String end_of_loop_label; + InstructionCompiler ic; + + end_of_loop_label = + compiler.assembler().generate_label(""); + + compiler.assembler().push_context_label("breakable", end_of_loop_label); + + cc = new ComputationCompiler(compiler); + body = new ArrayList(); + + n.get_condition().get_visited_by(cc); + + for (final tonkadur.fate.v1.lang.meta.Instruction i: n.get_body()) + { + ic = new InstructionCompiler(compiler); + i.get_visited_by(ic); + + body.add(ic.get_result()); + } + + + if (cc.has_init()) + { + result.add + ( + compiler.assembler().mark_after + ( + While.generate + ( + compiler.anonymous_variables(), + compiler.assembler(), + cc.get_init(), + cc.get_computation(), + compiler.assembler().merge(body) + ), + end_of_loop_label + ) + ); + } + else + { + result.add + ( + compiler.assembler().mark_after + ( + While.generate + ( + compiler.anonymous_variables(), + compiler.assembler(), + cc.get_computation(), + compiler.assembler().merge(body) + ), + end_of_loop_label + ) + ); + } + + compiler.assembler().pop_context_label("breakable"); + cc.release_variables(); } @Override public void visit_do_while (final tonkadur.fate.v1.lang.instruction.DoWhile n) throws Throwable { - /* TODO */ + final List pre_cond_instructions; + final ComputationCompiler cc; + final String end_of_loop_label; + InstructionCompiler ic; + + end_of_loop_label = + compiler.assembler().generate_label(""); + + compiler.assembler().push_context_label("breakable", end_of_loop_label); + + pre_cond_instructions = new ArrayList(); + + cc = new ComputationCompiler(compiler); + n.get_condition().get_visited_by(cc); + + for (final tonkadur.fate.v1.lang.meta.Instruction i: n.get_body()) + { + ic = new InstructionCompiler(compiler); + i.get_visited_by(ic); + + pre_cond_instructions.add(ic.get_result()); + } + + if (cc.has_init()) + { + pre_cond_instructions.add(cc.get_init()); + } + + result.add + ( + compiler.assembler().mark_after + ( + While.generate + ( + compiler.anonymous_variables(), + compiler.assembler(), + compiler.assembler().merge(pre_cond_instructions), + cc.get_computation(), + NOP.generate + ( + compiler.anonymous_variables(), + compiler.assembler() + ) + ), + end_of_loop_label + ) + ); + + compiler.assembler().pop_context_label("breakable"); + cc.release_variables(); } @Override public void visit_for (final tonkadur.fate.v1.lang.instruction.For n) throws Throwable { - /* TODO */ + final ComputationCompiler cc; + final List body; + final String end_of_loop_label; + InstructionCompiler ic; + + end_of_loop_label = + compiler.assembler().generate_label(""); + + compiler.assembler().push_context_label("breakable", end_of_loop_label); + + body = new ArrayList(); + + ic = new InstructionCompiler(compiler); + n.get_pre().get_visited_by(ic); + + result.add(ic.get_result()); + + for (final tonkadur.fate.v1.lang.meta.Instruction i: n.get_body()) + { + ic = new InstructionCompiler(compiler); + i.get_visited_by(ic); + + body.add(ic.get_result()); + } + + ic = new InstructionCompiler(compiler); + n.get_post().get_visited_by(ic); + + body.add(ic.get_result()); + + cc = new ComputationCompiler(compiler); + n.get_condition().get_visited_by(cc); + + if (cc.has_init()) + { + result.add + ( + While.generate + ( + compiler.anonymous_variables(), + compiler.assembler(), + cc.get_init(), + cc.get_computation(), + compiler.assembler().merge(body) + ) + ); + } + else + { + result.add + ( + While.generate + ( + compiler.anonymous_variables(), + compiler.assembler(), + cc.get_computation(), + compiler.assembler().merge(body) + ) + ); + } + + compiler.assembler().pop_context_label("breakable"); + cc.release_variables(); } @Override - public void visit_remove_element_at (final tonkadur.fate.v1.lang.instruction.RemoveElementAt n) + public void visit_for_each (final tonkadur.fate.v1.lang.instruction.ForEach n) throws Throwable { + final String end_of_loop_label; + + end_of_loop_label = + compiler.assembler().generate_label(""); + + compiler.assembler().push_context_label("breakable", end_of_loop_label); + /* TODO */ + + compiler.assembler().pop_context_label("breakable"); } @Override - public void visit_for_each (final tonkadur.fate.v1.lang.instruction.ForEach n) + public void visit_remove_element_at + ( + final tonkadur.fate.v1.lang.instruction.RemoveElementAt n + ) throws Throwable { - /* TODO */ + final ComputationCompiler index_cc, collection_cc; + final Ref collection, collection_size; + final Computation value_of_collection_size; + + index_cc = new ComputationCompiler(compiler); + collection_cc = new ComputationCompiler(compiler); + + collection_size = compiler.anonymous_variables().reserve(Type.INT); + + n.get_index().get_visited_by(index_cc); + n.get_collection().get_visited_by(collection_cc); + + index_cc.generate_ref(); + + if (index_cc.has_init()) + { + result.add(index_cc.get_init()); + } + + if (collection_cc.has_init()) + { + result.add(collection_cc.get_init()); + } + + collection = collection_cc.get_ref(); + + value_of_collection_size = new ValueOf(collection_size); + + result.add(new SetValue(collection_size, new Size(collection))); + + result.add + ( + RemoveAt.generate + ( + compiler.anonymous_variables(), + compiler.assembler(), + index_cc.get_ref(), + value_of_collection_size, + collection + ) + ); + + compiler.anonymous_variables().release(collection_size); + + index_cc.release_variables(); + collection_cc.release_variables(); } + @Override public void visit_cond_instruction ( @@ -411,12 +790,32 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor * > * > */ + final List + < + Cons + < + tonkadur.fate.v1.lang.meta.Computation, + tonkadur.fate.v1.lang.meta.Instruction + > + > branches; InstructionCompiler ic; ComputationCompiler cc; List previous_else_branch; - List current_else_branch; + List current_branch; + + branches = new ArrayList(ci.get_branches()); // shallow copy + previous_else_branch = new ArrayList(); - previous_else_branch = result; + Collections.reverse(branches); + + previous_else_branch.add + ( + NOP.generate + ( + compiler.anonymous_variables(), + compiler.assembler() + ) + ); for ( @@ -427,22 +826,23 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor tonkadur.fate.v1.lang.meta.Instruction > branch: - ci.get_branches() + branches ) { - current_else_branch = new ArrayList(); + current_branch = new ArrayList(); ic = new InstructionCompiler(compiler); cc = new ComputationCompiler(compiler); branch.get_car().get_visited_by(cc); + branch.get_cdr().get_visited_by(ic); if (cc.has_init()) { - previous_else_branch.add(cc.get_init()); + current_branch.add(cc.get_init()); } - previous_else_branch.add + current_branch.add ( IfElse.generate ( @@ -450,49 +850,18 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor compiler.assembler(), cc.get_computation(), ic.get_result(), - compiler.assembler().merge(current_else_branch) + compiler.assembler().merge(previous_else_branch) ) ); - previous_else_branch = current_else_branch; + previous_else_branch = current_branch; cc.release_variables(); } - previous_else_branch.add - ( - NOP.generate - ( - compiler.anonymous_variables(), - compiler.assembler() - ) - ); + result.add(compiler.assembler().merge(previous_else_branch)); } - @Override - public void visit_display (final tonkadur.fate.v1.lang.instruction.Display n) - throws Throwable - { - /* - * Fate: (display Computation) - * - * Wyrd: (display Computation) - */ - final ComputationCompiler cc; - - cc = new ComputationCompiler(compiler); - - n.get_content().get_visited_by(cc); - - if (cc.has_init()) - { - result.add(cc.get_init()); - } - - result.add(new Display(cc.get_computation())); - - cc.release_variables(); - } @Override public void visit_event_call @@ -704,6 +1073,22 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor } } + @Override + public void visit_break + ( + final tonkadur.fate.v1.lang.instruction.Break n + ) + throws Throwable + { + result.add + ( + new SetPC + ( + compiler.assembler().get_context_label_constant("breakable") + ) + ); + } + @Override public void visit_player_choice ( @@ -718,10 +1103,14 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor */ final ComputationCompiler cc; final InstructionCompiler ic; + final String start_of_effect, end_of_effect; cc = new ComputationCompiler(compiler); ic = new InstructionCompiler(compiler); + start_of_effect = compiler.assembler().generate_label(""); + end_of_effect = compiler.assembler().generate_label(""); + n.get_text().get_visited_by(cc); if (cc.has_init()) @@ -729,6 +1118,26 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor result.add(cc.get_init()); } + result.add + ( + new AddChoice + ( + cc.get_computation(), + compiler.assembler().get_label_constant(start_of_effect) + ) + ); + result.add + ( + compiler.assembler().mark_after + ( + new SetPC + ( + compiler.assembler().get_label_constant(end_of_effect) + ), + start_of_effect + ) + ); + for ( final tonkadur.fate.v1.lang.meta.Instruction fate_instruction: @@ -738,7 +1147,17 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor fate_instruction.get_visited_by(ic); } - result.add(new AddChoice(cc.get_computation(), ic.get_result())); + result.add + ( + compiler.assembler().mark_after + ( + new SetPC + ( + compiler.assembler().get_context_label_constant("choices") + ), + end_of_effect + ) + ); cc.release_variables(); } @@ -750,6 +1169,13 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor ) throws Throwable { + final String end_of_choices_label; + + end_of_choices_label = + compiler.assembler().generate_label(""); + + compiler.assembler().push_context_label("choices", end_of_choices_label); + /* * Fate: (player_choice_list i0 ... in) * @@ -768,7 +1194,16 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor fate_instruction.get_visited_by(this); } - result.add(new ResolveChoices()); + compiler.assembler().pop_context_label("choices"); + + result.add + ( + compiler.assembler().mark_after + ( + new ResolveChoices(), + end_of_choices_label + ) + ); } @Override @@ -1126,15 +1561,4 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor value_cc.release_variables(); ref_cc.release_variables(); } - - /* - * TODO: Be careful about compiling Fate's loop operators: - * You can't do: - * condition.get_visited_by(ComputationCompiler); - * result.add(ComputationCompiler.get_init(); - * result.add(While.generate(...)); - * - * The whatever is added in result.add(ComputationCompiler.get_init(); - * needs to be re-evaluated at every iteration. - */ } 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 216b578..61bcd14 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 @@ -44,7 +44,18 @@ public class TypeCompiler if (fate_type instanceof tonkadur.fate.v1.lang.type.RefType) { - return Type.POINTER; + return + new PointerType + ( + compile + ( + compiler, + ( + (tonkadur.fate.v1.lang.type.RefType) + fate_type + ).get_referenced_type() + ) + ); } fate_type = fate_type.get_base_type(); @@ -74,7 +85,8 @@ public class TypeCompiler return Type.STRING; } - /* TODO: throw error. */ + System.err.println("[P] Unknown basic fate type '" + fate_type + "'."); + return null; } @@ -149,7 +161,36 @@ public class TypeCompiler return MapType.MAP_TO_STRING; } - /* TODO: error */ + if (fate_content_type.equals(tonkadur.fate.v1.lang.type.Type.RICH_TEXT)) + { + return MapType.MAP_TO_RICH_TEXT; + } + + if (fate_content_type instanceof tonkadur.fate.v1.lang.type.RefType) + { + return + new MapType + ( + new PointerType + ( + compile + ( + compiler, + ( + (tonkadur.fate.v1.lang.type.RefType) + fate_content_type + ).get_referenced_type() + ) + ) + ); + } + + System.err.println + ( + "[P] Unknown collection member fate type '" + + fate_content_type + + "'." + ); return null; } diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/util/AnonymousVariableManager.java b/src/core/src/tonkadur/wyrd/v1/compiler/util/AnonymousVariableManager.java index 4a8ee82..df0da53 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/util/AnonymousVariableManager.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/util/AnonymousVariableManager.java @@ -87,7 +87,6 @@ public class AnonymousVariableManager + r.toString() + "' is not at constant address." ); - /* TODO: error */ return; } diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/util/InstructionManager.java b/src/core/src/tonkadur/wyrd/v1/compiler/util/InstructionManager.java index bac8d8a..b06b8cb 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/util/InstructionManager.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/util/InstructionManager.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Stack; import tonkadur.wyrd.v1.lang.World; @@ -17,6 +18,7 @@ public class InstructionManager { protected Map label_locations; protected Map> unresolved_labels; + protected Map> context_labels; protected int generated_labels; public InstructionManager () @@ -24,6 +26,7 @@ public class InstructionManager label_locations = new HashMap(); unresolved_labels = new HashMap>(); generated_labels = 0; + context_labels = new HashMap>(); } public void add_fixed_name_label (final String name) @@ -34,6 +37,32 @@ public class InstructionManager } } + public void push_context_label (final String context, final String name) + { + Stack stack; + + stack = context_labels.get(context); + + if (stack == null) + { + stack = new Stack(); + + context_labels.put(context, stack); + } + + stack.push(name); + } + + public void pop_context_label (final String context) + { + context_labels.get(context).pop(); + } + + public Constant get_context_label_constant (final String context) + { + return get_label_constant(context_labels.get(context).peek()); + } + public String generate_label () { final String result; diff --git a/src/core/src/tonkadur/wyrd/v1/lang/computation/New.java b/src/core/src/tonkadur/wyrd/v1/lang/computation/New.java index 552362f..01af634 100644 --- a/src/core/src/tonkadur/wyrd/v1/lang/computation/New.java +++ b/src/core/src/tonkadur/wyrd/v1/lang/computation/New.java @@ -3,6 +3,7 @@ package tonkadur.wyrd.v1.lang.computation; import java.util.List; import tonkadur.wyrd.v1.lang.type.Type; +import tonkadur.wyrd.v1.lang.type.PointerType; import tonkadur.wyrd.v1.lang.meta.Computation; @@ -19,7 +20,7 @@ public class New extends Computation /**** Constructors *********************************************************/ public New (final Type target_type) { - super(Type.POINTER); + super(new PointerType(target_type)); this.target_type = target_type; } diff --git a/src/core/src/tonkadur/wyrd/v1/lang/computation/Ref.java b/src/core/src/tonkadur/wyrd/v1/lang/computation/Ref.java index c303288..5fe62d3 100644 --- a/src/core/src/tonkadur/wyrd/v1/lang/computation/Ref.java +++ b/src/core/src/tonkadur/wyrd/v1/lang/computation/Ref.java @@ -1,6 +1,7 @@ package tonkadur.wyrd.v1.lang.computation; import tonkadur.wyrd.v1.lang.type.Type; +import tonkadur.wyrd.v1.lang.type.PointerType; import tonkadur.wyrd.v1.lang.meta.Computation; @@ -18,7 +19,7 @@ public class Ref extends Computation /**** Constructors *********************************************************/ public Ref (final Computation address, final Type target_type) { - super(Type.POINTER); + super(new PointerType(target_type)); this.address = address; this.target_type = target_type; diff --git a/src/core/src/tonkadur/wyrd/v1/lang/instruction/AddChoice.java b/src/core/src/tonkadur/wyrd/v1/lang/instruction/AddChoice.java index 4f33f8c..f16586a 100644 --- a/src/core/src/tonkadur/wyrd/v1/lang/instruction/AddChoice.java +++ b/src/core/src/tonkadur/wyrd/v1/lang/instruction/AddChoice.java @@ -9,16 +9,16 @@ public class AddChoice extends Instruction /**** MEMBERS **************************************************************/ /***************************************************************************/ protected final Computation label; - protected final Instruction effect; + protected final Computation address; /***************************************************************************/ /**** PUBLIC ***************************************************************/ /***************************************************************************/ /**** Constructors *********************************************************/ - public AddChoice (final Computation label, final Instruction effect) + public AddChoice (final Computation label, final Computation address) { this.label = label; - this.effect = effect; + this.address = address; } /**** Accessors ************************************************************/ @@ -27,9 +27,9 @@ public class AddChoice extends Instruction return label; } - public Instruction get_effect () + public Computation get_address () { - return effect; + return address; } /**** Misc. ****************************************************************/ @@ -43,7 +43,7 @@ public class AddChoice extends Instruction sb.append("(AddChoice "); sb.append(label.toString()); sb.append(" "); - sb.append(effect.toString()); + sb.append(address.toString()); sb.append(")"); return sb.toString(); diff --git a/src/core/src/tonkadur/wyrd/v1/lang/instruction/End.java b/src/core/src/tonkadur/wyrd/v1/lang/instruction/End.java new file mode 100644 index 0000000..4bfa97d --- /dev/null +++ b/src/core/src/tonkadur/wyrd/v1/lang/instruction/End.java @@ -0,0 +1,25 @@ +package tonkadur.wyrd.v1.lang.instruction; + +import tonkadur.wyrd.v1.lang.meta.Instruction; + +public class End extends Instruction +{ + /***************************************************************************/ + /**** MEMBERS **************************************************************/ + /***************************************************************************/ + + /***************************************************************************/ + /**** PUBLIC ***************************************************************/ + /***************************************************************************/ + /**** Constructors *********************************************************/ + public End () + { + } + + /**** Misc. ****************************************************************/ + @Override + public String toString () + { + return "(End)"; + } +} diff --git a/src/core/src/tonkadur/wyrd/v1/lang/type/MapType.java b/src/core/src/tonkadur/wyrd/v1/lang/type/MapType.java index a8d79b4..d8316da 100644 --- a/src/core/src/tonkadur/wyrd/v1/lang/type/MapType.java +++ b/src/core/src/tonkadur/wyrd/v1/lang/type/MapType.java @@ -6,12 +6,14 @@ public class MapType extends Type public static final MapType MAP_TO_FLOAT; public static final MapType MAP_TO_INT; public static final MapType MAP_TO_STRING; + public static final MapType MAP_TO_RICH_TEXT; static { MAP_TO_BOOLEAN = new MapType(Type.BOOLEAN); MAP_TO_FLOAT = new MapType(Type.FLOAT); MAP_TO_INT = new MapType(Type.INT); + MAP_TO_RICH_TEXT = new MapType(Type.RICH_TEXT); MAP_TO_STRING = new MapType(Type.STRING); } @@ -20,7 +22,7 @@ public class MapType extends Type /***************************************************************************/ protected final Type member_type; - protected MapType (final Type member_type) + public MapType (final Type member_type) { super("(Map String->" + member_type.name + ")"); this.member_type = member_type; diff --git a/src/core/src/tonkadur/wyrd/v1/lang/type/PointerType.java b/src/core/src/tonkadur/wyrd/v1/lang/type/PointerType.java new file mode 100644 index 0000000..ee34c0d --- /dev/null +++ b/src/core/src/tonkadur/wyrd/v1/lang/type/PointerType.java @@ -0,0 +1,26 @@ +package tonkadur.wyrd.v1.lang.type; + +public class PointerType extends Type +{ + /***************************************************************************/ + /**** MEMBERS **************************************************************/ + /***************************************************************************/ + protected final Type target_type; + + public PointerType (final Type target_type) + { + super("(PointerTo " + target_type.name + ")"); + this.target_type = target_type; + } + + public Type get_target_type () + { + return target_type; + } + + @Override + public String toString () + { + return name; + } +} diff --git a/src/core/src/tonkadur/wyrd/v1/lang/type/Type.java b/src/core/src/tonkadur/wyrd/v1/lang/type/Type.java index ed377cc..d2f5684 100644 --- a/src/core/src/tonkadur/wyrd/v1/lang/type/Type.java +++ b/src/core/src/tonkadur/wyrd/v1/lang/type/Type.java @@ -5,7 +5,6 @@ public class Type public static final Type BOOLEAN; public static final Type FLOAT; public static final Type INT; - public static final Type POINTER; public static final Type RICH_TEXT; public static final Type STRING; @@ -14,7 +13,6 @@ public class Type BOOLEAN = new Type("boolean"); FLOAT = new Type("float"); INT = new Type("int"); - POINTER = new Type("pointer"); RICH_TEXT = new Type("rich_text"); STRING = new Type("string"); } -- cgit v1.2.3-70-g09d2