| summaryrefslogtreecommitdiff |
diff options
| author | nsensfel <SpamShield0@noot-noot.org> | 2020-09-07 18:42:44 +0200 |
|---|---|---|
| committer | nsensfel <SpamShield0@noot-noot.org> | 2020-09-07 18:42:44 +0200 |
| commit | c4b0897e196dfdb685ee6c7aa542e7a0084db953 (patch) | |
| tree | c5fe197691fa73fd6be7f12a5da21d346898fa89 /src | |
| parent | 6f0b536009a1e87068e20d025775aa6e736a7d3d (diff) | |
...
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/src/tonkadur/fate/v1/Utils.java | 19 | ||||
| -rw-r--r-- | src/core/src/tonkadur/fate/v1/lang/computation/Fold.java | 209 | ||||
| -rw-r--r-- | src/core/src/tonkadur/fate/v1/lang/instruction/Range.java | 168 | ||||
| -rw-r--r-- | src/core/src/tonkadur/fate/v1/lang/instruction/Shuffle.java | 101 | ||||
| -rw-r--r-- | src/core/src/tonkadur/fate/v1/parser/FateParser.g4 | 112 |
5 files changed, 563 insertions, 46 deletions
diff --git a/src/core/src/tonkadur/fate/v1/Utils.java b/src/core/src/tonkadur/fate/v1/Utils.java index 7cac057..9c7466d 100644 --- a/src/core/src/tonkadur/fate/v1/Utils.java +++ b/src/core/src/tonkadur/fate/v1/Utils.java @@ -2,6 +2,9 @@ package tonkadur.fate.v1; import java.io.IOException; +import java.util.Deque; +import java.util.Map; + import org.antlr.v4.runtime.CharStreams; import org.antlr.v4.runtime.CommonTokenStream; @@ -10,6 +13,7 @@ import tonkadur.parser.Context; import tonkadur.fate.v1.parser.FateLexer; import tonkadur.fate.v1.parser.FateParser; +import tonkadur.fate.v1.lang.Variable; import tonkadur.fate.v1.lang.World; public class Utils @@ -25,6 +29,18 @@ public class Utils ) throws IOException { + add_file_content(filename, context, null, world); + } + + public static void add_file_content + ( + final String filename, + final Context context, + final Deque<Map<String, Variable>> local_variables, + final World world + ) + throws IOException + { final CommonTokenStream tokens; final FateLexer lexer; final FateParser parser; @@ -33,7 +49,7 @@ public class Utils tokens = new CommonTokenStream(lexer); parser = new FateParser(tokens); - parser.fate_file(context, world); + parser.fate_file(context, local_variables, world); world.add_loaded_file(filename); @@ -42,5 +58,4 @@ public class Utils throw new IOException("There were syntaxic errors in " + filename); } } - } diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/Fold.java b/src/core/src/tonkadur/fate/v1/lang/computation/Fold.java new file mode 100644 index 0000000..e7fd2cd --- /dev/null +++ b/src/core/src/tonkadur/fate/v1/lang/computation/Fold.java @@ -0,0 +1,209 @@ +package tonkadur.fate.v1.lang.computation; + +import java.util.ArrayList; +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.IncompatibleTypeException; +import tonkadur.fate.v1.error.IncomparableTypeException; +import tonkadur.fate.v1.error.InvalidArityException; +import tonkadur.fate.v1.error.InvalidTypeException; + +import tonkadur.fate.v1.lang.type.Type; +import tonkadur.fate.v1.lang.type.LambdaType; +import tonkadur.fate.v1.lang.type.CollectionType; + +import tonkadur.fate.v1.lang.meta.ComputationVisitor; +import tonkadur.fate.v1.lang.meta.Computation; +import tonkadur.fate.v1.lang.meta.Reference; + +public class Fold extends Computation +{ + /***************************************************************************/ + /**** MEMBERS **************************************************************/ + /***************************************************************************/ + protected final Reference lambda_function; + protected final Computation initial_value; + protected final Reference collection; + protected final boolean is_foldl; + + /***************************************************************************/ + /**** PROTECTED ************************************************************/ + /***************************************************************************/ + /**** Constructors *********************************************************/ + protected Fold + ( + final Origin origin, + final Reference lambda_function, + final Computation initial_value, + final Reference collection, + final boolean is_foldl, + final Type act_as + ) + { + super(origin, act_as); + + this.lambda_function = lambda_function; + this.initial_value = initial_value; + this.collection = collection; + this.is_foldl = is_foldl; + } + + /***************************************************************************/ + /**** PUBLIC ***************************************************************/ + /***************************************************************************/ + /**** Constructors *********************************************************/ + public static Fold build + ( + final Origin origin, + final Reference lambda_function, + final Computation initial_value, + final Reference collection, + final boolean is_foldl + ) + throws Throwable + { + final Type var_type, collection_generic_type; + final CollectionType collection_type; + final LambdaType lambda_type; + final List<Type> signature; + + var_type = lambda_function.get_type(); + + if (!(var_type instanceof LambdaType)) + { + ErrorManager.handle + ( + new InvalidTypeException + ( + origin, + var_type, + Collections.singleton(Type.LAMBDA) + ) + ); + + return null; + } + + lambda_type = (LambdaType) var_type; + + signature = lambda_type.get_signature(); + + if + ( + (parameters.size() != signature.size()) + || (parameters.size() != 2) + ) + { + ErrorManager.handle + ( + new InvalidArityException + ( + origin, + parameters.size(), + 2, + 2 + ) + ); + } + + collection_generic_type = collection.get_type(); + + if (!(collection_generic_type instanceof CollectionType)) + { + ErrorManager.handle + ( + new InvalidTypeException + ( + origin, + collection_generic_type, + Type.COLLECTION_TYPES + ) + ); + + return null; + } + + collection_type = (CollectionType) collection_generic_type; + + if (!initial_value.get_type().can_be_used_as(signature.get(0))) + { + /* TODO */ + } + + if (!collection_type.get_member_type().can_be_used_as(signature.get(1))) + { + /* TODO */ + } + + return + new Fold + ( + origin, + lambda_function, + initial_value, + collection, + is_foldl, + initial_value.get_type() + ); + } + + /**** Accessors ************************************************************/ + @Override + public void get_visited_by (final ComputationVisitor cv) + throws Throwable + { + cv.visit_fold(this); + } + + public Reference get_lambda_function_reference () + { + return lambda_function; + } + + public Computation get_initial_value () + { + return initial_value; + } + + public Reference get_collection () + { + return collection; + } + + public boolean is_foldl () + { + return is_foldl; + } + + /**** Misc. ****************************************************************/ + @Override + public String toString () + { + final StringBuilder sb = new StringBuilder(); + + if (is_foldl) + { + sb.append("(Foldl "); + } + else + { + sb.append("(Foldr "); + } + + sb.append(lambda_function.toString()); + + sb.append(" "); + sb.append(initial_value.toString()); + sb.append(" "); + sb.append(collection.get_name()); + sb.append(")"); + + return sb.toString(); + } +} diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/Range.java b/src/core/src/tonkadur/fate/v1/lang/instruction/Range.java new file mode 100644 index 0000000..2398bdf --- /dev/null +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/Range.java @@ -0,0 +1,168 @@ +package tonkadur.fate.v1.lang.instruction; + +import java.util.Collections; + +import tonkadur.error.ErrorManager; + +import tonkadur.parser.Origin; + +import tonkadur.fate.v1.error.InvalidTypeException; + +import tonkadur.fate.v1.lang.type.CollectionType; +import tonkadur.fate.v1.lang.type.Type; + +import tonkadur.fate.v1.lang.meta.InstructionVisitor; +import tonkadur.fate.v1.lang.meta.Instruction; +import tonkadur.fate.v1.lang.meta.Computation; + +public class Range extends Instruction +{ + /***************************************************************************/ + /**** MEMBERS **************************************************************/ + /***************************************************************************/ + protected final Computation collection; + protected final Computation start; + protected final Computation end; + protected final Computation increment; + + /***************************************************************************/ + /**** PROTECTED ************************************************************/ + /***************************************************************************/ + /**** Constructors *********************************************************/ + protected Range + ( + final Origin origin, + final Computation start, + final Computation end, + final Computation increment, + final Computation collection + ) + { + super(origin); + + this.collection = collection; + this.start = start; + this.end = end; + this.increment = increment; + } + + /***************************************************************************/ + /**** PUBLIC ***************************************************************/ + /***************************************************************************/ + /**** Constructors *********************************************************/ + public static Range build + ( + final Origin origin, + final Computation start, + final Computation end, + final Computation increment, + final Computation collection + ) + throws InvalidTypeException + { + final Type t; + + t = collection.get_type(); + + if (!(t instanceof CollectionType)) + { + ErrorManager.handle + ( + new InvalidTypeException + ( + collection.get_origin(), + collection.get_type(), + Type.COLLECTION_TYPES + ) + ); + } + + if (!start.get_type().can_be_used_as(Type.INT)) + { + ErrorManager.handle + ( + new InvalidTypeException + ( + start.get_origin(), + start.get_type(), + Collections.singletonList(Type.INT) + ) + ); + } + + if (!end.get_type().can_be_used_as(Type.INT)) + { + ErrorManager.handle + ( + new InvalidTypeException + ( + end.get_origin(), + end.get_type(), + Collections.singletonList(Type.INT) + ) + ); + } + + if (!increment.get_type().can_be_used_as(Type.INT)) + { + ErrorManager.handle + ( + new InvalidTypeException + ( + increment.get_origin(), + increment.get_type(), + Collections.singletonList(Type.INT) + ) + ); + } + + return new Range(origin, start, end, increment, collection); + } + + /**** Accessors ************************************************************/ + @Override + public void get_visited_by (final InstructionVisitor iv) + throws Throwable + { + iv.visit_range(this); + } + + public Computation get_collection () + { + return collection; + } + + public Computation get_start () + { + return start; + } + + public Computation get_end () + { + return end; + } + + public Computation get_increment () + { + return increment; + } + + /**** Misc. ****************************************************************/ + @Override + public String toString () + { + final StringBuilder sb = new StringBuilder(); + + sb.append("(Range "); + sb.append(start.toString()); + sb.append(" "); + sb.append(end.toString()); + sb.append(" "); + sb.append(increment.toString()); + sb.append(" "); + sb.append(collection.toString()); + sb.append(")"); + + return sb.toString(); + } +} diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/Shuffle.java b/src/core/src/tonkadur/fate/v1/lang/instruction/Shuffle.java new file mode 100644 index 0000000..ebac30e --- /dev/null +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/Shuffle.java @@ -0,0 +1,101 @@ +package tonkadur.fate.v1.lang.instruction; + +import java.util.Collections; + +import tonkadur.error.ErrorManager; + +import tonkadur.parser.Origin; + +import tonkadur.fate.v1.error.InvalidTypeException; + +import tonkadur.fate.v1.lang.type.CollectionType; +import tonkadur.fate.v1.lang.type.Type; + +import tonkadur.fate.v1.lang.meta.InstructionVisitor; +import tonkadur.fate.v1.lang.meta.Instruction; +import tonkadur.fate.v1.lang.meta.Computation; + +public class Shuffle extends Instruction +{ + /***************************************************************************/ + /**** MEMBERS **************************************************************/ + /***************************************************************************/ + protected final Computation collection; + + /***************************************************************************/ + /**** PROTECTED ************************************************************/ + /***************************************************************************/ + /**** Constructors *********************************************************/ + protected Shuffle + ( + final Origin origin, + final Computation collection + ) + { + super(origin); + + this.collection = collection; + } + + /***************************************************************************/ + /**** PUBLIC ***************************************************************/ + /***************************************************************************/ + /**** Constructors *********************************************************/ + public static Shuffle build + ( + final Origin origin, + final Computation collection + ) + throws InvalidTypeException + { + final Type t; + + t = collection.get_type(); + + if + ( + !(t instanceof CollectionType) + || ((CollectionType) t).is_set() + ) + { + ErrorManager.handle + ( + new InvalidTypeException + ( + collection.get_origin(), + collection.get_type(), + Collections.singleton(Type.LIST) + ) + ); + } + + return new Shuffle(origin, collection); + } + + /**** Accessors ************************************************************/ + @Override + public void get_visited_by (final InstructionVisitor iv) + throws Throwable + { + iv.visit_shuffle(this); + } + + public Computation get_collection () + { + return collection; + } + + /**** Misc. ****************************************************************/ + @Override + public String toString () + { + final StringBuilder sb = new StringBuilder(); + + sb.append("(Shuffle "); + sb.append(collection.toString()); + + sb.append(")"); + + return sb.toString(); + } +} diff --git a/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 b/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 index 25882ea..c4c9645 100644 --- a/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 +++ b/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 @@ -52,16 +52,25 @@ options /******************************************************************************/ /******************************************************************************/ /******************************************************************************/ -fate_file [Context context, World world] +fate_file [Context context, Deque<Map<String, Variable>> local_variables, World world] @init { CONTEXT = context; WORLD = world; - LOCAL_VARIABLES = new ArrayDeque<Map<String, Variable>>(); + + if (local_variables == null) + { + LOCAL_VARIABLES = new ArrayDeque<Map<String, Variable>>(); + LOCAL_VARIABLES.push(new HashMap<String, Variable>()); + } + else + { + LOCAL_VARIABLES = local_variables; + } + HIERARCHICAL_VARIABLES = new ArrayDeque<List<String>>(); BREAKABLE_LEVELS = 0; - LOCAL_VARIABLES.push(new HashMap<String, Variable>()); HIERARCHICAL_VARIABLES.push(new ArrayList<String>()); } : @@ -377,7 +386,13 @@ first_level_fate_instr: filename ); - tonkadur.fate.v1.Utils.add_file_content(filename, CONTEXT, WORLD); + tonkadur.fate.v1.Utils.add_file_content + ( + filename, + CONTEXT, + LOCAL_VARIABLES, + WORLD + ); CONTEXT.pop(); } @@ -399,7 +414,13 @@ first_level_fate_instr: filename ); - tonkadur.fate.v1.Utils.add_file_content(filename, CONTEXT, WORLD); + tonkadur.fate.v1.Utils.add_file_content + ( + filename, + CONTEXT, + LOCAL_VARIABLES, + WORLD + ); CONTEXT.pop(); } @@ -724,7 +745,11 @@ returns [Instruction result] ); } - | INDEXED_MAP_KW value WS+ inr=value_reference WS+ outr=value_reference WS* R_PAREN + | INDEXED_MAP_KW + value WS+ + inr=value_reference WS+ + outr=value_reference WS* + R_PAREN { $result = IndexedMap.build @@ -740,41 +765,6 @@ returns [Instruction result] ); } - | FOLDL_KW fun=value WS+ init=value WS+ inr=value_reference WS+ outv=value WS* R_PAREN - { - $result = - Fold.build - ( - CONTEXT.get_origin_at - ( - ($FOLDL_MAP_KW.getLine()), - ($FOLDL_MAP_KW.getCharPositionInLine()) - ), - true, - ($fun.result), - ($init.result), - ($inr.result) - ($outv.result) - ); - } - - | FOLDR_KW fun=value WS+ init=value WS+ inr=value_reference WS+ outv=value WS* R_PAREN - { - $result = - Fold.build - ( - CONTEXT.get_origin_at - ( - ($FOLDR_KW.getLine()), - ($FOLDR_KW.getCharPositionInLine()) - ), - false, - ($fun.result), - ($init.result), - ($inr.result) - ($outv.result) - ); - } | MERGE_KW fun=value WS+ @@ -925,7 +915,7 @@ returns [Instruction result] | SHUFFLE_KW value_reference WS* R_PAREN { $result = - Range.build + Shuffle.build ( CONTEXT.get_origin_at ( @@ -2089,8 +2079,8 @@ returns [Type result] ( CONTEXT.get_origin_at ( - ($LIST_KW.getLine()), - ($LIST_KW.getCharPositionInLine()) + ($CONS_KW.getLine()), + ($CONS_KW.getCharPositionInLine()) ), ($t0.result), ($t1.result), @@ -2982,6 +2972,40 @@ returns [Computation result] ); } + | FOLDL_KW fun=value WS+ init=value WS+ inr=value_reference WS* R_PAREN + { + $result = + Fold.build + ( + CONTEXT.get_origin_at + ( + ($FOLDL_KW.getLine()), + ($FOLDL_KW.getCharPositionInLine()) + ), + ($fun.result), + ($init.result), + ($inr.result), + true + ); + } + + | FOLDR_KW fun=value WS+ init=value WS+ inr=value_reference WS* R_PAREN + { + $result = + Fold.build + ( + CONTEXT.get_origin_at + ( + ($FOLDR_KW.getLine()), + ($FOLDR_KW.getCharPositionInLine()) + ), + ($fun.result), + ($init.result), + ($inr.result), + false + ); + } + | COND_KW value_cond_list WS* R_PAREN { $result = |


