1
我想定義一個特殊的代碼塊,它可以由{[<#
的任何字符組合開始,最後將是}]>#
。如何匹配塊的開始和結束
一些示例:
{
block-content
}
{##
block-content
##}
#[[<{###
block-content
###}>]]#
是否有可能與petitparser-dart?
我想定義一個特殊的代碼塊,它可以由{[<#
的任何字符組合開始,最後將是}]>#
。如何匹配塊的開始和結束
一些示例:
{
block-content
}
{##
block-content
##}
#[[<{###
block-content
###}>]]#
是否有可能與petitparser-dart?
是的,後向引用是可能的,但並不是那麼直截了當。
首先我們需要一個可以反轉我們的分隔符的函數。我想出了以下情況:
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
並恢復它來避免該問題。