예, 역 참조가 가능하지만 그다지 간단하지 않습니다.
먼저 구분 기호를 취소 할 수있는 함수가 필요합니다. 나는 다음과 같은 내놓았다 :
String reverseDelimiter(String token) {
return token.split('').reversed.map((char) {
if (char == '[') return ']';
if (char == '{') return '}';
if (char == '<') return '>';
return char;
}).join();
}
그런 다음 우리가
stopDelimiter
파서를 선언해야합니다. 이 시점에서는 정의되지 않지만, 우리가 알고있는 즉시 실제 파서로 대체 될 것입니다.
startDelimiter
의 작용에
var stopDelimiter = undefined();
다음과 같이 우리가 동적으로 생성 된 파서와 stopDelimiter
교체 :
var startDelimiter = pattern('#<{[').plus().flatten().map((String start) {
stopDelimiter.set(string(reverseDelimiter(start)).flatten());
return start;
});
나머지는 사소한,하지만 당신의 정확한 요구 사항에 따라 달라집니다 :
var blockContents = any().starLazy(stopDelimiter).flatten();
var parser = startDelimiter & blockContents & stopDelimiter;
위의 코드는 blockContents
파서를 정의하므로 일치 항목이 stopDelimiter
이 될 때까지 읽습니다. 발생했습니다. 제공된 예제는 다음을 전달합니다.
print(parser.parse('{ block-content }'));
// Success[1:18]: [{, block-content , }]
print(parser.parse('{## block-content ##}'));
// Success[1:22]: [{##, block-content , ##}]
print(parser.parse('#[[<{### block-content ###}>]]#'));
// Success[1:32]: [#[[<{###, block-content , ###}>]]#]
파서를 중첩하려면 위 코드가 작동하지 않습니다. 필요한 경우 이전 stopDelimiter
을 기억하고 복원하여 문제를 피할 수 있습니다.