Rascal中的具体语法匹配

时间:2015-08-17 21:44:27

标签: rascal

如果我有:

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

这会打印6。这是一个可能的错误或设计决定,例如出于性能考虑?它当然不能打印任何内容,因为e无法与56匹配。然而,这与匹配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 Plug-in Development(使用与最新版本的Rascal合并的分叉版本)以及使用官方Eclipse插件的两台计算机上的Rascal源代码运行示例。但是,该插件在两台机器上都返回了以下内容:

|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,它检查结果是否等同于容易声明的变量的环境中的值。

谢谢!

1 个答案:

答案 0 :(得分:2)

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

解决方法如下:

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