String name = Modules.getName(top);
// create the current module if it does not exist yet
GlobalEnvironment heap = eval.getHeap();
ModuleEnvironment env = heap.getModule(name);
if(env == null){
env = new ModuleEnvironment(name, heap);
// do not add the module to the heap here.
}
env.setBootstrap(needBootstrapParser(data));
// make sure all the imported and extended modules are loaded
// since they may provide additional syntax definitions\
Environment old = eval.getCurrentEnvt();
try {
eval.setCurrentEnvt(env);
env.setInitialized(true);
eval.event("defining syntax");
ISet rules = Modules.getSyntax(top);
for (IValue rule : rules) {
evalImport(eval, (IConstructor) rule);
}
eval.event("importing modules");
ISet imports = Modules.getImports(top);
for (IValue mod : imports) {
evalImport(eval, (IConstructor) mod);
}
eval.event("extending modules");
ISet extend = Modules.getExtends(top);
for (IValue mod : extend) {
evalImport(eval, (IConstructor) mod);
}
eval.event("generating modules");
ISet externals = Modules.getExternals(top);
for (IValue mod : externals) {
evalImport(eval, (IConstructor) mod);
}
}
finally {
eval.setCurrentEnvt(old);
}
// parse the embedded concrete syntax fragments of the current module
IConstructor result = tree;
if (!eval.getHeap().isBootstrapper() && (needBootstrapParser(data) || (env.definesSyntax() && containsBackTick(data, 0)))) {
eval.event("parsing concrete syntax");
result = parseFragments(eval, tree, location, env);
}
if (!eval.getSuspendTriggerListeners().isEmpty()) {