出于学习目的,我实现了一个小的解析器组合库,它有一些解析器和组合器,如char
,maybe
,sequence
,many
等。
我很难弄清楚如何使用我的库来模拟以下正则表达式,以及如何快速实现它。
这是正则表达式:
/(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在几毫秒内管理它,有没有一种有效的方法来解决它?
感谢。