[Haskell-cafe] question on traversing syntax tree

2006-08-24 Thread Xiong Yingfei
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.

--
Xiong, Yingfei (熊英飞)
Ph.D. Student
Institute of Software
School of Electronics Engineering and Computer Science
Peking University
Beijing, 100871, PRC.
Web: http://xiong.yingfei.googlepages.com___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] question on traversing syntax tree

2006-08-24 Thread Donald Bruce Stewart
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
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe