【问题标题】:Concrete Syntax Matching in RascalRascal 中的具体语法匹配
【发布时间】:2015-08-18 06:50:33
【问题描述】:

如果我有:

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 合并的分叉版本)从 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 在容易声明的变量的情况下检查结果是否等于环境中的值。

谢谢!

【问题讨论】:

  • 你能提供你提到的其他案例的例子吗?
  • 另一种情况是关于拥有例如`{Param ","}* paramDups {Param ","} paramDups` 在语法中。这可能会引发异常或像上面的示例一样表现错误(我正在修复我的分叉 Rascal 版本,所以我不是 100% 确定)。然而,我很好奇的是,为什么具体模式中的变量不支持变量重用,而非具体模式中的变量支持变量重用(例如numb(x), numb(x)-example),正如您在回答中所说的那样应该抛出一个RedeclaredVariable-exception。

标签: rascal


【解决方案1】:

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

解决方法如下:

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

【讨论】:

    猜你喜欢
    • 2021-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-09
    相关资源
    最近更新 更多