有人试图在java可执行文件中的Rascal命令行jar中“链接”并从这个java可执行文件中调用REPL命令吗?我在堆栈溢出(Running a Rascal program from outside the REPL)上发现了一个类似的问题,但不幸的是,这并没有详细说明。
我还查看了Rascal导师网站,但没有找到任何如何做到这一点的例子。Tijs告诉我,它类似于“实例化解释器,然后调用import()函数,之后可以调用调用()函数来注入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`发布于 2015-09-04 11:24:34
下面将完成此操作;在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,不能保证向后兼容性。我可以保证这样的事情永远是可能的。
https://stackoverflow.com/questions/32357189
复制相似问题