2013-03-05 23 views
3

我在Haskell中編寫了一些程序,它以某種方式操縱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文件,以便在更一般的方式提取所有出現的特定類型,如果可能,提取它們在源文件文本中的位置?

+1

我相信你可以用http://hackage.haskell.org/package/haskell-src – Bergi 2013-03-05 13:50:16

+0

@Bergi做些事情因此,看起來這個庫允許我將我的源代碼轉換爲抽象語法樹,然後我可以搜索特定類型的出現。似乎沒有任何方法可以在源文本結構和AST結構之間進行映射(然而,我需要找出其中哪些類型實際出現在源代碼中)。有沒有辦法保留至少行號或什麼的? – 2013-03-05 14:26:46

回答

7

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

+0

這很有用,但是從我所看到的,使用像haskell-src-ext中的parseModule這樣的解析函數僅提供最少的源信息(即函數定義和函數類型定義的行和列號。構造函數或值在一個函數中提到我缺少的東西/有沒有辦法擴大這個稍微進一步去做我想要的? – 2013-03-05 23:30:53

+0

>它沒有提供關於構造函數或值的信息 - 你正在尋找一個靜態分析階段,你需要做/之後/分析。除了你操作解析器返回的AST之外,沒有這個庫。 – 2013-03-06 09:41:28

相關問題