На самом деле не так сложно следить за указателями. Например:
%union {
stringstream *sstream;
}
%type<sstream> pair node1 node2 final
---
pair
: node1 ',' node1 { *($$ = $1) << ',' << *$3; delete $3; }
node1
: node2 { *($$ = $1) << " goodbye" }
node2
: final { *($$ = $1) << "hello" }
final
: TOKEN { *($$ = new stringstream) << "TOKEN"; }
Одной из основных проблем является утечка, если в ваших входных данных есть синтаксические ошибки, из-за которых значения отбрасываются без выполнения ваших действий. Вы можете обойти эту проблему, используя расширение Bison %destructor
. В этом случае вам нужно только добавить:
%destructor { delete $$; } <sstream>