如何使用可能用解析器组合器库解析此字符串

时间:2017-07-31 15:58:13

标签: javascript parsing haskell parsec parser-combinators

出于学习目的,我实现了一个小的解析器组合库,它有一些解析器和组合器,如charmaybesequencemany等。

我很难弄清楚如何使用我的库来模拟以下正则表达式,以及如何快速实现它。

这是正则表达式:

/(a?){30}a{30}/

以下是来源:

const source = (new Array(30).fill('a')).join('')

这是我的解决方案(不起作用):

const parser = sequence(...[
  ...(new Array(30).fill(maybe(char('a')))),
  ...(new Array(30).fill(char('a'))),
])

扩展为:

sequence(maybe(char('a')), maybe(char('a')), ..., char('a'), char('a'), ...)

我的解决方案有点天真,因为maybe消耗了输入,只留下意外的最终解析器输入结束。

问题:

使用解析器组合器是否有解决该问题的方法? (我见过parsec使用try / lookahead,但我无法弄清楚它在这种情况下会如何起作用)

这个正则表达式的perl版本在3分钟内匹配(perl -e '("a" x 30) =~ /^(a?){30}(a){30}$/;'),而grep在几毫秒内管理它,有没有一种有效的方法来解决它?

感谢。

0 个答案:

没有答案