Hi all, Trying to work through the tutorial (http://www.parrotblog.org/search/label/tutorial) and am trying to finish Episode 4 with catch blocks. The grammar in Episode 3 has this:
try-statement ::= 'try' block 'catch' identifier block 'end' I've translated it to this: rule try_statement { 'try' <block> 'catch' <identifier> $<catch_block>=<block> 'end' {*} } In searching through code, I've come up with this method for that: method try_statement($/) { my $try := $( $<block> ); my $identifier := $( $<identifier> ); my $catch := $( $<catch_block> ); my $past := PAST::Op.new( :pasttype('try'), :node($/) ); $past.push($try); # Create the catch my $catchpir := " .get_results (%r, $S0)\n store_lex '" ~ $identifier.name() ~ "', %r"; $catch.unshift( PAST::Op.new( :inline( $catchpir ) ) ); $past.push($catch); make $past; } However, when I try it with this: "try x=4 catch e y=2 end", my pir doesn't appear to have any logic to catch an exception (or I just know pir very well). Also, how do I know that the exception object is in $S0? My pir is below. Is this actually correct and all will become clear later? Cheers, Ovid .namespace .sub "_block10" push_eh catch_11 get_global $P15, "_block12" newclosure $P15, $P15 $P14 = $P15() pop_eh goto catch_11_end catch_11: get_global $P19, "_block16" newclosure $P19, $P19 $P19() catch_11_end: .return ($P14) .end .namespace .sub "_block16" :outer("_block10") .get_results ($P17, $S0) store_lex 'e', $P17 new $P18, "Integer" assign $P18, 2 set_global "y", $P18 .return ($P18) .end .namespace .sub "_block12" :outer("_block10") new $P13, "Integer" assign $P13, 4 set_global "x", $P13 .return ($P13) .end -- Buy the book - http://www.oreilly.com/catalog/perlhks/ Perl and CGI - http://users.easystreet.com/ovid/cgi_course/ Personal blog - http://publius-ovidius.livejournal.com/ Tech blog - http://use.perl.org/~Ovid/journal/