首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rascal从java应用程序访问REPL

Rascal从java应用程序访问REPL
EN

Stack Overflow用户
提问于 2015-09-02 15:26:13
回答 1查看 200关注 0票数 1

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

我还查看了Rascal导师网站,但没有找到任何如何做到这一点的例子。Tijs告诉我,它类似于“实例化解释器,然后调用import()函数,之后可以调用调用()函数来注入REPL命令)。

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

代码语言:javascript
复制
rascal>import demo::lang::Exp::Concrete::NoLayout::Syntax;
ok
rascal>import ParseTree;
ok
rascal>parse(#Exp, "2+3");
sort("Exp"): `2+3`
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-04 11:24:34

下面将完成此操作;在rascal/src/org/rascalmpl/interpreter/JavaToRascal.java中可以找到相同的实用程序类

代码语言:javascript
复制
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,不能保证向后兼容性。我可以保证这样的事情永远是可能的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32357189

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档