在Haskell中提取特定类型的所有匹配项

时间:2013-03-05 13:20:54

标签: regex parsing haskell types metaprogramming

我正在Haskell中编写一些程序,它们以某种方式操作Haskell源代码。我希望能够做的一件事是提取特定类型的所有事件(以及可能的位置)。

我认为使用正则表达式的非常粗略的方法适用于简单的数据类型。例如,在以下图形代码中:

module Test where
    import Picture

    r1,r2,r3,r4 :: Region
    r1 = Shape(Rectangle 2 2)
    r2 = Shape(Ellipse 2 1.5)
    r3 = Shape(RtTriangle 3 2)
    r4 = Shape(Polygon [(-2.5, 2.5), (-3.0,0), (-1.7,-1.0), (-1.1,0.2),(-1.5,2.0)])

    p1,p2,p3,p4 :: Picture
    p1 = Region Red r1
    p2 = Region Green r2
    p3 = Region Blue r3
    p4 = Region Yellow r4

    pic :: Picture
    pic = foldl Over EmptyPic [p1,p2,p3,p4]

我可以通过简单地创建一个正则表达式来提取每个数字,该表达式查找数字字符的每个实例而不包含它们的字母。同样如果我想找到所有颜色,我可以硬编码正则表达式,搜索红色或绿色或蓝色等的出现。

我用这种方法看到的问题是:

  1. 如果我想要更改我要搜索的类型,我必须对该类型可以表现出来的每种可能方式进行硬编码

  2. 如果函数调用返回了类型值,则它不起作用。例如,如果p1改为:

    p1 = Region(getColor 1)r1

  3. 其中:

    getColor :: Int -> Color
    getColor n
        |n == 1 = Red
        |otherwise = Green
    

    是否有更通用的方法来解析Haskell文件,以便提取特定类型的所有匹配项,如果可能,还提取它们在源文件文本中的位置?

1 个答案:

答案 0 :(得分:7)

您可以使用解析器,即haskell-src-exts,它会在输出AST中保留位置信息(行号和列号)。