1

我想知道一个字段是否与某个字符串不匹配:

情况1:当前一个节点不是*_pcm.h时,则l1给出文件的路径l2

案例2:当没有l1或案例1不正确时,l这就是我需要的

visit(sec) {
  // case 1
  case \sources(_, "_SOURCES", [*_, l1:\sourceList(_, _, _, p:/_pcm.h/i, _, _),
                l2:\sourceList(_, _, _, n:/_pcm.c/i, _, _), *_]): { 
                    name = determinePath(p, n, f); 
  }
  // case 2
  case \sources(_, "_SOURCES", [*_,  l:\sourceList(_, _, _, n:/_pcm.c/i, _, _) , *_]): {
                    path = getPath(f); 
  }
}

而不是p:/_pcm.h/i我尝试过p:!/_pcm.h/i,但这不起作用

4

1 回答 1

2

您不能直接在模式内表达这种否定,但这是一种解决方法,方法是when在您正在转换的情况下向案例添加条件(即,=>在模式和动作之间使用):

data D = d1(str s) | d2(int n);

D transform(D subject){
    return visit(subject){
                case d1(str s) => d1(s + s) when /abc/ !:= s
    }
}

在更复杂的情况下,你可以去测试并使用afail来让情况失败。

case d1(str s): { if(/abc/ !:= s) fail; ... }

希望这可以解决您的问题。

于 2019-10-28T12:43:05.763 回答