3

我正在用 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 = 区域 (getColor 1) r1

在哪里:

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

是否有一种更通用的方法来解析 Haskell 文件,以便提取特定类型的所有出现,以及它们在源文件文本中的位置(如果可能)?

4

1 回答 1

7

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

于 2013-03-05T14:43:48.847 回答