2014-02-14 4 views

답변

2

예, 역 참조가 가능하지만 그다지 간단하지 않습니다.

먼저 구분 기호를 취소 할 수있는 함수가 필요합니다. 나는 다음과 같은 내놓았다 :

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을 기억하고 복원하여 문제를 피할 수 있습니다.