Author: bernhard Date: Tue Feb 13 12:59:49 2007 New Revision: 16972 Modified: trunk/languages/plumhead/src/antlr3/Plumhead.g trunk/languages/plumhead/src/partridge/Plumhead.pg trunk/languages/plumhead/src/partridge/PlumheadPAST.tg
Log: [Plumhead partridge] Slightly nicer register names. Support for 'else' block. Modified: trunk/languages/plumhead/src/antlr3/Plumhead.g ============================================================================== --- trunk/languages/plumhead/src/antlr3/Plumhead.g (original) +++ trunk/languages/plumhead/src/antlr3/Plumhead.g Tue Feb 13 12:59:49 2007 @@ -95,7 +95,7 @@ : ECHO^ expression ';'! | IF '(' relational_expression ')' '{' s1=statements '}' ( ELSE '{' s2=statements '}' -> ^( IF relational_expression ^( STMTS $s1 ) ^( STMTS $s2 ) ) - | -> ^( IF relational_expression ^( STMTS $s1 ) ) + | -> ^( IF relational_expression ^( STMTS $s1 ) ) ) | CODE_END SEA CODE_START -> ^( ECHO NOQUOTE_STRING[$SEA] ) | SCALAR ASSIGN_OP^ expression ';'! Modified: trunk/languages/plumhead/src/partridge/Plumhead.pg ============================================================================== --- trunk/languages/plumhead/src/partridge/Plumhead.pg (original) +++ trunk/languages/plumhead/src/partridge/Plumhead.pg Tue Feb 13 12:59:49 2007 @@ -30,8 +30,9 @@ rule code { <?CODE_START> <statement>* <?CODE_END> } rule statement { <ECHO> <expression> ; - | <IF> <?PAREN_OPEN> <expression> <?PAREN_CLOSE> \{ <statement>* \} + | <IF> <?PAREN_OPEN> <expression> <?PAREN_CLOSE> \{ <statement>* \} <else_clause>? } +rule else_clause { <?ELSE> \{ <statement>* \} } token expression { <DOUBLEQUOTE_STRING> | <SINGLEQUOTE_STRING> | <adding_expression> } Modified: trunk/languages/plumhead/src/partridge/PlumheadPAST.tg ============================================================================== --- trunk/languages/plumhead/src/partridge/PlumheadPAST.tg (original) +++ trunk/languages/plumhead/src/partridge/PlumheadPAST.tg Tue Feb 13 12:59:49 2007 @@ -11,9 +11,9 @@ past = new 'PAST::Block' past.'init'( 'node' => node, 'name'=>'plumhead' ) - .local pmc cpast - cpast = tree.'get'('past', node, 'Plumhead::Grammar::program') - past.'push'(cpast) + .local pmc past_program + past_program = tree.'get'('past', node, 'Plumhead::Grammar::program') + past.'push'(past_program) .return (past) } @@ -73,31 +73,37 @@ iter = new .Iterator, $P0 iter_loop: unless iter goto iter_end - .local pmc cnode, cpast, cpast2, cpast3 + .local pmc cnode, past_expression, past_echo, past_if, past_if_block, past_else_block cnode = shift iter if null cnode goto iter_loop $P1 = cnode['ECHO'] if null $P1 goto no_echo $P2 = cnode['expression'] if null $P2 goto iter_loop - cpast = tree.'get'('past', $P2, 'Plumhead::Grammar::expression') - if null cpast goto iter_loop - cpast2 = new 'PAST::Op' - cpast2.'init'( cpast, 'node'=> node, 'name' => 'print' ) - past.'push'(cpast2) + past_expression = tree.'get'('past', $P2, 'Plumhead::Grammar::expression') + if null past_expression goto iter_loop + past_echo = new 'PAST::Op' + past_echo.'init'( past_expression, 'node'=> node, 'name' => 'print' ) + past.'push'(past_echo) goto iter_loop no_echo: $P1 = cnode['IF'] if null $P1 goto no_if $P2 = cnode['expression'] - if null $P2 goto iter_loop - cpast = tree.'get'('past', $P2, 'Plumhead::Grammar::expression') - if null cpast goto iter_loop - cpast3 = tree.'get'('past', cnode, 'Plumhead::Grammar::code') - cpast2 = new 'PAST::Op' - cpast2.'init'( cpast, cpast3, 'node'=> node, 'pasttype' => 'if' ) - past.'push'(cpast2) - goto iter_loop + past_expression = tree.'get'('past', $P2, 'Plumhead::Grammar::expression') + if null past_expression goto iter_loop + # past_if_block takes care of the <statement> + past_if_block = tree.'get'('past', cnode, 'Plumhead::Grammar::code') + past_if = new 'PAST::Op' + past_if.'init'( past_expression, past_if_block, 'node'=> node, 'pasttype' => 'if' ) + $P3 = cnode['else_clause'] + if null $P3 goto no_else_clause + $P4 = $P3[0] + past_else_block = tree.'get'('past', $P4, 'Plumhead::Grammar::code') + past_if.'push'(past_else_block) + no_else_clause: + past.'push'(past_if) + goto iter_loop no_if: goto iter_loop iter_end: @@ -188,9 +194,9 @@ $P2 = $P0['UNARY_MINUS'] if null $P2 goto no_minus past = new 'PAST::Op' - .local pmc cpast - cpast = tree.'get'('past', $P1, 'Plumhead::Grammar::expression') - past.init( cpast, 'node' => $P0, 'name' => 'prefix:-' ) + .local pmc past_expression + past_expression = tree.'get'('past', $P1, 'Plumhead::Grammar::expression') + past.init( past_expression, 'node' => $P0, 'name' => 'prefix:-' ) goto handled_expression no_minus: $P2 = $P1['expression']