Comment detail

α置換 (Nested Flatten)
GHC6.8.1にパーサーとprettyprintのライブラリがあったのを発見したので、途中まで作ってみました。 ppという名前をpopに、popをppに置き換えるようになっています。 もう少しがんばらなくてはいけないところ: 1.入力ソースがprettyprintされてしまうので、アルファ置換以外の変更が起きてしまう。(改行、インデントが変わってしまう、コメントが保持されない) 2.スコープ管理がされていない。 3.ネームスペースに関する処理が入っていない…(Data.Stack.popは置換されるべきではないけれど、pop, Main.popはされるべき...) コメントの問題はパーサーの機能不足なので、解決には違うアプローチが必要です...パーサーがサポートしてくれれば、簡単ですが… 2,3に関してはパーサーのサポートはあるので、コードを書くだけなんですが...誰かやってください...
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
module Main where

import Language.Haskell.Syntax
import Language.Haskell.Parser
import Language.Haskell.Pretty
import Data.Generics

pp :: ParseResult HsModule -> String
pp (ParseOk hsm) = prettyPrint hsm
pp _ = "parse failed"

repl :: ParseResult HsModule -> ParseResult HsModule
repl (ParseOk hsm) = ParseOk $ (everywhere (mkT conversion)) hsm
    where
        conversion :: HsName -> HsName
        conversion (HsIdent "pp") = HsIdent "pop"
        conversion (HsIdent "pop") = HsIdent "pp"
        conversion pop = pop
repl a = a

main :: IO ()
main 
  = do mod <- getContents
       putStr $ pp $ repl $ parseModule mod

Index

Feed

Other

Link

Pathtraq

loading...