我没有在标准库文档中看到一个.谷歌搜索作为最受欢迎的"Rascal Unit旅行宠物消毒和健康诊所打印[原文如此]信息."
所以我一直在使用Rascal一段时间,但我想知道是否有支持调试而不使用println和终端?
就像在Visual Studio中使用c#一样,逐步执行代码,转换为函数等等.
对我来说,这将是一个很大的帮助,可以节省时间.
如何避免模块之间的名称冲突?从文档来看,目前 Rascal 中的模块之间似乎没有原则性的名称管理。导入模块时,public导入模块中声明的所有名称都进入范围。有没有办法合格进口?或者会有吗?
我有一个存储地图的类型值变量,但我无法通过提供键来访问这些值:
rascal>a
value: ("s":"s")
rascal>a["s"]
|stdin:///|(2,3,<1,2>,<1,5>): subscript not supported on value at |stdin:///|(2,3,<1,2>,<1,5>)
? Advice
Run Code Online (Sandbox Code Playgroud)
如何解析值以映射以便能够检索我的值?
我正在研究使用 Rascal 计算 java 方法的圈复杂度。
一种方法是:
case, catch, do, while, if, for,foreach另一种是使用图论并使用公式 e-n+2。使用 rascal 函数可以很容易地获得 e 和 n。我的问题是如何构建控制流图,我发现了以下模块:
analysis::flow::ControlFlow这似乎是朝着正确方向迈出的一步,但我完全不知道从哪里开始。
我是一个有点意思混淆*和+语法规范.我期待类似的东西
rascal>syntax Statement = "{" {Statement ";"}* "}";
Run Code Online (Sandbox Code Playgroud)
表示以分号分隔和结束的语句块.但在文档中它说:
由分号分隔的语句块
我确实在一些代码中看到,这样的语法规范允许{ x = 1; x }解析语句.为什么会那样?
我需要一种在 Rascal 中序列化数据的方法,因为某些操作可能相对较慢,并且需要某种快速形式的缓存。例如 AST 的构建。
我使用以下代码段从项目的指定位置构建 AST:
list[Declaration] getASTs(loc projectLocation) {
M3 model = createM3FromMavenProject(projectLocation);
list[Declaration] asts = [createAstFromFile(f, true)
| f <- files(model.containment), isCompilationUnit(f)];
return asts;
}
Run Code Online (Sandbox Code Playgroud)
现在构建一个特定的 AST 需要一些时间(大约 2-3 秒)。因此,我希望将结果缓存在某个转储文件中:
loc smallsqlLoc = projectLoc + "smallsql0.21_src";
loc dumpLoc = projectLoc + "dump/smallsql.bin";
if(!exists(dumpLoc)) {
list[Declaration] dumpAsts = getASTs(smallsqlLoc);
writeFile(dumpLoc, dumpAsts);
}
Run Code Online (Sandbox Code Playgroud)
并将其读回内存(希望会更快):
if(!exists(dumpLoc))
throw "Error: dump does not exist.";
list[Declaration] asts = readFile(dumpLoc);
Run Code Online (Sandbox Code Playgroud)
但 readFile 的返回类型是str, 不是list[Declaration]。简单的强制转换显然不能解决问题。如何将最初写入文件的 AST 恢复到内存中?更一般地说,如何在 Rascal 中对文件中的任何数据类型进行序列化和反序列化?
是否可以通过使用列表推导或类似的东西将这样的访问重写为单行?
list[str] nodeNames = [];
visit (ast) {
case someNode(str name): {
nodeNames += name;
}
};
Run Code Online (Sandbox Code Playgroud)