On 18 Oct 2012, at 20:07, Richard Hipp <d...@sqlite.org> wrote: > On Thu, Oct 18, 2012 at 3:03 PM, Ben <sqlite_l...@menial.co.uk> wrote: > >> Hi list, >> >> I'm having a little trouble getting my head around memory management >> within a Lemon-generated parser. Specifically the part of the docs stating >> when a destructor will or will not be called. >> >> For example, this is a portion of a grammar based on the SQLite parse.y >> file: >> >> >> columnName ::= nm(N). { >> BSSQLiteColumn *col = [[BSSQLiteColumn alloc] init]; >> col.name = N.textValue; >> [[parsedTable columns] addObject:col]; >> } >> >> nm(A) ::= id(X). { A = X; } >> nm(A) ::= STRING(X). { A = X; } >> id(A) ::= ID(X). { A = X; } >> >> Notes: >> - The token type here is a struct containing an Objective-C string which >> needs freeing when done with. >> - Only a %token_destructor is defined, not any others >> >> >> I know that the last three assignments are leaking memory, but I don't >> know when I should be explicitly freeing my allocated memory within a token >> and when I should be relying on the destructor defined by >> %token_destructor{}. Or for that matter whether I should be declaring a >> more specific symbol destructor. >> >> Can anyone shed some light on how this should be done? >> > > If the nonterminal payload is passed into an action (as in your example > where N is processed because of nm(N)) then Lemon assume that your code > will free the content, if needed. > > If the rule had been: columnName ::= nm {...} (without the (N) argument > to nm) then the destructor would have been called.
Got it. I've added two release calls for X at the end of the C code blocks for these two: nm(A) ::= STRING(X). { A = X; } id(A) ::= ID(X). { A = X; } and now it's working leak-free. Thank you. Ben > The destructor is also called if nm is popped from the stack for any reason > other than the columnName ::= nm rule, such as when the stack is popped > during error recovery. > > >> >> Thanks, >> >> Ben >> >> >> _______________________________________________ >> sqlite-users mailing list >> sqlite-users@sqlite.org >> http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users >> > > > > -- > D. Richard Hipp > d...@sqlite.org > _______________________________________________ > sqlite-users mailing list > sqlite-users@sqlite.org > http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users _______________________________________________ sqlite-users mailing list sqlite-users@sqlite.org http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users