On 18 Oct 2012, at 20:07, Richard Hipp <[email protected]> wrote:
> On Thu, Oct 18, 2012 at 3:03 PM, Ben <[email protected]> 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
>> [email protected]
>> http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
>>
>
>
>
> --
> D. Richard Hipp
> [email protected]
> _______________________________________________
> sqlite-users mailing list
> [email protected]
> http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
_______________________________________________
sqlite-users mailing list
[email protected]
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users