标签: rascal

是否有Rascal的单元测试框架?

我没有在标准库文档中看到一个.谷歌搜索作为最受欢迎的"Rascal Unit旅行宠物消毒和健康诊所打印[原文如此]信息."

rascal

7
推荐指数
1
解决办法
339
查看次数

调试Rascal代码

所以我一直在使用Rascal一段时间,但我想知道是否有支持调试而不使用println和终端?

就像在Visual Studio中使用c#一样,逐步执行代码,转换为函数等等.

对我来说,这将是一个很大的帮助,可以节省时间.

rascal

6
推荐指数
1
解决办法
1494
查看次数

如何避免Rascal中模块之间的名称冲突?

如何避免模块之间的名称冲突?从文档来看,目前 Rascal 中的模块之间似乎没有原则性的名称管理。导入模块时,public导入模块中声明的所有名称都进入范围。有没有办法合格进口?或者会有吗?

rascal

5
推荐指数
1
解决办法
127
查看次数

4
推荐指数
1
解决办法
331
查看次数

如何在Rascal中将值类型转换为Map?

我有一个存储地图的类型值变量,但我无法通过提供键来访问这些值:

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)

如何解析值以映射以便能够检索我的值?

map rascal

4
推荐指数
1
解决办法
218
查看次数

获得圈复杂度

我正在研究使用 Rascal 计算 java 方法的圈复杂度。

一种方法是:

  • 从方法中获取 AST
  • 在这棵树上使用访问模式
  • 检查以下所有增加 CC 的关键字:case, catch, do, while, if, for,foreach

另一种是使用图论并使用公式 e-n+2。使用 rascal 函数可以很容易地获得 e 和 n。我的问题是如何构建控制流图,我发现了以下模块: analysis::flow::ControlFlow这似乎是朝着正确方向迈出的一步,但我完全不知道从哪里开始。

cyclomatic-complexity rascal

4
推荐指数
1
解决办法
874
查看次数

语法规范中*和+的含义

我是一个有点意思混淆*+语法规范.我期待类似的东西

rascal>syntax Statement = "{" {Statement ";"}* "}";
Run Code Online (Sandbox Code Playgroud)

表示以分号分隔和结束的语句块.但在文档中它说:

由分号分隔的语句块

我确实在一些代码中看到,这样的语法规范允许{ x = 1; x }解析语句.为什么会那样?

rascal

3
推荐指数
1
解决办法
151
查看次数

如何在 Rascal MPL 中序列化/反序列化数据到文件

我需要一种在 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 中对文件中的任何数据类型进行序列化和反序列化?

serialization caching metaprogramming rascal

3
推荐指数
1
解决办法
116
查看次数

写更短的访问

是否可以通过使用列表推导或类似的东西将这样的访问重写为单行?

list[str] nodeNames = [];

visit (ast) {
  case someNode(str name): {
    nodeNames += name;
  }
};
Run Code Online (Sandbox Code Playgroud)

rascal

2
推荐指数
1
解决办法
66
查看次数