[Haskell-cafe] question on traversing syntax tree

Donald Bruce Stewart dons at cse.unsw.edu.au
Thu Aug 24 05:58:51 EDT 2006


xiongyf04:
> I am writing a compiler using Haskell. After the compiler parses program, the program is stored into an syntax tree stucture defined blew:
> 
> ......
> data Exp 
>       = Plus Exp Term 
>       | Minus Exp Term 
>       | Term Term
>       deriving Show
> 
> data Term 
>       = Times Term Factor 
>       | Div Term Factor 
>       | Factor Factor
>       deriving Show
> ......
> 
> This is just part of the definition. The full tree contains much more definition than this. Now I want to adjust the syntax-tree. However, I don't need to adjust all the data types, but a small subset of the syntax tree. e.g. I might adjust the "Times" data like the following, but not modify the rest of the syntax tree:
> transformTerm (Times t f) = Times t (FactorInt 100)
> 
> However, in order to apply the modification like this, I have to write a series of function to traverse the tree until I get to the Term data type. e.g. I have to define:
> transformExp (Plus e t) = Plus (transformExp e) (transformTerm t)
> transformExp (Minus e t) = Minus (transformExp e)(transformTerm t)
> transformTerm (Term t) = ...
> 
> This is tedious and error-prone. I want to know if there some means in Haskell to write a single "generic" function to traverse the syntax tree and only stop on the "Term" data type. Can anyone tell me something about it? Thanks a lot.
> 

The "Scrap Your Boilerplate" series covers this, as does several other
works on generics in Haskell. Here's a good place to start:

    http://www.cs.vu.nl/boilerplate/

also,
    http://www.informatik.uni-bonn.de/~loeh/SYB0.html
    http://www.informatik.uni-bonn.de/~loeh/SYB1.html

-- Don


More information about the Haskell-Cafe mailing list