
Hello, See the following code. It allows you to compute multiple attributes and access them too. I don't know a better and simpler method than this to serve this purpose. Waiting for inputs from experts. --------------------------------- { module BitsParser (parse) where test = parse "1011\n" -- how to write the list attribute to a file here? test2 = writeFile "testOutFile" (show $ snd test) data Dirs = MyLeft | MyRight deriving Show fun a b = a^b } %tokentype { Char } %token minus { '-' } %token plus { '+' } %token one { '1' } %token zero { '0' } %token newline { '\n' } %attributetype { Attrs } %attribute value { (Integer, [Dirs]) } %attribute pos { Int } %attribute list { [Dirs] } %name parse start %% start : num newline { $$ = $1 } num : bits { $$ = $1 ; $1.pos = 0 ; $1.list = [] } | plus bits { $$ = $2 ; $2.pos = 0 ; $2.list = [] } | minus bits { $$ = (negate (fst $2), snd $2) ; $2.pos = 0 ; $2.list = [] } bits : bit { $$ = $1 ; $1.pos = $$.pos ; $1.list = $$.list } | bits bit { $$ = myComputeAttrFun $1 $2; $$.list = $1.list ++ $2.list ; $1.pos = $$.pos + 1 ; $2.pos = $$.pos } bit : zero { $$ = (0, [MyLeft]) ; $$.list = [MyLeft] } | one { $$ = (fun 2 ($$.pos), [MyRight]) ; $$.list = [MyRight] } { myComputeAttrFun a b = (c, d) where c = fst a + fst b d = snd a ++ snd b happyError = error "parse error" } --------------------------------- -- Thanks and regards, -Damodar Kulkarni