如何匹配的块的开始和结束(How to match the start and end of a b

2019-10-19 09:03发布

我想的字符的任意组合,以限定一个特殊的代码块,其可以开始{[<#和年底将}]>#

一些例子:

{
    block-content
}

{##
    block-content
##}

#[[<{### 
    block-content 
###}>]]#

是否有可能与petitparser镖 ?

Answer 1:

是的,反向引用是可能的,但它不是直接的。

首先,我们需要一个能够扭转我们分隔符的功能。 我想出了以下内容:

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和恢复它。



文章来源: How to match the start and end of a block