Regex 在Haskell中将字符串解析为另一种数据类型

Regex 在Haskell中将字符串解析为另一种数据类型,regex,parsing,haskell,Regex,Parsing,Haskell,最近我一直在尝试在Haskell中创建一个正则表达式解释器。我所做的是用所有可能的构造函数(对于序列、*、^、间隔等)创建一个新的数据类型,然后定义一个匹配器函数。它工作起来很奇妙,但我的问题是我必须将输入(字符串,例如“a(b*)(c | d)ef”)转换为我的数据类型(“Seq(Sym a)(Seq(Rep Sym b)(Seq(或Sym c Sym d)Sym ef))”)。这部分问题我遇到了麻烦(我尝试创建一个新的数据类型,一个解析树,但完全失败)。关于如何解决它,有什么想法吗?规范方法

最近我一直在尝试在Haskell中创建一个正则表达式解释器。我所做的是用所有可能的构造函数(对于序列、
*
^
、间隔等)创建一个新的数据类型,然后定义一个匹配器函数。它工作起来很奇妙,但我的问题是我必须将输入(字符串,例如
“a(b*)(c | d)ef”
)转换为我的数据类型(
“Seq(Sym a)(Seq(Rep Sym b)(Seq(或Sym c Sym d)Sym ef))”
)。这部分问题我遇到了麻烦(我尝试创建一个新的数据类型,一个解析树,但完全失败)。关于如何解决它,有什么想法吗?

规范方法是使用解析器组合器库,例如。 Parser combinator库(如解析器生成器)允许您编写语法描述,生成该语言中从字符串到标记的解析器

您只需将语法编码为Parsec函数


例如,请参见前面的SO问题:

这是一篇关于正则表达式实现的有趣文章(剧本):


如果你不是为了好玩而建这个,还有文本。Regex:我不知道它的细节,但它是一个非常好的解析库。。。玩它还可以教你很多关于单子的东西。@Jani Hartikainen:不幸的是,我不允许使用Text.RegexThank你,我会尝试使用Parsec,看看我能做些什么