rascal - Rascal 中的具体语法匹配

标签 rascal

如果我有:

import demo::lang::Exp::Concrete::WithLayout::Syntax;
if ((Exp)`<IntegerLiteral e> + <IntegerLiteral e>` := (Exp)`5 + 6`) { 
    println(e);
}

这将打印 6。这是一个可能的错误还是一个设计决策,例如因为性能考虑?它当然不应该打印任何内容,因为 e 无法同时与 56 匹配。然而,这与 ADT 的匹配相反,ADT 被捕获,即:

data ExpNum = numb(int n) | add(ExpNum e1, ExpNum e2);
if (add(numb(x), numb(x)) := add(numb(5), numb(6))) { println(x); }

不会打印数字,但使用 numb(5) 而不是 numb(6) 时会打印数字。

诗。我使用 Eclipse 插件开发(使用与最新版本的 Rascal 合并的 fork 版本)从 Rascal 源运行该示例,并使用官方 Eclipse 插件在两台计算机上运行该示例。然而,该插件在两台机器上都返回了以下内容:

|stdin:///|(4,46,<1,4>,<1,50>): Java compilation failed due to with classpath [/home/wouter/eclipse//plugins/org.eclipse.equinox.launcher_1.3.100.v20150511-1540.jar]: package org.eclipse.imp.pdb.facts.type does not exist

我之所以问这个问题,是因为,有点类似,ConcreteListVariablePattern 自动抛出 RedeclaredVariable 异常,而不检查匹配结果的值是否等于环境,与例如环境相反QualifiedNamePattern 检查结果是否等于环境中的值(如果变量已轻松声明)。

谢谢!

最佳答案

这绝对是一个错误:变量 e 被声明两次(没有警告),匹配成功并打印到第二个 e 的绑定(bind)。 预期的行为是抛出 RedeclaredVariable 异常。

解决方法如下:

if ((Exp)`<IntegerLiteral e1> + <IntegerLiteral e2>` := (Exp)`5 + 6` && e1 == e2) { 
    println(e1);
}

关于rascal - Rascal 中的具体语法匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32060197/

相关文章:

rascal - 将逻辑位置转换为物理位置

request - 使用 Rascal 获取用户输入

rascal - 可能的错误?在具有函数大小的列表列表上使用映射器

rascal - Java 1.5 语法无法构建

transformation - 在使用 ADT 进行转换时,如何选择可选排序列表中的第一个元素?

rascal - 解析、匹配和关键字

rascal - IDE中从Rascal跳转到某个位置的函数是什么

rascal - 出于 CI 目的从 shell 启动 Rascal 测试

rascal - 从函数返回值和语句