Author: fperrad
Date: Mon May 21 00:50:43 2007
New Revision: 18607

Modified:
   trunk/languages/lua/luac.pir
   trunk/languages/lua/src/ASTGrammar.tg
   trunk/languages/lua/src/lua51.pg
   trunk/languages/lua/src/lua51.pir

Log:
[Lua]
- improve PAST generation

Modified: trunk/languages/lua/luac.pir
==============================================================================
--- trunk/languages/lua/luac.pir        (original)
+++ trunk/languages/lua/luac.pir        Mon May 21 00:50:43 2007
@@ -1,3 +1,5 @@
+# Copyright (C) 2006-2007, The Perl Foundation.
+# $Id$
 
 =head1 NAME
 
@@ -5,7 +7,11 @@
 
 =head1 SYNOPSIS
 
- TODO
+  $ parrot luac.pbc script.lua
+  $ parrot luac.pbc --target=parse script.lua
+                             PAST
+                             POST
+                             PIR
 
 =head1 DESCRIPTION
 
@@ -13,57 +19,14 @@
 
 =cut
 
-
 .sub 'main' :main
     .param pmc args
-
     load_bytecode 'languages/lua/src/lua51.pbc'
     load_bytecode 'PGE/Dumper.pbc'
-
-    # Register the Lua compiler
     $P0 = compreg 'Lua'
-
-    # set up a global variable to keep track of syntax errors
-    .local pmc errs
-    errs = new .Integer
-    set_root_global 'errors', errs
-
-    $P1 = $P0.'command_line'(args)
-
-    if errs > 0 goto ERR_MSG
-    print "Parse successful!\n"
-    .return($P1)
-
-  ERR_MSG:
-    if errs == 1 goto ONE_ERROR
-    printerr "There were"
-    printerr errs
-    printerr " errors.\n"
-    end
-
-  ONE_ERROR:
-    printerr "There was 1 error.\n"
-    end
-
+    $P0.'command_line'(args)
 .end
 
-.namespace
-
-.sub 'listmaker'
-    .param pmc args            :slurpy
-    unless null args goto have_args
-    args = new .ResizablePMCArray
-  have_args:
-    .return (args)
-.end
-
-=head1 LICENSE
-
-Copyright (C) 2007, The Perl Foundation.
-
-This is free software; you may redistribute it and/or modify
-it under the same terms as Parrot.
-
 =head1 AUTHOR
 
 Klaas-Jan Stol <[EMAIL PROTECTED]>

