From aa3314a78fc4613301a2757abe6e67f7e0d02737 Mon Sep 17 00:00:00 2001 From: Nathanael Sensfelder Date: Tue, 10 Aug 2021 18:48:54 +0200 Subject: Yet more changes to how classes are loaded... --- src/core/src/tonkadur/Main.java | 12 +- src/core/src/tonkadur/RuntimeParameters.java | 36 +- src/core/src/tonkadur/TonkadurPlugin.java | 168 +++--- src/core/src/tonkadur/fate/v1/Base.java | 8 + .../lang/computation/ExtraComputationInstance.java | 2 +- .../v1/lang/computation/GenericComputation.java | 174 +++---- .../lang/computation/generic/AddressOperator.java | 65 +-- .../v1/lang/computation/generic/AtReference.java | 102 ++-- .../lang/computation/generic/LambdaEvaluation.java | 96 ++-- .../v1/lang/computation/generic/Operation.java | 580 ++++++--------------- .../src/tonkadur/plugin/base/BaseLanguage.java | 47 -- 11 files changed, 445 insertions(+), 845 deletions(-) delete mode 100644 src/core/src/tonkadur/plugin/base/BaseLanguage.java diff --git a/src/core/src/tonkadur/Main.java b/src/core/src/tonkadur/Main.java index a9c53d9..ace2e5e 100644 --- a/src/core/src/tonkadur/Main.java +++ b/src/core/src/tonkadur/Main.java @@ -20,22 +20,24 @@ public class Main final tonkadur.fate.v1.lang.World fate_world; final tonkadur.wyrd.v1.lang.World wyrd_world; final ParserData parser_data; + final boolean valid_use; tonkadur.fate.v1.Base.initialize(); tonkadur.wyrd.v1.Base.initialize(); + TonkadurPlugin.load_special_classes(); - if (!RuntimeParameters.parse_options(args)) - { - plugins = TonkadurPlugin.get_plugins(); + valid_use = RuntimeParameters.parse_options(args); + + plugins = TonkadurPlugin.get_plugins(); + if (!valid_use) + { RuntimeParameters.print_usage(plugins); return; } - plugins = TonkadurPlugin.get_plugins(); - for (final TonkadurPlugin tp: plugins) { tp.initialize(args); diff --git a/src/core/src/tonkadur/RuntimeParameters.java b/src/core/src/tonkadur/RuntimeParameters.java index 1ecf107..5a4d073 100644 --- a/src/core/src/tonkadur/RuntimeParameters.java +++ b/src/core/src/tonkadur/RuntimeParameters.java @@ -7,13 +7,14 @@ import java.util.HashSet; import java.util.Iterator; import java.util.List; +import java.util.jar.JarFile; + import tonkadur.error.ErrorCategory; public class RuntimeParameters { protected static final String version; protected static final List include_directories; - protected static final List jar_files; protected static final Collection disabled_errors; protected static final Collection tolerated_errors; protected static boolean consider_warnings_as_errors; @@ -23,7 +24,6 @@ public class RuntimeParameters { version = "0.9.2"; include_directories = new ArrayList(); - jar_files = new ArrayList(); disabled_errors = new HashSet(); tolerated_errors = new HashSet(); consider_warnings_as_errors = false; @@ -49,11 +49,6 @@ public class RuntimeParameters return include_directories; } - public static List get_jar_plugins () - { - return jar_files; - } - public static String get_input_file () { return target_file; @@ -90,7 +85,7 @@ public class RuntimeParameters ); System.out.println ( - " -p|--plugin \tLoads 'tonkadur.plugin.*' classes from file." + " -p|--plugin \tLoads plugin classes from jar file." ); System.out.println ( @@ -138,12 +133,35 @@ public class RuntimeParameters } else if (option.equals("-p") || option.equals("--plugin")) { + final String jar_name; + if (!options_it.hasNext()) { return false; } - jar_files.add(options_it.next()); + jar_name = options_it.next(); + + try + { + System.out.println("[D] Loading jar '" + jar_name +"'..."); + + TonkadurPlugin.load_all_relevant_classes_in + ( + new JarFile(jar_name) + ); + } + catch (final Throwable t) + { + System.err.println + ( + "[F] Unable to load plugin jar '" + jar_name + "':" + ); + + t.printStackTrace(); + + System.exit(-1); + } } else if (option.equals("-te") || option.equals("--tolerate-error")) { diff --git a/src/core/src/tonkadur/TonkadurPlugin.java b/src/core/src/tonkadur/TonkadurPlugin.java index d7151aa..cf086e8 100644 --- a/src/core/src/tonkadur/TonkadurPlugin.java +++ b/src/core/src/tonkadur/TonkadurPlugin.java @@ -17,17 +17,51 @@ import tonkadur.parser.Context; public abstract class TonkadurPlugin { - public static List get_classes_in + protected static final List LOADABLE_SUPERCLASSES; + protected static final List TONKADUR_PLUGINS; + + static + { + LOADABLE_SUPERCLASSES = new ArrayList(); + TONKADUR_PLUGINS = new ArrayList(); + + register_as_loadable_superclass(TonkadurPlugin.class); + } + + public static void register_as_loadable_superclass (final Class c) + { + LOADABLE_SUPERCLASSES.add(c); + } + + public static void register (final Class c) + { + try + { + TONKADUR_PLUGINS.add + ( + (TonkadurPlugin) c.getConstructor().newInstance() + ); + } + catch (final Throwable t) + { + System.err.println + ( + "[E] Unable to create an instance of Tonkadur Plugin class '" + + c.getName() + + "':" + ); + + t.printStackTrace(); + } + } + + public static void load_all_relevant_classes_in ( - final JarFile current_jar, - final String folder_path + final JarFile current_jar ) { - final List result; final Enumeration entries; - result = new ArrayList(); - entries = current_jar.entries(); while (entries.hasMoreElements()) @@ -38,11 +72,7 @@ public abstract class TonkadurPlugin candidate = entries.nextElement(); candidate_name = candidate.getName(); - if - ( - !candidate_name.endsWith(".class") - || !candidate_name.startsWith(folder_path) - ) + if (!candidate_name.endsWith(".class")) { continue; } @@ -54,12 +84,11 @@ public abstract class TonkadurPlugin '.' ).substring(0, (candidate_name.length() - 6)); - System.out.println("[D] Loading class " + candidate + "..."); - try { - result.add - ( + final Class c; + + c = Class.forName ( candidate_name, @@ -69,86 +98,57 @@ public abstract class TonkadurPlugin new URL[]{new File(current_jar.getName()).toURI().toURL()}, TonkadurPlugin.class.getClassLoader() ) - ) - ); - } - catch (final Throwable e) - { - System.err.println - ( - "Could not load class " - + candidate_name - + ": " - ); - e.printStackTrace(); - } - } + ); - return result; - } - - public static void initialize_classes_in - ( - final JarFile current_jar, - final String folder_path - ) - throws Throwable - { - // This already initializes the classes. - get_classes_in(current_jar, folder_path); - } - - public static List extract_plugins_from - ( - final JarFile current_jar - ) - { - final List plugins; - - plugins = new ArrayList(); + for (final Class superclass: LOADABLE_SUPERCLASSES) + { + if (superclass.isAssignableFrom(c) && !c.equals(superclass)) + { + System.out.println + ( + "[D] Registering class " + + candidate + + " as a " + + superclass.getName() + + "..." + ); + + superclass.getDeclaredMethod + ( + "register", + Class.class + ).invoke(/*object = */ null, c); - for (final Class c: get_classes_in(current_jar, "tonkadur/plugin")) - { - try - { - plugins.add - ( - (TonkadurPlugin) c.newInstance() - ); + break; + } + } } catch (final Throwable e) { System.err.println ( - "Could not load plugin " - + c.getName() + "[E] Could not load class " + + candidate_name + ": " ); e.printStackTrace(); } } - - return plugins; } - public static List get_plugins () + public static void load_special_classes () { - final List plugins; - - plugins = new ArrayList(); + System.out.println("[D] Loading special classes from main jar..."); try { - plugins.addAll + load_all_relevant_classes_in ( - extract_plugins_from + new JarFile ( - new JarFile + TonkadurPlugin.class.getProtectionDomain ( - TonkadurPlugin.class.getProtectionDomain - ( - ).getCodeSource().getLocation().getFile() - ) + ).getCodeSource().getLocation().getFile() ) ); } @@ -156,23 +156,11 @@ public abstract class TonkadurPlugin { e.printStackTrace(); } + } - for (final String jar_name: RuntimeParameters.get_jar_plugins()) - { - try - { - plugins.addAll - ( - extract_plugins_from(new JarFile(jar_name)) - ); - } - catch (final Exception e) - { - e.printStackTrace(); - } - } - - return plugins; + public static List get_plugins () + { + return TONKADUR_PLUGINS; } public void initialize (final String[] args) diff --git a/src/core/src/tonkadur/fate/v1/Base.java b/src/core/src/tonkadur/fate/v1/Base.java index 4dfa199..34f844f 100644 --- a/src/core/src/tonkadur/fate/v1/Base.java +++ b/src/core/src/tonkadur/fate/v1/Base.java @@ -1,11 +1,19 @@ package tonkadur.fate.v1; +import tonkadur.TonkadurPlugin; + import tonkadur.fate.v1.error.ErrorCategory; +import tonkadur.fate.v1.lang.computation.GenericComputation; +import tonkadur.fate.v1.lang.instruction.GenericInstruction; + public class Base { public static void initialize () { ErrorCategory.initialize(); + + TonkadurPlugin.register_as_loadable_superclass(GenericInstruction.class); + TonkadurPlugin.register_as_loadable_superclass(GenericComputation.class); } } diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/ExtraComputationInstance.java b/src/core/src/tonkadur/fate/v1/lang/computation/ExtraComputationInstance.java index 43d733a..e228e37 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/ExtraComputationInstance.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/ExtraComputationInstance.java @@ -27,7 +27,7 @@ public class ExtraComputationInstance extends GenericComputation final List parameters ) { - super(origin, computation.get_returned_type(), computation.get_name()); + super(origin, computation.get_returned_type()); this.computation = computation; this.parameters = parameters; diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/GenericComputation.java b/src/core/src/tonkadur/fate/v1/lang/computation/GenericComputation.java index 84b5739..dc01b94 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/GenericComputation.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/GenericComputation.java @@ -19,12 +19,61 @@ public class GenericComputation extends Computation /***************************************************************************/ /**** STATIC ***************************************************************/ /***************************************************************************/ - protected static final Map> - REGISTERED; + protected static final Map REGISTERED; static { - REGISTERED = new HashMap>(); + REGISTERED = new HashMap(); + } + + public static void register (final Class c) + { + try + { + for + ( + final String alias: + (List) c.getMethod("get_aliases").invoke + ( + /* object = */null + ) + ) + { + final Class previous_entry; + + previous_entry = REGISTERED.get(alias); + + if (previous_entry != null) + { + // TODO Exception handling. + new Exception + ( + "[F] Unable to add alias for Generic Fate Computation '" + + alias + + "' from class '" + + c.getName() + + "': it has already been claimed by class '" + + previous_entry.getName() + + "'." + ); + + System.exit(-1); + } + + REGISTERED.put(alias, c); + } + } + catch (final Throwable t) + { + System.err.println + ( + "Could not register Generic Fate Computation class '" + + c.getName() + + "': " + ); + + t.printStackTrace(); + } } public static GenericComputation build @@ -35,103 +84,44 @@ public class GenericComputation extends Computation ) throws Throwable { - final Cons target; + final Class computation_class; - target = REGISTERED.get(name); + computation_class = REGISTERED.get(name); - if (target == null) + if (computation_class == null) { - // TODO Exception handling. + // TODO use a separate class for this. + throw + new Exception + ( + "[E] Unknown Generic Fate Computation '" + + name + + "'." + ); } - return target.get_car().build(origin, call_parameters, target.get_cdr()); + return + (GenericComputation) computation_class.getDeclaredMethod + ( + "build", + Origin.class, + String.class, + List.class + ).invoke(/* object = */ null, origin, name, call_parameters); } - /***************************************************************************/ - /**** MEMBERS **************************************************************/ - /***************************************************************************/ - protected final String name; - /***************************************************************************/ /**** PROTECTED ************************************************************/ /***************************************************************************/ /**** Constructors *********************************************************/ - protected GenericComputation - ( - final Origin origin, - final Type type, - final String name - ) + protected GenericComputation (final Origin origin, final Type type) { super(origin, type); - - this.name = name; - } - - protected GenericComputation build - ( - final Origin origin, - final List call_parameters, - final Object constructor_parameter - ) - throws Throwable - { - throw - new Exception - ( - "Missing build function for GenericComputation '" - + name - + "'." - ); - } - - protected void register - ( - final String name, - final Object constructor_parameter - ) - throws Exception - { - if (REGISTERED.containsKey(name)) - { - // TODO Exception handling. - new Exception - ( - "There already is a GenericComputation with the name '" - + name - + "'." - ); - - return; - } - - REGISTERED.put(name, new Cons(this, constructor_parameter)); - } - - protected void register (final Object constructor_parameter) - throws Exception - { - register(get_name(), constructor_parameter); - } - - protected void register - ( - final Collection names, - final Object constructor_parameter - ) - throws Exception - { - for (final String name: names) - { - register(name, constructor_parameter); - } } /***************************************************************************/ /**** PUBLIC ***************************************************************/ /***************************************************************************/ - /**** Constructors *********************************************************/ - /**** Accessors ************************************************************/ @Override public void get_visited_by (final ComputationVisitor cv) @@ -139,24 +129,4 @@ public class GenericComputation extends Computation { cv.visit_generic_computation(this); } - - public String get_name () - { - return name; - } - - /**** Misc. ****************************************************************/ - @Override - public String toString () - { - final StringBuilder sb = new StringBuilder(); - - sb.append("(GenericInstruction ("); - sb.append(type.get_name()); - sb.append(") "); - sb.append(get_name()); - sb.append(")"); - - return sb.toString(); - } } diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/AddressOperator.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/AddressOperator.java index 36b1e7f..bad9e0e 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/AddressOperator.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/AddressOperator.java @@ -1,6 +1,7 @@ package tonkadur.fate.v1.lang.computation.generic; import java.util.ArrayList; +import java.util.Collection; import java.util.List; import tonkadur.parser.Origin; @@ -16,18 +17,9 @@ import tonkadur.fate.v1.lang.computation.Constant; public class AddressOperator extends GenericComputation { - protected static final AddressOperator ARCHETYPE; - - static + public static Collection get_aliases () { - final List aliases; - - ARCHETYPE = - new AddressOperator - ( - Origin.BASE_LANGUAGE, - Constant.build_boolean(Origin.BASE_LANGUAGE, true) - ); + final Collection aliases; aliases = new ArrayList(); @@ -52,16 +44,28 @@ public class AddressOperator extends GenericComputation aliases.add("reference"); aliases.add("ref"); - try - { - ARCHETYPE.register(aliases, null); - } - catch (final Exception e) + return aliases; + } + + public static GenericComputation build + ( + final Origin origin, + final String _alias, + final List call_parameters + ) + throws Throwable + { + if (call_parameters.size() != 1) { - e.printStackTrace(); + // TODO: Error. + System.err.println("Wrong number of params at " + origin.toString()); - System.exit(-1); + return null; } + + call_parameters.get(0).expect_non_string(); + + return new AddressOperator(origin, call_parameters.get(0)); } /***************************************************************************/ @@ -69,10 +73,6 @@ public class AddressOperator extends GenericComputation /***************************************************************************/ protected final Computation referred; - /***************************************************************************/ - /**** PROTECTED ************************************************************/ - /***************************************************************************/ - /***************************************************************************/ /**** PUBLIC ***************************************************************/ /***************************************************************************/ @@ -82,31 +82,12 @@ public class AddressOperator extends GenericComputation super ( origin, - new PointerType(origin, referred.get_type(), "auto generated"), - "address_of" + new PointerType(origin, referred.get_type(), "auto generated") ); this.referred = referred; } - @Override - public GenericComputation build - ( - final Origin origin, - final List call_parameters, - final Object _registered_parameter - ) - throws Throwable - { - if (call_parameters.size() != 1) - { - // TODO: Error. - } - - call_parameters.get(0).expect_non_string(); - - return new AddressOperator(origin, call_parameters.get(0)); - } /**** Accessors ************************************************************/ public Computation get_target () diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/AtReference.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/AtReference.java index fd7b617..58711b7 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/AtReference.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/AtReference.java @@ -1,8 +1,9 @@ package tonkadur.fate.v1.lang.computation.generic; +import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; import java.util.List; -import java.util.ArrayList; import tonkadur.parser.Origin; @@ -25,76 +26,22 @@ import tonkadur.fate.v1.lang.computation.GenericComputation; public class AtReference extends GenericComputation { - protected static final AtReference ARCHETYPE; - - static + public static Collection get_aliases () { - final List aliases; - - ARCHETYPE = - new AtReference - ( - Origin.BASE_LANGUAGE, - Type.INT, - new Default - ( - Origin.BASE_LANGUAGE, - new PointerType - ( - Origin.BASE_LANGUAGE, - Type.INT, - "(ptr int)" - ) - ) - ); + final Collection aliases; aliases = new ArrayList(); aliases.add("at"); - try - { - ARCHETYPE.register(aliases, null); - } - catch (final Exception e) - { - e.printStackTrace(); - - System.exit(-1); - } - } - - /***************************************************************************/ - /**** MEMBERS **************************************************************/ - /***************************************************************************/ - protected final Computation parent; - - /***************************************************************************/ - /**** PROTECTED ************************************************************/ - /***************************************************************************/ - protected AtReference - ( - final Origin origin, - final Type reported_type, - final Computation parent - ) - { - super(origin, reported_type, "at"); - - this.parent = parent; + return aliases; } - /**** Constructors *********************************************************/ - /***************************************************************************/ - /**** PUBLIC ***************************************************************/ - /***************************************************************************/ - /**** Constructors *********************************************************/ - @Override - public GenericComputation build + public static GenericComputation build ( final Origin origin, - final List call_parameters, - final Object _registered_parameter + final String _alias, + final List call_parameters ) throws Throwable { @@ -103,11 +50,14 @@ public class AtReference extends GenericComputation if (call_parameters.size() != 1) { // TODO: Error. + System.err.println("Wrong number of params at " + origin.toString()); + + return null; } call_parameters.get(0).expect_non_string(); - current_type = parent.get_type(); + current_type = call_parameters.get(0).get_type(); if (!(current_type instanceof PointerType)) { @@ -128,8 +78,34 @@ public class AtReference extends GenericComputation current_type = ((PointerType) current_type).get_referenced_type(); } - return new AtReference(origin, current_type, parent); + return new AtReference(origin, current_type, call_parameters.get(0)); + } + + /***************************************************************************/ + /**** MEMBERS **************************************************************/ + /***************************************************************************/ + protected final Computation parent; + + /***************************************************************************/ + /**** PROTECTED ************************************************************/ + /***************************************************************************/ + protected AtReference + ( + final Origin origin, + final Type reported_type, + final Computation parent + ) + { + super(origin, reported_type); + + this.parent = parent; } + /**** Constructors *********************************************************/ + + /***************************************************************************/ + /**** PUBLIC ***************************************************************/ + /***************************************************************************/ + /**** Constructors *********************************************************/ /**** Accessors ************************************************************/ public Computation get_parent () diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/LambdaEvaluation.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/LambdaEvaluation.java index ce1157c..f1af59f 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/LambdaEvaluation.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/LambdaEvaluation.java @@ -1,7 +1,8 @@ package tonkadur.fate.v1.lang.computation.generic; -import java.util.List; import java.util.ArrayList; +import java.util.Collection; +import java.util.List; import tonkadur.parser.Origin; import tonkadur.parser.ParsingError; @@ -19,72 +20,24 @@ import tonkadur.fate.v1.lang.computation.GenericComputation; public class LambdaEvaluation extends GenericComputation { - protected static final LambdaEvaluation ARCHETYPE; - - static + public static Collection get_aliases () { - final List aliases; - - ARCHETYPE = - new LambdaEvaluation - ( - Origin.BASE_LANGUAGE, - null, - null, - Type.BOOL - ); + final Collection aliases; aliases = new ArrayList(); aliases.add("eval"); aliases.add("evaluate"); - try - { - ARCHETYPE.register(aliases, null); - } - catch (final Exception e) - { - e.printStackTrace(); - - System.exit(-1); - } + return aliases; } - /***************************************************************************/ - /**** MEMBERS **************************************************************/ - /***************************************************************************/ - protected final Computation lambda_function; - protected final List parameters; - - /***************************************************************************/ - /**** PROTECTED ************************************************************/ - /***************************************************************************/ /**** Constructors *********************************************************/ - protected LambdaEvaluation + public static GenericComputation build ( final Origin origin, - final Computation lambda_function, - final List parameters, - final Type act_as - ) - { - super(origin, act_as, "eval"); - - this.lambda_function = lambda_function; - this.parameters = parameters; - } - - /***************************************************************************/ - /**** PUBLIC ***************************************************************/ - /***************************************************************************/ - /**** Constructors *********************************************************/ - @Override - public GenericComputation build - ( - final Origin origin, - final List call_parameters, - final Object _registered_parameter + final String _alias, + final List call_parameters ) throws Throwable { @@ -94,6 +47,9 @@ public class LambdaEvaluation extends GenericComputation if (call_parameters.size() < 1) { // TODO: Error. + System.err.println("Wrong number of params at " + origin.toString()); + + return null; } lambda_function = call_parameters.get(0); @@ -125,11 +81,39 @@ public class LambdaEvaluation extends GenericComputation ( origin, lambda_function, - parameters, + call_parameters, (((LambdaType) lambda_function.get_type()).get_return_type()) ); } + /***************************************************************************/ + /**** MEMBERS **************************************************************/ + /***************************************************************************/ + protected final Computation lambda_function; + protected final List parameters; + + /***************************************************************************/ + /**** PROTECTED ************************************************************/ + /***************************************************************************/ + /**** Constructors *********************************************************/ + protected LambdaEvaluation + ( + final Origin origin, + final Computation lambda_function, + final List parameters, + final Type act_as + ) + { + super(origin, act_as); + + this.lambda_function = lambda_function; + this.parameters = parameters; + } + + /***************************************************************************/ + /**** PUBLIC ***************************************************************/ + /***************************************************************************/ + /**** Accessors ************************************************************/ public Computation get_lambda_function () { diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/generic/Operation.java b/src/core/src/tonkadur/fate/v1/lang/computation/generic/Operation.java index 1183c8c..62dcaea 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/generic/Operation.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/generic/Operation.java @@ -1,8 +1,10 @@ package tonkadur.fate.v1.lang.computation.generic; +import java.util.ArrayList; import java.util.Collection; +import java.util.HashMap; import java.util.List; -import java.util.ArrayList; +import java.util.Map; import tonkadur.error.ErrorManager; @@ -26,459 +28,154 @@ import tonkadur.fate.v1.lang.computation.Constant; public class Operation extends GenericComputation { - protected static final Operation ARCHETYPE; + protected static final Map ALIASED_OPERATOR; static { - final List operands; - List aliases; - - operands = new ArrayList(); - - operands.add - ( - Constant.build_boolean - ( - Origin.BASE_LANGUAGE, - false - ) - ); - - operands.add(operands.get(0)); - - ARCHETYPE = - new Operation - ( - Origin.BASE_LANGUAGE, - Type.BOOL, - Operator.AND, - operands - ); - - /**** PLUS **************************************************************/ - aliases = new ArrayList(); - - aliases.add("+"); - aliases.add("plus"); - - try - { - ARCHETYPE.register(aliases, Operator.PLUS); - } - catch (final Exception e) - { - e.printStackTrace(); - - System.exit(-1); - } - - /**** MINUS *************************************************************/ - aliases = new ArrayList(); - - aliases.add("-"); - aliases.add("minus"); - - try - { - ARCHETYPE.register(aliases, Operator.MINUS); - } - catch (final Exception e) - { - e.printStackTrace(); - - System.exit(-1); - } - - /**** TIMES *************************************************************/ - aliases = new ArrayList(); - - aliases.add("*"); - aliases.add("times"); - - try - { - ARCHETYPE.register(aliases, Operator.TIMES); - } - catch (final Exception e) - { - e.printStackTrace(); - - System.exit(-1); - } - - /**** DIVIDE ************************************************************/ - aliases = new ArrayList(); - - aliases.add("/"); - aliases.add("div"); - aliases.add("divide"); - - try - { - ARCHETYPE.register(aliases, Operator.DIVIDE); - } - catch (final Exception e) - { - e.printStackTrace(); - - System.exit(-1); - } - - /**** POWER *************************************************************/ - aliases = new ArrayList(); - - aliases.add("**"); - aliases.add("^"); - aliases.add("pow"); - aliases.add("power"); - - try - { - ARCHETYPE.register(aliases, Operator.POWER); - } - catch (final Exception e) - { - e.printStackTrace(); - - System.exit(-1); - } - - /**** MODULO ************************************************************/ - aliases = new ArrayList(); - - aliases.add("%"); - aliases.add("mod"); - aliases.add("modulo"); - - try - { - ARCHETYPE.register(aliases, Operator.MODULO); - } - catch (final Exception e) - { - e.printStackTrace(); - - System.exit(-1); - } - - /**** MIN ***************************************************************/ - aliases = new ArrayList(); - - aliases.add("min"); - aliases.add("minimum"); - - try - { - ARCHETYPE.register(aliases, Operator.MIN); - } - catch (final Exception e) - { - e.printStackTrace(); - - System.exit(-1); - } - - /**** MAX ***************************************************************/ - aliases = new ArrayList(); - - aliases.add("max"); - aliases.add("maximum"); - - try - { - ARCHETYPE.register(aliases, Operator.MAX); - } - catch (final Exception e) - { - e.printStackTrace(); - - System.exit(-1); - } - - /**** CLAMP *************************************************************/ - aliases = new ArrayList(); - - aliases.add("clamp"); - - try - { - ARCHETYPE.register(aliases, Operator.CLAMP); - } - catch (final Exception e) - { - e.printStackTrace(); - - System.exit(-1); - } - - /**** ABS ***************************************************************/ - aliases = new ArrayList(); - - aliases.add("abs"); - aliases.add("absolute"); - - try - { - ARCHETYPE.register(aliases, Operator.ABS); - } - catch (final Exception e) - { - e.printStackTrace(); - - System.exit(-1); - } - - /**** RANDOM ************************************************************/ - aliases = new ArrayList(); - - aliases.add("rnd"); - aliases.add("rand"); - aliases.add("random"); - - try - { - ARCHETYPE.register(aliases, Operator.RANDOM); - } - catch (final Exception e) - { - e.printStackTrace(); - - System.exit(-1); - } - - /**** AND ***************************************************************/ - aliases = new ArrayList(); - - aliases.add("and"); - aliases.add("/\\"); - - try - { - ARCHETYPE.register(aliases, Operator.AND); - } - catch (final Exception e) - { - e.printStackTrace(); - - System.exit(-1); - } - - /**** OR ****************************************************************/ - aliases = new ArrayList(); - - aliases.add("or"); - aliases.add("\\/"); - - try - { - ARCHETYPE.register(aliases, Operator.OR); - } - catch (final Exception e) - { - e.printStackTrace(); - - System.exit(-1); - } - - /**** NOT ***************************************************************/ - aliases = new ArrayList(); - - aliases.add("not"); - aliases.add("~"); - aliases.add("!"); - - try - { - ARCHETYPE.register(aliases, Operator.NOT); - } - catch (final Exception e) - { - e.printStackTrace(); - - System.exit(-1); - } - - /**** IMPLIES ***********************************************************/ - aliases = new ArrayList(); - - aliases.add("implies"); - aliases.add("=>"); - aliases.add("->"); - - try - { - ARCHETYPE.register(aliases, Operator.IMPLIES); - } - catch (final Exception e) - { - e.printStackTrace(); - - System.exit(-1); - } - - /**** ONE IN ************************************************************/ - aliases = new ArrayList(); - - aliases.add("exactlyOneIn"); - aliases.add("exactlyonein"); - aliases.add("exactly_one_in"); - aliases.add("OneIn"); - aliases.add("onein"); - aliases.add("one_in"); - - try - { - ARCHETYPE.register(aliases, Operator.ONE_IN); - } - catch (final Exception e) - { - e.printStackTrace(); - - System.exit(-1); - } - - /**** EQUALS ************************************************************/ - aliases = new ArrayList(); - - aliases.add("equals"); - aliases.add("eq"); - aliases.add("="); - aliases.add("=="); - - try - { - ARCHETYPE.register(aliases, Operator.EQUALS); - } - catch (final Exception e) - { - e.printStackTrace(); - - System.exit(-1); - } - - /**** LOWER THAN ********************************************************/ - aliases = new ArrayList(); - - aliases.add("lowerThan"); - aliases.add("lowerthan"); - aliases.add("lower_than"); - aliases.add("lt"); - aliases.add("<"); - - try - { - ARCHETYPE.register(aliases, Operator.LOWER_THAN); - } - catch (final Exception e) - { - e.printStackTrace(); - - System.exit(-1); - } - - /**** LOWER EQUAL THAN **************************************************/ - aliases = new ArrayList(); - - aliases.add("lowerEqualThan"); - aliases.add("lowerequalthan"); - aliases.add("lower_equal_than"); - aliases.add("le"); - aliases.add("<="); - aliases.add("=<"); - - try - { - ARCHETYPE.register(aliases, Operator.LOWER_EQUAL_THAN); - } - catch (final Exception e) - { - e.printStackTrace(); - - System.exit(-1); - } - - /**** GREATER EQUAL THAN **************************************************/ - aliases = new ArrayList(); - - aliases.add("greaterEqualThan"); - aliases.add("greaterequalthan"); - aliases.add("greater_equal_than"); - aliases.add("ge"); - aliases.add(">="); - - try - { - ARCHETYPE.register(aliases, Operator.GREATER_EQUAL_THAN); - } - catch (final Exception e) - { - e.printStackTrace(); - - System.exit(-1); - } - - /**** GREATER THAN ******************************************************/ - aliases = new ArrayList(); - - aliases.add("greaterThan"); - aliases.add("greaterthan"); - aliases.add("greater_than"); - aliases.add("gt"); - aliases.add(">"); - - try - { - ARCHETYPE.register(aliases, Operator.GREATER_THAN); - } - catch (final Exception e) - { - e.printStackTrace(); - - System.exit(-1); - } + Operator operator; + + ALIASED_OPERATOR = new HashMap(); + + operator = Operator.PLUS; + ALIASED_OPERATOR.put("+", operator); + ALIASED_OPERATOR.put("plus", operator); + + operator = Operator.MINUS; + ALIASED_OPERATOR.put("-", operator); + ALIASED_OPERATOR.put("minus", operator); + + operator = Operator.TIMES; + ALIASED_OPERATOR.put("*", operator); + ALIASED_OPERATOR.put("times", operator); + + operator = Operator.DIVIDE; + ALIASED_OPERATOR.put("/", operator); + ALIASED_OPERATOR.put("div", operator); + ALIASED_OPERATOR.put("divide", operator); + + operator = Operator.POWER; + ALIASED_OPERATOR.put("**", operator); + ALIASED_OPERATOR.put("^", operator); + ALIASED_OPERATOR.put("pow", operator); + ALIASED_OPERATOR.put("power", operator); + + operator = Operator.MODULO; + ALIASED_OPERATOR.put("%", operator); + ALIASED_OPERATOR.put("mod", operator); + ALIASED_OPERATOR.put("modulo", operator); + + operator = Operator.MIN; + ALIASED_OPERATOR.put("min", operator); + ALIASED_OPERATOR.put("minimum", operator); + + operator = Operator.MAX; + ALIASED_OPERATOR.put("max", operator); + ALIASED_OPERATOR.put("maximum", operator); + + operator = Operator.CLAMP; + ALIASED_OPERATOR.put("clamp", operator); + + operator = Operator.ABS; + ALIASED_OPERATOR.put("abs", operator); + ALIASED_OPERATOR.put("absolute", operator); + + operator = Operator.RANDOM; + ALIASED_OPERATOR.put("rnd", operator); + ALIASED_OPERATOR.put("rand", operator); + ALIASED_OPERATOR.put("random", operator); + + operator = Operator.AND; + ALIASED_OPERATOR.put("and", operator); + ALIASED_OPERATOR.put("/\\", operator); + + operator = Operator.OR; + ALIASED_OPERATOR.put("or", operator); + ALIASED_OPERATOR.put("\\/", operator); + + operator = Operator.NOT; + ALIASED_OPERATOR.put("not", operator); + ALIASED_OPERATOR.put("~", operator); + ALIASED_OPERATOR.put("!", operator); + + operator = Operator.IMPLIES; + ALIASED_OPERATOR.put("implies", operator); + ALIASED_OPERATOR.put("=>", operator); + ALIASED_OPERATOR.put("->", operator); + + operator = Operator.ONE_IN; + ALIASED_OPERATOR.put("exactlyOneIn", operator); + ALIASED_OPERATOR.put("exactlyonein", operator); + ALIASED_OPERATOR.put("exactly_one_in", operator); + ALIASED_OPERATOR.put("OneIn", operator); + ALIASED_OPERATOR.put("onein", operator); + ALIASED_OPERATOR.put("one_in", operator); + + operator = Operator.EQUALS; + ALIASED_OPERATOR.put("equals", operator); + ALIASED_OPERATOR.put("eq", operator); + ALIASED_OPERATOR.put("=", operator); + ALIASED_OPERATOR.put("==", operator); + + operator = Operator.LOWER_THAN; + ALIASED_OPERATOR.put("lowerThan", operator); + ALIASED_OPERATOR.put("lowerthan", operator); + ALIASED_OPERATOR.put("lower_than", operator); + ALIASED_OPERATOR.put("lt", operator); + ALIASED_OPERATOR.put("<", operator); + + operator = Operator.LOWER_EQUAL_THAN; + ALIASED_OPERATOR.put("lowerEqualThan", operator); + ALIASED_OPERATOR.put("lowerequalthan", operator); + ALIASED_OPERATOR.put("lower_equal_than", operator); + ALIASED_OPERATOR.put("le", operator); + ALIASED_OPERATOR.put("<=", operator); + ALIASED_OPERATOR.put("=<", operator); + + operator = Operator.GREATER_THAN; + ALIASED_OPERATOR.put("greaterEqualThan", operator); + ALIASED_OPERATOR.put("greaterequalthan", operator); + ALIASED_OPERATOR.put("greater_equal_than", operator); + ALIASED_OPERATOR.put("ge", operator); + ALIASED_OPERATOR.put(">=", operator); + + operator = Operator.GREATER_THAN; + ALIASED_OPERATOR.put("greaterThan", operator); + ALIASED_OPERATOR.put("greaterthan", operator); + ALIASED_OPERATOR.put("greater_than", operator); + ALIASED_OPERATOR.put("gt", operator); + ALIASED_OPERATOR.put(">", operator); } - /***************************************************************************/ - /**** MEMBERS **************************************************************/ - /***************************************************************************/ - protected final Operator operator; - protected final List operands; + public static Collection get_aliases () + { + return ALIASED_OPERATOR.keySet(); + } - /***************************************************************************/ - /**** PROTECTED ************************************************************/ - /***************************************************************************/ - protected Operation + public static GenericComputation build ( final Origin origin, - final Type result_type, - final Operator operator, + final String alias, final List operands ) + throws Throwable { - super(origin, result_type, "+"); - - this.operator = operator; - this.operands = operands; + return build(origin, ALIASED_OPERATOR.get(alias), operands); } - @Override - public GenericComputation build + public static GenericComputation build ( final Origin origin, - final List operands, - final Object registered_parameter + final Operator operator, + final List operands ) throws Throwable { - final Operator operator; final Collection allowed_base_types; final int operator_max_arity; final int operator_min_arity; final int operands_size; Type computed_type, previous_computed_type; - operator = (Operator) registered_parameter; - allowed_base_types = operator.get_allowed_base_types(); operator_max_arity = operator.get_maximum_arity(); operator_min_arity = operator.get_minimum_arity(); @@ -596,6 +293,29 @@ public class Operation extends GenericComputation return new Operation(origin, computed_type, operator, operands); } + /***************************************************************************/ + /**** MEMBERS **************************************************************/ + /***************************************************************************/ + protected final Operator operator; + protected final List operands; + + /***************************************************************************/ + /**** PROTECTED ************************************************************/ + /***************************************************************************/ + protected Operation + ( + final Origin origin, + final Type result_type, + final Operator operator, + final List operands + ) + { + super(origin, result_type); + + this.operator = operator; + this.operands = operands; + } + /**** Accessors ************************************************************/ public Operator get_operator () { diff --git a/src/core/src/tonkadur/plugin/base/BaseLanguage.java b/src/core/src/tonkadur/plugin/base/BaseLanguage.java deleted file mode 100644 index 9ef4278..0000000 --- a/src/core/src/tonkadur/plugin/base/BaseLanguage.java +++ /dev/null @@ -1,47 +0,0 @@ -package tonkadur.plugin.base; - -import java.util.jar.JarFile; - -import tonkadur.TonkadurPlugin; - -public class BaseLanguage extends TonkadurPlugin -{ - @Override - public void initialize (final String[] args) - throws Throwable - { - final JarFile base_jar; - - base_jar = - new JarFile - ( - BaseLanguage.class.getProtectionDomain - ( - ).getCodeSource().getLocation().getFile() - ); - - TonkadurPlugin.initialize_classes_in - ( - base_jar, - "tonkadur/fate/v1/lang/computation/generic" - ); - - TonkadurPlugin.initialize_classes_in - ( - base_jar, - "tonkadur/fate/v1/lang/instruction/generic" - ); - - TonkadurPlugin.initialize_classes_in - ( - base_jar, - "tonkadur/wyrd/v1/compiler/fate/v1/computation/generic" - ); - - TonkadurPlugin.initialize_classes_in - ( - base_jar, - "tonkadur/wyrd/v1/compiler/fate/v1/instruction/generic" - ); - } -} -- cgit v1.2.3-70-g09d2