2014-12-06 41 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);應該這樣做