Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 提取Haskell中特定类型的所有事件_Regex_Parsing_Haskell_Types_Metaprogramming - Fatal编程技术网

Regex 提取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 =

我正在用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]
我可以通过简单地创建一个正则表达式来提取每个数字,该正则表达式查找数字字符的每个实例,周围没有字母。同样,如果我想找到所有颜色,我可以硬编码一个正则表达式,搜索红色、绿色或蓝色的出现。。。等等

我认为这种方法存在以下问题:

  • 如果我想改变我正在搜索的类型,我必须硬编码每一种可能实现该类型的方式

  • 如果类型值作为函数调用的结果返回,则它不起作用。例如,如果p1改为:

    p1=区域(getColor 1)r1

  • 其中:

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

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

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

    我确信您可以使用@Bergi做一些事情,因此这个库似乎允许我将源代码转换为抽象语法树,然后我可以搜索特定类型的事件。但是,似乎没有任何方式可以在源文本结构和AST结构之间进行映射(我需要找出类型的每次出现在源代码中的实际位置)。有没有办法至少保留行号之类的内容?这很有用,但从我所看到的情况来看,使用haskell src ext中的parseModule之类的解析函数只提供了最少的源信息(即函数定义和函数类型定义的行号和列号。它不提供函数中提到的构造函数或值的信息。我是否遗漏了什么/是否有方法将其稍微扩展到我想要的程度?>它不提供提到的构造函数或值的信息--您正在查看对于静态分析过程,您将需要执行/after/parsing。除了处理解析器返回的AST之外,没有用于此操作的库。