2014-12-06 37 views
1

我想知道是否有可能在这里使用匿名变量来匹配节点的类型。例如从http://tutor.rascal-mpl.org/Rascal/Expressions/Values/Location/Location.html#/Rascal/Patterns/Abstract/TypedLabelled/TypedLabelled.html):使用匿名变量匹配类型中的节点类型标记的模式匹配

case Exp e:_(_,_): println("And I found an Exp <e>"); 

它将同时匹配添加和减去Exp节点。我一直在尝试一些类似的东西,但没有取得任何成功。

(道歉,我在网站上的评论部分贴在这之前我看到了ask.rascal链接)

回答

3

大厦戴维的答案,你可以做这样的事情如果你只是想匹配的两个参数的构造函数:

rascal>data D = d1(int n) | d2(int n, int m) | d3(int n,int m); 
ok 

rascal>D d: str s(_,_) := d2(3,4); 
bool: true 

rascal>D d: str s(_,_) := d1(3); 
bool: false 

通常在比赛这种形式,你会使用构造函数的名称。相反,使用str s强制这是一个通用节点匹配,其中节点作为节点名称(一个字符串,这里是构造函数名称)和节点参数(这里,我们假设两个参数)给出。如果这些类型的匹配数量很大,这可能会很有用,但除此之外,我会建议您单独编写它们。

+0

你能解释'str s'部分吗? – 2014-12-06 19:08:20

+0

非常感谢!这工作完美。我需要一些方法来提取节点的类型和其中的一部分...是的,有很多我有兴趣处理相同的问题。所以,匹配节点的模式看起来会很好地工作。再次感谢。 – josh 2014-12-06 20:24:40

+0

@DavyLandman对不起,我之前没有看到您的问题,'str s'部分是为了确保它匹配为一个节点。我会在上面给出的解释中加上。 – 2015-02-05 20:50:10

1

case Exp e: println(e);应该这样做