Modified: trunk/languages/lua/src/ASTGrammar.tg
==============================================================================
--- trunk/languages/lua/src/ASTGrammar.tg       (original)
+++ trunk/languages/lua/src/ASTGrammar.tg       Mon May 21 00:50:43 2007
@@ -16,355 +16,331 @@
 
 transform past (ROOT) :language('PIR') {
     .local pmc past
-    past = new 'PAST::Block'
-    past.'init'('node'=>node, 'name'=>'anon')
-    .local pmc blocknode, blockpast
-    blocknode = node['block']
-    blockpast = tree.'get'('past', blocknode, 'Lua::Grammar::block')
-    past.'push'(blockpast)
-    .return (past)
+    $P0 = node['block']
+    past = tree.'get'('past', $P0, 'Lua::Grammar::block')
+    .return past.'new'('PAST::Block', past, 'node'=>node, 'name'=>'anon')
 }
 
 transform past (Lua::Grammar::block) :language('PIR') {
     .local pmc past
     past = new 'PAST::Stmts'
     past.'init'('node'=>node)
-    .local pmc iter
     $P0 = node['statement']
-    if null $P0 goto iter_end
+    if null $P0 goto L1
+    .local pmc iter
     iter = new .Iterator, $P0
-  iter_loop:
-    unless iter goto iter_end
-    .local pmc cnode, cpast
-    cnode = shift iter
-    cpast = tree.'get'('past', cnode, 'Lua::Grammar::statement')
-    past.'push'(cpast)
-    goto iter_loop
-  iter_end:
-
+L2:
+    unless iter goto L1
+    $P0 = shift iter
+    $P1 = tree.'get'('past', $P0, 'Lua::Grammar::statement')
+    past.'push'($P1)
+    goto L2
+L1:
     $P0 = node['last_statement']
-    if null $P0 goto no_last_stat
+    if null $P0 goto L3
+    $P0 = shift $P0
     $P1 = tree.'get'('past', $P0, 'Lua::Grammar::last_statement')
     past.'push'($P1)
-  no_last_stat:
+L3:
     .return (past)
 }
 
 transform past (Lua::Grammar::statement) :language('PIR') {
     $S0 = node.'find_key'()
     $P0 = node[$S0]
-    #printerr $S0
     $S0 = concat 'Lua::Grammar::', $S0
     .return tree.'get'('past', $P0, $S0)
 }
 
 transform past (Lua::Grammar::last_statement) :language('PIR') {
-    .local pmc past, cnode
-
-  returnstat:
-    cnode = node['return']
-    if null cnode goto breakstat
-
-    .local pmc exprpast
-    past = new 'PAST::Op'
-    past.'init'('node'=>cnode, 'pasttype'=>'pirop', 'pirop'=>'return')
-
-    cnode = node['expression_list']
-    if null cnode goto no_return_values
-    exprpast = tree.'get'('past', cnode, 'Lua::Grammar::expression_list')
-    #past.'push'(exprpast)
-
-  no_return_values:
-    .return (past)
-
-  breakstat:
-    cnode = node['break']
-    if null cnode goto no_stat
-    past = new 'PAST::Op'
-    past.'init'('node'=>node, 'pasttype'=>'pirop', 'pirop'=>'goto')
-    .return (past)
-
-  no_stat:
-    internal_error("no last statement")
+    $S0 = node.'find_key'()
+    $P0 = node[$S0]
+    $S1 = concat 'Lua::Grammar::', $S0
+    .return tree.'get'('past', $P0, $S1)
 }
 
 transform past (Lua::Grammar::if_stat) :language('PIR') {
-    .local pmc past
-
-    # create the PAST node for an if statement
-    past = new 'PAST::Op'
-    past.'init'('node'=>node, 'pasttype'=>'if')
-
-    .local pmc condnode, condpast
-    # get the PAST node for the condition
-    condnode = node['expression']
-    condpast = tree.'get'('past', condnode, 'Lua::Grammar::expression')
-    past.'push'(condpast)
-
-    .local pmc ifnode, ifpast
-    # get the PAST node for the if block
-    ifnode = node['block']
-    ifpast = tree.'get'('past', ifnode, 'Lua::Grammar::block')
-    past.'push'(ifpast)
-
-    .local pmc elseifnode, elseifpast
-    # get the elseifblock nodes
-    elseifnode = node['elseif_block']
-    if null elseifnode goto skip_elseifs
-    elseifpast = tree.'get'('past', elseifnode, 'Lua::Grammar::elseif_block')
-    past.'push'(elseifpast)
-
-  skip_elseifs:
-    .local pmc elsenode, elsepast
-    # get the elseblock nodes
-    elsenode = node['else_block']
-    if null elsenode goto skip_else
-    elsepast = tree.'get'('past', elsenode, 'Lua::Grammar::block')
-    past.'push'(elsepast)
-
-  skip_else:
-    .return (past)
-}
-
-transform past (Lua::Grammar::elseif_block) :language('PIR') {
-    .local pmc past, iter
-
+    .local pmc past, cpast
+    $P0 = node['expression']
+    $P1 = tree.'get'('past', $P0, 'Lua::Grammar::expression')
+    past = $P1.'new'('PAST::Op', $P1, 'node'=>node, 'pasttype'=>'if')
+    $P0 = node['block']
+    $P1 = tree.'get'('past', $P0, 'Lua::Grammar::block')
+    past.'push'($P1)
+    cpast = past
     $P0 = node['elseif_block']
+    if null $P0 goto L1
+    .local pmc iter
     iter = new .Iterator, $P0
-  iter_loop:
-    unless iter goto iter_end
-    .local pmc cnode, cpast
-    cnode = shift iter
-    cpast = tree.'get'('past', cnode, 'Lua::Grammar::elseif_block')
-    past.'push'(cpast)
-    goto iter_loop
-  iter_end:
-
+L2:
+    unless iter goto L1
+    $P0 = shift iter
+    $P1 = tree.'get'('past', $P0, 'Lua::Grammar::elseif_block')
+    cpast.'push'($P1)
+    cpast = $P1
+    goto L2
+L1:
+    $P0 = node['else_block']
+    if null $P0 goto L3
+    $P0 = shift $P0
+    $P1 = tree.'get'('past', $P0, 'Lua::Grammar::else_block')
+    cpast.'push'($P1)
+L3:
     .return (past)
 }
 
 transform past (Lua::Grammar::elseif_block) :language('PIR') {
     .local pmc past
-
     past = new 'PAST::Op'
     past.'init'('node'=>node, 'pasttype'=>'if')
-
-    .local pmc condnode, condpast
-    condnode = node['expression']
-    condpast = tree.'get'('past', condnode, 'Lua::Grammar::expression')
-    past.'push'(condpast)
-
-    .local pmc ifnode, ifpast
-    ifnode = node['block']
-    ifpast = tree.'get'('past', ifnode, 'Lua::Grammar::block')
-    past.'push'(ifpast)
-
+    $P0 = node['expression']
+    $P1 = tree.'get'('past', $P0, 'Lua::Grammar::expression')
+    past.'push'($P1)
+    $P0 = node['block']
+    $P1 = tree.'get'('past', $P0, 'Lua::Grammar::block')
+    past.'push'($P1)
     .return (past)
 }
 
