Как я могу отрицать регулярное выражение? - PullRequest
1 голос
/ 28 октября 2019

Я хочу знать поле, если оно не соответствует определенной строке:

Случай 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, но это не работает

1 Ответ

2 голосов
/ 28 октября 2019

Вы не можете напрямую выразить это отрицание внутри шаблона, но здесь есть обходной путь, добавив условие 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
    }
}

В случае более сложного случая вы можете провести тестирование и использовать fail, чтобы разрешить сбой случая.

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

Надеюсь, что это решит вашу проблему.

...