Hello,
I am trying out the happy parser.
Take the second example Binary to Decimal given on the happy site: http://www.haskell.org/happy/doc/html/sec-AttributeGrammarExample.html

This example computes the decimal value equivalent to the given binary string.

I want to modify it so that along with the decimal value, it should compute a list of data values, like MyLeft, MyRight.
I have modified the grammar given on the site as shown below (in the end).

What I want to do is generate a list of MyLeft, MyRight such that MyLeft denotes 0 and MyRight denotes 1.
So, if my input is "1011\n" then I expect the list attribute to be:
[MyRight, Myleft, MyRight, MyRight]

The happy compiles this thing without any problem, ghci compiles and loads it correctly. But when I run the following command I always get only the decimal value and not the list:

So my questions are:
  1. How shall one compute, access multiple attributes in happy first? (use in Haskell code, write to file etc)
  2. How shall one access any one or multiple of the computed attributes in GHCi then?
  3. Am I computing the list correctly?

Thanks in advance.
     kak

Here is my happy grammar code:
-----------------------------
{
module BitsParser (parse) where
test = parse "1011\n"

-- how to write the list attribute to a file here?

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 }
%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 $2; $2.pos = 0 ; $2.list = [] }

bits
   : bit         { $$ = $1
                 ; $1.pos = $$.pos ; $1.list =  $$.list
                 }

   | bits bit    { $$ = $1 + $2 ; $$.list = $1.list ++ $2.list
                 ; $1.pos = $$.pos + 1
                 ; $2.pos = $$.pos
                 }

bit
   : zero        { $$ = 0 ; $$.list = [MyLeft] }
   | one         { $$ = fun 2 ($$.pos) ; $$.list = [MyRight] }
  
{
happyError = error "parse error"
}