[pure-lang-svn] SF.net SVN: pure-lang: [257] pure/trunk/parser.yy
Status: Beta
Brought to you by:
agraef
From: <ag...@us...> - 2008-06-18 15:43:20
|
Revision: 257 http://pure-lang.svn.sourceforge.net/pure-lang/?rev=257&view=rev Author: agraef Date: 2008-06-18 08:43:29 -0700 (Wed, 18 Jun 2008) Log Message: ----------- Bugfix: Handle execeptions in default_lhs(). Modified Paths: -------------- pure/trunk/parser.yy Modified: pure/trunk/parser.yy =================================================================== --- pure/trunk/parser.yy 2008-06-18 08:53:21 UTC (rev 256) +++ pure/trunk/parser.yy 2008-06-18 15:43:29 UTC (rev 257) @@ -275,8 +275,9 @@ | LET simple_rule { action(interp.define($2), delete $2); } | rule -{ rulel *rl = interp.default_lhs(interp.last, $1); - action(interp.add_rules(interp.globenv, rl, true), delete rl); } +{ rulel *rl = 0; + action(interp.add_rules(interp.globenv, + (rl = interp.default_lhs(interp.last, $1)), true), if (rl) delete rl); } | fixity /* Lexical tie-in: We need to tell the lexer that we're defining new operator symbols (interp.declare_op = true) instead of searching for existing ones @@ -577,14 +578,20 @@ rulel : rule { $$ = new rule_info; - rulel *rl = interp.default_lhs($$->l, $1); - try { interp.add_rules($$->e, rl); } - catch (err &e) { delete rl; interp.error(yyloc, e.what()); } } + rulel *rl = 0; + try { + rl = interp.default_lhs($$->l, $1); + interp.add_rules($$->e, rl); + } + catch (err &e) { if (rl) delete rl; interp.error(yyloc, e.what()); } } | rulel ';' rule { $$ = $1; - rulel *rl = interp.default_lhs($$->l, $3); - try { interp.add_rules($$->e, rl); } - catch (err &e) { delete rl; interp.error(yyloc, e.what()); } } + rulel *rl = 0; + try { + rl = interp.default_lhs($$->l, $3); + interp.add_rules($$->e, rl); + } + catch (err &e) { if (rl) delete rl; interp.error(yyloc, e.what()); } } ; /* Same for pattern rules (pattern binding in 'case' clauses). */ @@ -597,14 +604,20 @@ pat_rulel : rule { $$ = new pat_rule_info; - rulel *rl = interp.default_lhs($$->l, $1); - try { interp.add_rules($$->rl, rl, true); } - catch (err &e) { delete rl; interp.error(yyloc, e.what()); } } + rulel *rl = 0; + try { + rl = interp.default_lhs($$->l, $1); + interp.add_rules($$->rl, rl, true); + } + catch (err &e) { if (rl) delete rl; interp.error(yyloc, e.what()); } } | pat_rulel ';' rule { $$ = $1; - rulel *rl = interp.default_lhs($$->l, $3); - try { interp.add_rules($$->rl, rl, true); } - catch (err &e) { delete rl; interp.error(yyloc, e.what()); } } + rulel *rl = 0; + try { + rl = interp.default_lhs($$->l, $3); + interp.add_rules($$->rl, rl, true); + } + catch (err &e) { if (rl) delete rl; interp.error(yyloc, e.what()); } } ; /* Same for simple rules (pattern binding in 'when' clauses, no guards). */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |