59a60,65
> /// these structures are what's on the parse stack.  When writing a
> /// grammar rule such as `E --> E:a + E:b`, the variables a and b will
> /// be bound to values of this type, and thus inside the semantic actions
> /// one would need to use `a.value` to extract the value, which is of the
> /// declared 'absyntype' of the grammar.  Alternatively, one can use a
> /// pattern:  `E:@a@ + E:@b@` to bind a and b directly to the values.
62c68
<    pub si : usize, // state index
---
>    si : usize, // state index
72,73c78,79
<   /// line and column numbers and with source_id set to 0.
<   pub fn to_lbox(self) -> LBox<AT>
---
>   /// the line and column numbers
>   pub fn lbox(self) -> LBox<AT>
400,401c406,409
<           None if gsym.label.len()>0 => {plab = format!("_{}_",&gsym.label);},
<           Some(ati) if *ati>0 => {plab=format!("_{}_",&gsym.label[0..*ati]);},
---
>           None if gsym.label.len()>0 && !gsym.label.contains('(') => {
>              plab=format!("{}",gsym.label.trim());
>           },
>           Some(ati) if *ati>0 => {plab=format!("{}",&gsym.label[0..*ati]);},
404,405d411
< //        let plab = if gsym.label.len()>0 && !ispattern
< //          {format!("_{}_",&gsym.label)} else {format!("_item_{}",k-1)};
407c413,414
<         write!(fd,"let {} = parser.popstack(); ",poppedlab)?;
---
>         write!(fd,"let mut {} = parser.popstack(); ",poppedlab)?;
>         
411c418
<             let varlab = &gsym.label[0..atindex];
---
>             //let varlab = &gsym.label[0..atindex];   //es before @: es:@..@
413,419c420,421
<             labels.push_str(varlab); labels.push(',');
<             write!(fd," let mut {}={}.value; ",varlab,poppedlab)?;
<             // this may cause borrow error. may need to store, ln,cl in
<             // separate vars/struct.
<             // RuntimeParser must allocate another vector:
<             // popped:Vec<(usize,usize)> that stores popped line/column info
<             // popped.clear() before every reduce
---
>             labels.push_str(poppedlab); labels.push_str(".value,");
>             //write!(fd," let mut {}={}.value; ",varlab,poppedlab)?;
426c428,429
< 	else if gsym.label.len()>0 { // label exists but only simple pattern
---
> 	else if gsym.label.len()>0 && gsym.label.contains('(') // simple label like E:(a,b)
>         { // label exists but only simple pattern
431c434
<         // else no label - do nothing
---
>         // else simple label is not a pattern, so do nothing
519c522,523
<            stat = format!("let mut {} = parser.popstack().value; ",poppedlab);  // no longer stackitem but lbdown!           
---
>            stat = format!("let mut {} = parser.popstack().value; ",poppedlab);
>            // no need for lbdown if type is already LBA