-transform past (Lua::Grammar::local_stat) :language('PIR') {
-    .local pmc past
-    past = new 'PAST::Var'
-    past.'init'('node'=>node)
-    .return (past)
+transform past (Lua::Grammar::else_block) :language('PIR') {
+    $S0 = node.'find_key'()
+    $P0 = node[$S0]
+    $S1 = concat 'Lua::Grammar::', $S0
+    .return tree.'get'('past', $P0, $S1)
 }
 
 transform past (Lua::Grammar::while_stat) :language('PIR') {
     .local pmc past
-    past = new 'PAST::Op'
-    past.'init'('node'=>node, 'pasttype'=>'while')
-
-    .local pmc condnode, condpast
-    condnode = node['expression']
-    condpast = tree.'get'('past', condnode, 'Lua::Grammar::expression')
-    past.'push'(condpast)
-
-    .local pmc blocknode, blockpast
-    blocknode = node['block']
-    blockpast = tree.'get'('past', blocknode, 'Lua::Grammar::block')
-    past.'push'(blockpast)
-
+    $P0 = node['expression']
+    past = tree.'get'('past', $P0, 'Lua::Grammar::expression')
+    past.'new'('PAST::Op', past, 'node'=>node, 'pasttype'=>'while')
+    $P0 = node['block']
+    $P1 = tree.'get'('past', $P0, 'Lua::Grammar::block')
+    past.'push'($P1)
     .return (past)
 }
 
 transform past (Lua::Grammar::repeat_stat) {
-    .local pmc past
-    past = new 'PAST::Op'
-    past.'init'('node'=>node)
+    internal_error("not implemented (repeat)")
+}
 
-    .local pmc exprnode, exprpast
-    exprnode = node['expression']
-    exprpast = tree.'get'('past', exprnode, 'Lua::Grammar::expression')
-
-    .local pmc blocknode, blockpast
-    blocknode = node['block']
-    blockpast = tree.'get'('past', blocknode, 'Lua::Grammar::block')
-    past.'push'(blockpast)
+transform past (Lua::Grammar::for_stat) :language('PIR') {
+    $S0 = node.'find_key'()
+    $P0 = node[$S0]
+    $S1 = concat 'Lua::Grammar::', $S0
+    .return tree.'get'('past', $P0, $S1)
+}
 
-    .return (past)
+transform past (Lua::Grammar::fornum) :language('PIR') {
+    internal_error("not implemented (fornum)")
 }
 
-transform past (Lua::Grammar::for_stat) :language('PIR') {
+transform past (Lua::Grammar::forlist) :language('PIR') {
+    internal_error("not implemented (forlist)")
+}
+
+transform past (Lua::Grammar::local_stat) :language('PIR') {
+    $S0 = node.'find_key'()
+    $P0 = node[$S0]
+    $S1 = concat 'Lua::Grammar::', $S0
+    .return tree.'get'('past', $P0, $S1)
+}
+
+transform past (Lua::Grammar::local_declaration) :language('PIR') {
+    .local pmc namelist, explist
+    $P0 = node['name']
+    new namelist, .ResizablePMCArray
+    .local pmc iter
+    iter = new .Iterator, $P0
+L1:
+    unless iter goto L2
+    $P0 = shift iter
+    $S0 = $P0.'result_object'()
     .local pmc past
-  fornum:
-    $P0 = node['fornum']
-    if null $P0 goto forlist
-    past = tree.'get'('past', $P0, 'Lua::Grammar::fornum')
-  forlist:
-    $P0 = node['forlist']
-    past = tree.'get'('past', $P0, 'Lua::Grammar::forlist')
-    .return (past)
+    past = new 'PAST::Var'
+    past.'init'('node'=>node, 'name'=>$S0, 'scope'=>'lexical', 'ismy'=>1)
+    push namelist, past
+    goto L1
+L2:
+    $P0 = node['expression_list']
+    if null $P0 goto L3
+    $P0 = shift $P0
+    explist = tree.'get'('explist', $P0, 'Lua::Grammar::expression_list')
+L3:
+    unless null explist goto L4
+    new explist, .ResizablePMCArray
+L4:
+    .return tree.'assigns'(node, namelist, explist)
 }
 
-transform past (Lua::Grammar::fornum) :language('PIR') {
+transform past (Lua::Grammar::local_function) :language('PIR') {
+    .local pmc past
+    $P0 = node['function_body']
+    past = tree.'get'('past', $P0, 'Lua::Grammar::function_body')
+    $P0 = node['name']
+    $S0 = $P0.'result_object'()
+    past.'name'($S0)
+    $P0 = past.'new'('PAST::Var', 'node'=>$P0, 'name'=>$S0, 
'scope'=>'lexical', 'ismy'=>1)
+    .return past.'new'('PAST::Op', $P0, past, 'node'=>node, 
'pasttype'=>'assign')
+}
+
+transform past (Lua::Grammar::return_statement) :language('PIR') {
     .local pmc past
     past = new 'PAST::Op'
-    past.'init'('node'=>node)
+    $P0 = node['expression_list']
+    if null $P0 goto L1
+    $P0 = shift $P0
+    $P1 = tree.'get'('explist', $P0, 'Lua::Grammar::expression_list')
+    past.'init'($P1 :flat, 'node'=>node, 'pasttype'=>'pirop', 
'pirop'=>'return')
+    .return (past)
+L1:
+    past.'init'('node'=>node, 'pasttype'=>'pirop', 'pirop'=>'return')
     .return (past)
 }
 
-transform past (Lua::Grammar::forlist) :language('PIR') {
+transform past (Lua::Grammar::break_statement) :language('PIR') {
     .local pmc past
     past = new 'PAST::Op'
-    #past.'init'('node'=>node)
+    past.'init'('node'=>node, 'pasttype'=>'pirop', 'pirop'=>'goto')
     .return (past)
 }
 
-
 transform past (Lua::Grammar::expression_stat) :language('PIR') {
-    .local pmc past, primpast
-    past = new 'PAST::Op'
+    $P0 = node['assignment']
+    unless null $P0 goto L1
     $P0 = node['primary_expression']
-    primpast = tree.'get'('past', $P0, 'Lua::Grammar::primary_expression')
-    past.'push'(primpast)
+    .return tree.'get'('past', $P0, 'Lua::Grammar::primary_expression')
+L1:
+    .local pmc varlist, explist
+    $P0 = shift $P0
+    explist = tree.'get'('explist', $P0, 'Lua::Grammar::assignment')
+    varlist = tree.'get'('varlist', $P0, 'Lua::Grammar::assignment')
+    $P0 = node['primary_expression']
+    $P1 = tree.'get'('past', $P0, 'Lua::Grammar::primary_expression')
+    unshift varlist, $P1
+    .return tree.'assigns'(node, varlist, explist)
+}
 
-  assignment:
-    .local pmc assignpast
+transform varlist (Lua::Grammar::assignment) :language('PIR') {
+    $P0 = node['expression_list']
+    if null $P0 goto L1
+    new $P0, .ResizablePMCArray
+    .return ($P0)
+L1:
     $P0 = node['assignment']
-    if null $P0 goto function_call
-    assignpast = tree.'get'('past', $P0, 'Lua::Grammar::assignment')
-    past.'push'(assignpast)
-
-  function_call:
-
-    .local pmc callnode, callpast
-    callnode = node['function_args']
-    if null callnode goto no_funcargs
-    callpast = tree.'get'('past', callnode, 'Lua::Grammar::function_args')
-    if null callpast goto no_funcargs
-    .return (past)
-
-  no_funcargs:
-    .return (past)
+    $P1 = tree.'get'('varlist', $P0, 'Lua::Grammar::assignment')
+    $P0 = node['primary_expression']
+    $P2 = tree.'get'('past', $P0, 'Lua::Grammar::primary_expression')
+    unshift $P1, $P2
+    .return ($P1)
 }
 
-transform past (Lua::Grammar::assignment) :language('PIR') {
+transform explist (Lua::Grammar::assignment) :language('PIR') {
     $P0 = node['expression_list']
-
-    if null $P0 goto more_expr
-    .return tree.'get'('past', $P0, 'Lua::Grammar::expression_list')
-  more_expr:
-    internal_error("Not implemented")
-
+    if null $P0 goto L1
+    .return tree.'get'('explist', $P0, 'Lua::Grammar::expression_list')
+L1:
+    $P0 = node['assignment']
+    .return tree.'get'('explist', $P0, 'Lua::Grammar::assignment')
 }
 
-transform past (Lua::Grammar::function_args) :language('PIR') {
-    #printerr "function_args\n"
-    node = node[0]
-    $S0 = node.'find_key'()
-    $P0 = node[$S0]
-    $S0 = concat 'Lua::Grammar::', $S0
-    .return tree.'get'('past', $P0, $S0)
+transform explist (Lua::Grammar::function_args) :language('PIR') {
+    .local pmc explist, past
+    $P0 = node['constructor']
+    if null $P0 goto L1
+    past = tree.'get'('past', $P0, 'Lua::Grammar::constructor')
+    new explist, .ResizablePMCArray
+    push explist, past
+    .return (explist)
+L1:
+    $P0 = node['string']
+    if null $P0 goto L2
+    past = tree.'get'('past', $P0, 'Lua::Grammar::string')
+    new explist, .ResizablePMCArray
+    push explist, past
+    .return (explist)
+L2:
+    $P0 = node['expression_list']
+    unless null $P0 goto L3
+    new explist, .ResizablePMCArray
+    .return (explist)
+L3:
+    $P0 = shift $P0
+    .return tree.'get'('explist', $P0, 'Lua::Grammar::expression_list')
 }
 
 transform past (Lua::Grammar::function_stat) :language('PIR') {
-    .local pmc past
-    past = new 'PAST::Op'
-    past.'init'('node'=>node, 'pasttype'=>'bind')
-
-    .local pmc namenode, namepast
-    namenode = node['functionname']
-    namepast = tree.'get'('past', namenode, 'Lua::Grammar::functionname')
-    past.'push'(namepast)
-
-    .local pmc bodynode, bodypast
-    bodynode = node['function_body']
-    bodypast = tree.'get'('past', bodynode, 'Lua::Grammar::function_body')
-    past.'push'(bodypast)
-    .return (past)
+    .local pmc past, pastb
+    $P0 = node['functionname']
+    past = tree.'get'('past', $P0, 'Lua::Grammar::functionname')
+    $P0 = node['function_body']
+    pastb = tree.'get'('past', $P0, 'Lua::Grammar::function_body')
+    $S0 = past.'name'()
+    pastb.'name'($S0)
+    .return past.'new'('PAST::Op', past, pastb, 'node'=>node, 
'pasttype'=>'assign')
 }
 
 transform past (Lua::Grammar::functionname) :language('PIR') {
-    $P0 = node['name']
-    $P0 = $P0[0] #hack!
-    .return tree.'get'('past', $P0, 'Lua::Grammar::name')
-}
-
-
-# past (Lua::Grammar::body)
-#
-# Store each of the instructions in a body node in a PAST::Stmts node.
-#
-transform past (Lua::Grammar::function_body) :language('PIR') {
-    .local pmc past
-    past = new 'PAST::Block'
-    past.'init'('node'=>node)
-    #printerr "function body\n"
-    # handle parameters
-
-    # handle block
-    .local pmc blocknode, blockpast
-    blocknode = node['block']
-    blockpast = tree.'get'('past', blocknode, 'Lua::Grammar::block')
-    past.'push'(blockpast)
-
-    .return (past)
-}
-
-transform past (Lua::Grammar::name) :language('PIR') {
     .local pmc past
-    $S0 = node
+    # INCOMPLETE
+    $P0 = node['name']
+    $P0 = shift $P0
+    $S0 = $P0.'result_object'()
     past = new 'PAST::Var'
     past.'init'('node'=>node, 'name'=>$S0, 'scope'=>'package')
     .return (past)
 }
 
-transform past (Lua::Grammar::constructor) :language('PIR') {
-    .local pmc past
-    past = new 'PAST::Var'
-    past.'init'('node'=>node)
-    .return (past)
+transform past (Lua::Grammar::function_body) :language('PIR') {
+    .local pmc past, parlist
+    new parlist, .ResizablePMCArray
+    $P0 = node['parameter_list']
+    if null $P0 goto L1
+    $P0 = shift $P0
+    $P1 = $P0['name_list']
+    if null $P1 goto L2
+    $P1 = $P1['name']
+    .local pmc iter
+    new iter, .Iterator, $P1
+L3:
+    unless iter goto L2
+    $P1 = shift iter
+    $S0 = $P1.'result_object'()
+    new $P2, 'PAST::Var'
+    $P2.'init'('node'=>$P1, 'name'=>$S0, 'scope'=>'parameter')
+    push parlist, $P2
+    goto L3
+L2:
+    $P1 = $P0['vararg']
+    if null $P1 goto L1
+    $P1 = shift $P1
+    new $P2, 'PAST::Var'
+    $P2.'init'('node'=>$P1, 'name'=>'vararg', 'scope'=>'parameter', 
'isslurpy'=>1)
+    push parlist, $P2
+L1:
+    $P0 = node['block']
+    past = tree.'get'('past', $P0, 'Lua::Grammar::block')
+    .return past.'new'('PAST::Block', parlist :flat, past, 'node'=>node)
 }
 
-transform past (Lua::Grammar::expression_list) :language('PIR') {
-    .local pmc past
-    past = new 'PAST::Op'
-    past.'init'('node'=>node, 'name'=>'listmaker')
-    .local pmc expriter
-
-    #$S0 = node.'find_key'()
-    #printerr $S0
-
-    $P0 = node['expression_list']
+transform past (Lua::Grammar::constructor) :language('PIR') {
+    internal_error("not implemented (constructor)")
+}
 
-    if null $P0 goto error
-    #printerr $S0
-    #printerr "\n"
-
-    $P0 = $P0['expression']
-    expriter = new .Iterator, $P0
-
-  iter_loop:
-    unless expriter goto iter_end
-    .local pmc enode, epast
-    enode = shift expriter
-    epast = tree.'get'('past', enode, 'Lua::Grammar::expression')
-    past.'push'(epast)
-    goto iter_loop
-  iter_end:
-    .return (past)
-  error:
-    internal_error("null access in expr list")
+transform explist (Lua::Grammar::expression_list) :language('PIR') {
+    .local pmc explist
+    new explist, .ResizablePMCArray
+    $P0 = node['expression']
+    .local pmc iter
+    iter = new .Iterator, $P0
+L1:
+    unless iter goto L2
+    $P0 = shift iter
+    $P1 = tree.'get'('past', $P0, 'Lua::Grammar::expression')
+    push explist, $P1
+    goto L1
+L2:
+    .return (explist)
 }
 
 transform past (Lua::Grammar::expression) :language('PIR') {
@@ -372,109 +348,127 @@
     .return tree.'get'('past', $P0, 'Lua::Grammar::expr')
 }
 
-
 transform past (Lua::Grammar::expr) :language('PIR') {
     .local string type
     type = node['type']
-
-    if type == 'term:' goto past_term
-
+    unless type == 'term:' goto L1
+    $S0 = node.'find_key'()
+    $P0 = node[$S0]
+    $S0 = concat 'Lua::Grammar::', $S0
+    .return tree.'get'('past', $P0, $S0)
+L1:
     .local pmc optable, optok
-    .local string pasttype, pirop, returns
-    .local int islvalue
+    .local string pirop, returns
     optable = get_hll_global [ 'Lua::Grammar' ], '$optable'
     optok = optable[type]
-    pasttype = optok['past']
     pirop = optok['pirop']
-    returns = optok['returns']
-    islvalue = optok['lvalue']
-
-    .local pmc past, iter
+    .local pmc past
     past = new 'PAST::Op'
-    past.'init'('node'=>node, 'name'=>type, 'pasttype'=>pasttype, 
'pirop'=>pirop, 'returns'=>returns)
-
+    if pirop == '' goto L2
+    returns = optok['returns']
+    past.'init'('node'=>node, 'name'=>type, 'pasttype'=>'pirop', 
'pirop'=>pirop, 'returns'=>returns)
+    goto L3
+L2:
+    $S0 = optok['past']
+    past.'init'('node'=>node, 'name'=>type, 'pasttype'=>$S0)
+L3:
     $P0 = node.'get_array'()
-    if null $P0 goto iter_end
+    .local pmc iter
     iter = new .Iterator, $P0
-    unless iter goto iter_end
-    $P0[0;'islvalue'] = islvalue
-
-  iter_loop:
-    .local pmc cnode, cpast
-    cnode = shift iter
-    cpast = tree.'get'('past', cnode, 'Lua::Grammar::expr')
-    if null cpast goto iter_loop
-    past.'push'(cpast)
-    if iter goto iter_loop
-  iter_end:
+L5:
+    unless iter goto L4
+    $P0 = shift iter
+    $P1 = tree.'get'('past', $P0, 'Lua::Grammar::expr')
+    past.'push'($P1)
+    goto L5
+L4:
     .return (past)
+}
+
 
-  past_term:
+transform past (Lua::Grammar::simple_expression) :language('PIR') {
     $S0 = node.'find_key'()
     $P0 = node[$S0]
     $S0 = concat 'Lua::Grammar::', $S0
     .return tree.'get'('past', $P0, $S0)
 }
 
+transform past (Lua::Grammar::primary_expression) :language('PIR') {
+    .local pmc past
+    # INCOMPLETE
+    $P0 = node['function_args']
+    unless null $P0 goto L1
+    $S0 = node.'find_key'()
+    $P0 = node[$S0]
+    $S0 = concat 'Lua::Grammar::', $S0
+    .return tree.'get'('past', $P0, $S0)
+L1:
+    $P0 = shift $P0
+    $P1 = tree.'get'('explist', $P0, 'Lua::Grammar::function_args')
+    $P0 = node['prefix_expression']
+    past = tree.'get'('past', $P0, 'Lua::Grammar::prefix_expression')
+    .return past.'new'('PAST::Op', past, $P1 :flat, 'node'=>node, 
'pasttype'=>'call')
+}
 
-transform past (Lua::Grammar::simple_expression) :language('PIR') {
+transform past (Lua::Grammar::prefix_expression) :language('PIR') {
     $S0 = node.'find_key'()
     $P0 = node[$S0]
     $S0 = concat 'Lua::Grammar::', $S0
     .return tree.'get'('past', $P0, $S0)
 }
 
-transform past (Lua::Grammar::number) :language('PIR') {
+transform past (Lua::Grammar::name) :language('PIR') {
     .local pmc past
-    past = new 'PAST::Val'
-    past.'init'('node'=>node, 'vtype'=>'.LuaNumber', 'name'=>node, 
'ctype'=>'i+')
+    $S0 = node
+    past = new 'PAST::Var'
+    past.'init'('node'=>node, 'name'=>$S0, 'scope'=>'package')
     .return (past)
 }
 
 transform past (Lua::Grammar::nil) :language('PIR') {
     .local pmc past
-    past = new 'PAST::Val'
-    past.'init'('node'=>node, 'vtype'=>'.Undef', 'name'=>node)
+    new past, 'PAST::Val'
+    past.'init'('node'=>node, 'vtype'=>'.LuaNil')
     .return (past)
 }
 
-transform past (Lua::Grammar::primary_expression) :language('PIR') {
-    $S0 = node.'find_key'()
-    $P0 = node[$S0]
-    $S0 = concat 'Lua::Grammar::', $S0
-    .return tree.'get'('past', $P0, $S0)
+transform past (Lua::Grammar::true) :language('PIR') {
+    .local pmc past
+    new past, 'PAST::Val'
+    past.'init'('node'=>node, 'vtype'=>'.LuaBoolean', 'name'=>1)
+    .return (past)
 }
 
-transform past (Lua::Grammar::prefix_expression) :language('PIR') {
-    $S0 = node.'find_key'()
-    $P0 = node[$S0]
-    $S0 = concat 'Lua::Grammar::', $S0
-    .return tree.'get'('past', $P0, $S0)
+transform past (Lua::Grammar::false) :language('PIR') {
+    .local pmc past
+    new past, 'PAST::Val'
+    past.'init'('node'=>node, 'vtype'=>'.LuaBoolean', 'name'=>0)
+    .return (past)
 }
 
-transform past (Lua::Grammar::string) :language('PIR') {
-    .local pmc result
-    result = new 'PAST::Val'
+transform past (Lua::Grammar::number) :language('PIR') {
+    .local pmc past
+    new past, 'PAST::Val'
+    $S0 = node.'result_object'()
+    past.'init'('node'=>node, 'vtype'=>'.LuaNumber', 'name'=>$S0, 
'ctype'=>'n+')
+    .return (past)
+}
 
-  quoted_literal:
-    $P0 = node['quoted_literal']
-    if null $P0 goto long_string
-    $S0 = $P0
-    result.'init'('node'=>node, 'vtype'=>'.String', 'name'=>$S0)
-    .return (result)
-  long_string:
-    $P0 = node['long_string']
-    if null $P0 goto error
-    $S0 = $P0
-    result.'init'('node'=>node, 'vtype'=>'.String', 'name'=>$S0)
-    .return (result)
-  error:
-    internal_error("Unknown string")
+transform past (Lua::Grammar::string) :language('PIR') {
+    $S0 = node.'find_key'()
+    $P0 = node[$S0]
+    $S1 = $P0.'result_object'()
+    .local pmc past
+    new past, 'PAST::Val'
+    past.'init'('node'=>node, 'vtype'=>'.LuaString', 'name'=>$S1, 
'ctype'=>'s~')
+    .return (past)
 }
 
 =head1 AUTHORS
 
 Klaas-Jan Stol <[EMAIL PROTECTED]>
 
+Francois Perrad
+
 =cut
 

Modified: trunk/languages/lua/src/lua51.pg
==============================================================================
--- trunk/languages/lua/src/lua51.pg    (original)
+++ trunk/languages/lua/src/lua51.pg    Mon May 21 00:50:43 2007
@@ -30,9 +30,9 @@
   | <do_block>
   | <for_stat>
   | <repeat_stat>
+  | <function_stat>
   | <local_stat>
   | <expression_stat>
-  | <function_stat>
 }
 
 rule function_stat {
@@ -40,8 +40,16 @@
 }
 
 rule last_statement {
-  | (<'return'>) <expression_list>?
-  | (<'break'>)
+  | <return_statement>
+  | <break_statement>
+}
+
+rule return_statement {
+  <'return'> <expression_list>?
+}
+
+token break_statement {
+  <'break'>
 }
 
 rule do_block {
@@ -49,7 +57,7 @@
 }
 
 rule local_stat {
-  <local_function> | <local_declaration>
+  <'local'> [ <local_function> | <local_declaration> ]
 }
 
 rule expression_stat {
@@ -98,11 +106,11 @@
 }
 
 rule local_declaration {
-  <'local'> <name> [ <','> <name> ]* [ <'='> <expression_list> ]?
+  <name> [ <','> <name> ]* [ <'='> <expression_list> ]?
 }
 
 rule local_function {
-  <'local'> <'function'> <name> <function_body>
+  <'function'> <name> <function_body>
 }
 
 rule functionname {
@@ -134,8 +142,8 @@
 }
 
 rule parameter_list {
-  | <name_list> [ <','> <'...'> ]?
-  | <'...'>
+  | <name_list> [ <','> <vararg> ]?
+  | <vararg>
 }
 
 rule function_body {
@@ -173,10 +181,10 @@
 rule simple_expression {
   | <number>
   | <string>
-  | <'nil'>
-  | <'true'>
-  | <'false'>
-  | <'...'>
+  | <nil>
+  | <true>
+  | <false>
+  | <vararg>
   | <constructor>
   | <'function'> <function_body>
   | <primary_expression>
@@ -191,35 +199,50 @@
 
 rule 'expression'   is optable { ... }
 
-proto 'term:'       is precedence('=')      is parsed(&simple_expression) { 
... }
-
-proto 'infix:^'     is looser('term:')
-                    is assoc('right')           { ... }
-
-proto 'prefix:not'  is looser('infix:^')    is pirop('not')      { ... }
-proto 'prefix:#'    is equiv('prefix:not')  is pirop('elements') { ... } # 
does this work?? it needs an I register
-proto 'prefix:-'    is equiv('prefix:not')  is pirop('neg')      { ... }
-
-proto 'infix:*'     is looser('prefix:not') is pirop('mul') { ... }
-proto 'infix:/'     is equiv('infix:*')     is pirop('div') { ... }
-proto 'infix:%'     is equiv('infix:*')     is pirop('mod') { ... }
+proto 'term:'       is precedence('=')
+                    is parsed(&simple_expression)              { ... }
 
-proto 'infix:+'     is looser('infix:*')    is pirop('add') { ... }
-proto 'infix:-'     is equiv('infix:+')     is pirop('sub') { ... }
+proto 'infix:^'     is looser('term:')      is pirop('pow')     is 
assoc('right')
+                    is returns('.LuaNumber')                    { ... }
 
-proto 'infix:..'    is looser('infix:+')    is pirop('concat')
-                    is assoc('right')           { ... }
+proto 'prefix:not'  is looser('infix:^')    is pirop('not')
+                    is returns('.LuaBoolean')                   { ... }
+proto 'prefix:#'    is equiv('prefix:not')  is pirop('len')
+                    is returns('.LuaNumber')                    { ... }
+proto 'prefix:-'    is equiv('prefix:not')  is pirop('neg')
+                    is returns('.LuaNumber')                    { ... }
+
+proto 'infix:*'     is looser('prefix:not') is pirop('mul')
+                    is returns('.LuaNumber')                    { ... }
+proto 'infix:/'     is equiv('infix:*')     is pirop('div')
+                    is returns('.LuaNumber')                    { ... }
+proto 'infix:%'     is equiv('infix:*')     is pirop('mod')
+                    is returns('.LuaNumber')                    { ... }
+
+proto 'infix:+'     is looser('infix:*')    is pirop('add')
+                    is returns('.LuaNumber')                    { ... }
+proto 'infix:-'     is equiv('infix:+')     is pirop('sub')
+                    is returns('.LuaNumber')                    { ... }
+
+proto 'infix:..'    is looser('infix:+')    is pirop('concat')  is 
assoc('right')
+                    is returns('.LusString')                    { ... }
+
+proto 'infix:<'     is looser('infix:..')   is pirop('islt')
+                    is returns('.LuaBoolean')                   { ... }
+proto 'infix:>'     is equiv('infix:<')     is pirop('isgt')
+                    is returns('.LuaBoolean')                   { ... }
+proto 'infix:<='    is equiv('infix:<')     is pirop('isle')
+                    is returns('.LuaBoolean')                   { ... }
+proto 'infix:>='    is equiv('infix:<')     is pirop('isge')
+                    is returns('.LuaBoolean')                   { ... }
+proto 'infix:~='    is equiv('infix:<')     is pirop('isne')
+                    is returns('.LuaBoolean')                   { ... }
+proto 'infix:=='    is equiv('infix:<')     is pirop('iseq')
+                    is returns('.LuaBoolean')                   { ... }
 
-proto 'infix:<'     is looser('infix:..')       { ... }
-proto 'infix:>'     is equiv('infix:<')         { ... }
-proto 'infix:<='    is equiv('infix:<')         { ... }
-proto 'infix:>='    is equiv('infix:<')         { ... }
-proto 'infix:~='    is equiv('infix:<')         { ... }
-proto 'infix:=='    is equiv('infix:<')         { ... }
+proto 'infix:and'   is looser('infix:<')    is past('if')       { ... }
 
-proto 'infix:and'   is looser('infix:<')        { ... }
-
-proto 'infix:or'    is looser('infix:and')      { ... }
+proto 'infix:or'    is looser('infix:and')  is past('unless')   { ... }
 
 
 =head2 HELPER RULES
@@ -284,6 +307,21 @@
   | <long_string>
 }
 
+token nil {
+  <'nil'>
+}
+
+token true {
+  <'true'>
+}
+
+token false {
+  <'false'>
+}
+
+token vararg {
+  <'...'>
+}
 
 token ws {
     [ \s+

Modified: trunk/languages/lua/src/lua51.pir
==============================================================================
--- trunk/languages/lua/src/lua51.pir   (original)
+++ trunk/languages/lua/src/lua51.pir   Mon May 21 00:50:43 2007
@@ -666,6 +666,41 @@
     exit 1
 .end
 
+.namespace [ "TGE::Tree" ]
+
+.sub 'assigns' :method
+    .param pmc node
+    .param pmc namelist
+    .param pmc explist
+    .local pmc past
+    $I0 = namelist
+    unless $I0 == 1 goto L2
+    past = namelist[0]
+    $P0 = explist[0]
+    if $P0 goto L3
+    $P0 = past.'new'('PAST::Val', 'vtype'=>'.LuaNil')
+L3:
+    .return past.'new'('PAST::Op', past, $P0, 'node'=>node, 
'pasttype'=>'assign')
+L2:
+    new past, 'PAST::Stmts'
+    .local pmc iter
+    new iter, .Iterator, namelist
+L6:
+    unless iter goto L7
+    $P0 = shift iter
+    unless explist goto L8
+    $P1 = shift explist
+    goto L9
+L8:
+    $P1 = past.'new'('PAST::Val', 'vtype'=>'.LuaNil')
+L9:
+    $P2 = past.'new'('PAST::Op', $P0, $P1, 'node'=>node, 'pasttype'=>'assign')
+    past.'push'($P2)
+    goto L6
+L7:
+    .return (past)
+.end
+
 .include 'languages/lua/src/ASTGrammar.pir'
 .include 'languages/lua/src/lua51_grammar_gen.pir'
 

Reply via email to