2011-04-22 180 views
3

我想使用Haskell漂亮軟件包打印出AST。如何使用Haskell漂亮打印分層嵌套縮進

它一切正常,但嵌套結構不會正確縮進。

我做這樣的事情:

draw :: Pretty a => a -> String 
draw = render.pretty 

pretty (Letin d c) = text "let" <+> text (draw d) $$ 
         nest 4 (text "in" <+> text (draw c)) 

但結果是這樣的:

let Const x := 2 
    in let Var y := Int 
    in y = 3; let Var z := Int 
    in z = 0; z = z + 1 

看來,鳥巢水平不被繼承,因此,所有都在+4保證金絕對,而不是在每個級別連續縮進,即相對於其父級的+4,即當前縮進級別。

回答

3

您的意思是遞歸調用pretty?我無法從你的問題中得知。

快速測試嘗試重現你做了什麼:

import Text.PrettyPrint 

data Letin = Letin String (Maybe Letin) 

draw = show 

pretty (Letin d c) = 
    text "let" <+> text (draw d) $$ 
     nest 4 (text "in" <+> case c of Nothing -> text "empty"; 
             Just c' -> pretty c') 

結果,符合市場預期:

let "x" 
    in let "y" 
      in empty 

所以你可能要列出更多的代碼。

+0

是的遞歸。我忽略了平局的定義;在上面加上,應該和你想象的一樣。我的錯誤是在使用render.pretty的「text(draw e)」上遞歸,而不是直接在「pretty e」上。雖然我不確定爲什麼會打破它......謝謝! – guthrie 2011-04-22 12:50:42