3

Haskellのソースコードを特定の方法で操作するプログラムをHaskellで書いています。私がやりたいことの1つは、特定のタイプのすべてのオカレンス(および場合によってはそれらの位置も)を抽出することです。

正規表現を使用する非常に大雑把な方法は、単純なデータ型で機能すると思いました。たとえば、次のグラフィックコードでは次のようになります。

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 に答える