0

假设我有:

visit(p) { 
   case ...
   default:
       println("This should not happen. All elements should be catched. Check: <x>");
};

如何打印(在本例中为 x)无法匹配的内容?

我试过了:

x:default:

\x:default:

default:x:

\default:x:

发送,

乔斯

4

2 回答 2

0

我们有一个名为的库Traversal,可让您取回匹配的上下文。因此,您可以执行以下操作:

import Traversal;
import IO;

void doit() {
    m = (1:"one",2:"two",3:"three");
    bottom-up visit(m) {
        case int n : println("<n> is an int");
        default: {
            tc = getTraversalContext();
            println("Context is: <tc>");
            println("<tc[0]> is not an int");
            if (str s := tc[0]) {
                println("<s> is a string");
            }
        }
    }
}

tc然后是返回术语顶部的所有节点的列表 - 在这种情况下,它将只是当前值,例如"three",以及 map 的整个值m(或整个 map,这也将是匹配默认情况下)。如果你有一些结构为树的东西,例如使用 ADT 或节点形成的术语,你会得到从匹配点回到顶部的所有中间结构(这将是整个术语)。

但是,出于某种原因,它default多次匹配同一个术语。我已在 GitHub 上将此作为错误报告https://github.com/cwi-swat/rascal/issues/731提交。

于 2014-12-04T21:52:42.983 回答
0

你也可以试试这个成语:

visit(x) {
  case ...
  case ...
  case value x: throw "default case should not happen <x>";
}

价值模式将捕获一切,但只有在其他人尝试之后。

于 2014-12-04T23:06:13.910 回答