2014-02-14 38 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解析器。在這一點上它是未定義的,但只要我們知道它就會被真正的解析器取代。

var stopDelimiter = undefined(); 

startDelimiter的行動,我們更換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並恢復它來避免該問題。

相關問題