Rascal从java应用程序访问REPL

时间:2015-09-02 15:26:14

标签: java integration rascal

有没有人试图"链接"在java可执行文件中的Rascal命令行jar中,从这个java可执行文件中调用REPL命令? 我在stackoverflow(Running a Rascal program from outside the REPL)上发现了一个类似的问题,但不幸的是,这并没有详细说明。

我还检查了Rascal导师网站,但无法找到有关如何执行此操作的任何示例。 Tijs告诉我,它是"实例化一个解释器,然后调用import()函数,之后可以调用call()函数来注入REPL命令)。

是否有任何关于如何做的示例代码,例如以下来自REPL上的教师站点,但是来自java编程上下文而不是命令行:

rascal>import demo::lang::Exp::Concrete::NoLayout::Syntax;
ok
rascal>import ParseTree;
ok
rascal>parse(#Exp, "2+3");
sort("Exp"): `2+3`

1 个答案:

答案 0 :(得分:0)

以下可以解决问题;可以在rascal/src/org/rascalmpl/interpreter/JavaToRascal.java

中找到相同的实用程序类
GlobalEnvironment heap = new GlobalEnvironment();
IValueFactory vf = ValueFactoryFactory.getValueFactory();
TypeFactory TF = TypeFactory.getInstance();
IRascalMonitor mon = new NullRascalMonitor();
Evaluator eval = new Evaluator(vf, new PrintWriter(System.err), new PrintWriter(System.out), new ModuleEnvironment(ModuleEnvironment.SHELL_MODULE, heap), heap);


eval.doImport(mon, "demo::lang::Exp::Concrete::NoLayout::Syntax");
eval.doImport(mon, "ParseTree");
eval.eval(mon, "parse(#Exp, \"2+3\");", URIUtil.rootLocation("unknown"));

还有更有效的方式与评估者交互,通过pdb.values IValue接口构建数据,ICalleableValue调用Rascal函数。您可以使用上面的堆对象来查询其环境以获取对函数的引用,并且可以使用低级pdb.values API来构造值以传递给这些函数。

警告:这段代码是“内部”API,不保证向后兼容。我可以保证这样的事情永远都是可能的。