Regex 提取Haskell中特定类型的所有事件
我正在用Haskell编写一些程序,这些程序以某种方式操作Haskell源代码。我希望能够做的事情之一是提取特定类型的所有事件(可能还有它们的位置) 我认为使用正则表达式的非常粗糙的方法适用于简单的数据类型。例如,在以下图形代码中:Regex 提取Haskell中特定类型的所有事件,regex,parsing,haskell,types,metaprogramming,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 =
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]
我可以通过简单地创建一个正则表达式来提取每个数字,该正则表达式查找数字字符的每个实例,周围没有字母。同样,如果我想找到所有颜色,我可以硬编码一个正则表达式,搜索红色、绿色或蓝色的出现。。。等等
我认为这种方法存在以下问题:
getColor :: Int -> Color
getColor n
|n == 1 = Red
|otherwise = Green
是否有一种更通用的方法来解析Haskell文件,以便提取特定类型的所有引用,如果可能,提取它们在源文件文本中的位置?您可以使用解析器,即保留位置信息(行号和列号)在输出AST中。我确信您可以使用@Bergi做一些事情,因此这个库似乎允许我将源代码转换为抽象语法树,然后我可以搜索特定类型的事件。但是,似乎没有任何方式可以在源文本结构和AST结构之间进行映射(我需要找出类型的每次出现在源代码中的实际位置)。有没有办法至少保留行号之类的内容?这很有用,但从我所看到的情况来看,使用haskell src ext中的parseModule之类的解析函数只提供了最少的源信息(即函数定义和函数类型定义的行号和列号。它不提供函数中提到的构造函数或值的信息。我是否遗漏了什么/是否有方法将其稍微扩展到我想要的程度?>它不提供提到的构造函数或值的信息--您正在查看对于静态分析过程,您将需要执行/after/parsing。除了处理解析器返回的AST之外,没有用于此操作的库。