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