Author: fperrad
Date: Tue May 29 04:13:42 2007
New Revision: 18671

Modified:
   trunk/languages/lua/lua.pir
   trunk/languages/lua/src/PASTGrammar.tg
   trunk/languages/lua/src/POSTGrammar.tg
   trunk/languages/lua/src/lua51.pg
   trunk/languages/lua/src/lua51.pir

Log:
[Lua]
- PAST/POST (suite)

Modified: trunk/languages/lua/lua.pir
==============================================================================
--- trunk/languages/lua/lua.pir (original)
+++ trunk/languages/lua/lua.pir Tue May 29 04:13:42 2007
@@ -28,6 +28,20 @@
 
 .include 'languages/lua/src/lua51.pir'
 
+.HLL "Lua", "lua_group"
+
+.sub '__onload' :anon :init
+    load_bytecode 'languages/lua/lib/luabasic.pbc'
+    load_bytecode 'languages/lua/lib/luacoroutine.pir'
+    load_bytecode 'languages/lua/lib/luapackage.pbc'
+    load_bytecode 'languages/lua/lib/luastring.pir'
+    load_bytecode 'languages/lua/lib/luatable.pbc'
+    load_bytecode 'languages/lua/lib/luamath.pbc'
+    load_bytecode 'languages/lua/lib/luaio.pir'
+    load_bytecode 'languages/lua/lib/luaos.pbc'
+    load_bytecode 'languages/lua/lib/luadebug.pbc'
+.end
+
 =head1 SEE ALSO
 
 F<languages/lua/doc/status.pod>

Modified: trunk/languages/lua/src/PASTGrammar.tg
==============================================================================
--- trunk/languages/lua/src/PASTGrammar.tg      (original)
+++ trunk/languages/lua/src/PASTGrammar.tg      Tue May 29 04:13:42 2007
@@ -3,8 +3,8 @@
 
 =head1 NAME
 
-PASTGrammar.tg - A grammar for transforming the output of a PGE parse into
-an abstract syntax tree (PAST).
+PASTGrammar.tg - A grammar for transforming the output of a PGE parse
+into an abstract syntax tree (PAST).
 
 =head1 DESCRIPTION
 
@@ -18,9 +18,10 @@
     .local pmc past
     $P0 = node['block']
     past = tree.'get'('past', $P0, 'Lua::Grammar::block')
-    .return past.'new'('PAST::Block', past, 'node'=>node, 'name'=>'anon')
+    .return past.'new'('PAST::Block', past, 'node'=>node, 'name'=>'_main', 
'pragma'=>':anon :lex')
 }
 
+
 transform past (Lua::Grammar::block) :language('PIR') {
     .local pmc past
     past = new 'PAST::Stmts'
@@ -39,12 +40,13 @@
     $P0 = node['last_statement']
     if null $P0 goto L3
     $P0 = shift $P0
-    $P1 = tree.'get'('past', $P0, 'Lua::Grammar::last_statement')
+    $P1 = tree.'get'('past', $P0, 'Lua::Grammar::statement')
     past.'push'($P1)
 L3:
     .return (past)
 }
 
+
 transform past (Lua::Grammar::statement) :language('PIR') {
     $S0 = node.'find_key'()
     $P0 = node[$S0]
@@ -52,21 +54,14 @@
     .return tree.'get'('past', $P0, $S0)
 }
 
-transform past (Lua::Grammar::last_statement) :language('PIR') {
-    $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, cpast
+    .local pmc past, cpast, expr, blk
     $P0 = node['expression']
-    $P1 = tree.'get'('past', $P0, 'Lua::Grammar::expression')
-    past = $P1.'new'('PAST::Op', $P1, 'node'=>node, 'pasttype'=>'if')
+    expr = tree.'get'('past', $P0, 'Lua::Grammar::expression')
     $P0 = node['block']
-    $P1 = tree.'get'('past', $P0, 'Lua::Grammar::block')
-    past.'push'($P1)
+    blk = tree.'get'('past', $P0, 'Lua::Grammar::block')
+    past = expr.'new'('PAST::Op', expr, blk, 'node'=>node, 'pasttype'=>'if')
     cpast = past
     $P0 = node['elseif_block']
     if null $P0 goto L1
@@ -89,19 +84,17 @@
     .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 expr, blk
     $P0 = node['expression']
-    $P1 = tree.'get'('past', $P0, 'Lua::Grammar::expression')
-    past.'push'($P1)
+    expr = tree.'get'('past', $P0, 'Lua::Grammar::expression')
     $P0 = node['block']
-    $P1 = tree.'get'('past', $P0, 'Lua::Grammar::block')
-    past.'push'($P1)
-    .return (past)
+    blk = tree.'get'('past', $P0, 'Lua::Grammar::block')
+    .return expr.'new'('PAST::Op', expr, blk, 'node'=>node, 'pasttype'=>'if')
 }
 
+
 transform past (Lua::Grammar::else_block) :language('PIR') {
     $S0 = node.'find_key'()
     $P0 = node[$S0]
@@ -109,21 +102,27 @@
     .return tree.'get'('past', $P0, $S1)
 }
 
+
 transform past (Lua::Grammar::while_stat) :language('PIR') {
-    .local pmc past
+    .local pmc expr, blk
     $P0 = node['expression']
-    past = tree.'get'('past', $P0, 'Lua::Grammar::expression')
-    past.'new'('PAST::Op', past, 'node'=>node, 'pasttype'=>'while')
+    expr = tree.'get'('past', $P0, 'Lua::Grammar::expression')
     $P0 = node['block']
-    $P1 = tree.'get'('past', $P0, 'Lua::Grammar::block')
-    past.'push'($P1)
-    .return (past)
+    blk = tree.'get'('past', $P0, 'Lua::Grammar::block')
+    .return expr.'new'('PAST::Op', expr, blk, 'node'=>node, 
'pasttype'=>'while')
 }
 
-transform past (Lua::Grammar::repeat_stat) {
-    internal_error("not implemented (repeat)")
+
+transform past (Lua::Grammar::repeat_stat) :language('PIR') {
+    .local pmc expr, blk
+    $P0 = node['expression']
+    expr = tree.'get'('past', $P0, 'Lua::Grammar::expression')
+    $P0 = node['block']
+    blk = tree.'get'('past', $P0, 'Lua::Grammar::block')
+    .return expr.'new'('PAST::Op', expr, blk, 'node'=>node, 
'pasttype'=>'repeat')
 }
 
+
 transform past (Lua::Grammar::for_stat) :language('PIR') {
     $S0 = node.'find_key'()
     $P0 = node[$S0]
@@ -131,14 +130,17 @@
     .return tree.'get'('past', $P0, $S1)
 }
 
+
 transform past (Lua::Grammar::fornum) :language('PIR') {
     internal_error("not implemented (fornum)")
 }
 
+
 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]
@@ -146,19 +148,20 @@
     .return tree.'get'('past', $P0, $S1)
 }
 
+
 transform past (Lua::Grammar::local_declaration) :language('PIR') {
+    .local pmc past
     .local pmc namelist, explist
     $P0 = node['name']
-    new namelist, .ResizablePMCArray
+    namelist = new .ResizablePMCArray
     .local pmc iter
     iter = new .Iterator, $P0
 L1:
     unless iter goto L2
     $P0 = shift iter
     $S0 = $P0.'result_object'()
-    .local pmc past
     past = new 'PAST::Var'
-    past.'init'('node'=>node, 'name'=>$S0, 'scope'=>'lexical', 'ismy'=>1)
+    past.'init'('node'=>node, 'name'=>$S0, 'scope'=>'lexical', 'ismy'=>1, 
'islvalue'=>1)
     push namelist, past
     goto L1
 L2:
@@ -168,22 +171,26 @@
     explist = tree.'get'('explist', $P0, 'Lua::Grammar::expression_list')
 L3:
     unless null explist goto L4
-    new explist, .ResizablePMCArray
+    explist = new .ResizablePMCArray
 L4:
-    .return tree.'assigns'(node, namelist, explist)
+    past = new 'PAST::Op'
+    past.'init'(namelist, explist, 'node'=>node, 'pasttype'=>'assignlist')
+    .return (past)
 }
 
+
 transform past (Lua::Grammar::local_function) :language('PIR') {
-    .local pmc past
+    .local pmc past, var
     $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')
+    var = past.'new'('PAST::Var', 'node'=>$P0, 'name'=>$S0, 
'scope'=>'lexical', 'ismy'=>1, 'islvalue'=>1)
+    .return past.'new'('PAST::Op', var, past, 'node'=>node, 
'pasttype'=>'assign')
 }
 
+
 transform past (Lua::Grammar::return_statement) :language('PIR') {
     .local pmc past
     past = new 'PAST::Op'
@@ -198,6 +205,7 @@
     .return (past)
 }
 
+
 transform past (Lua::Grammar::break_statement) :language('PIR') {
     .local pmc past
     past = new 'PAST::Op'
@@ -205,6 +213,7 @@
     .return (past)
 }
 
+
 transform past (Lua::Grammar::expression_stat) :language('PIR') {
     $P0 = node['assignment']
     unless null $P0 goto L1
@@ -217,24 +226,32 @@
     varlist = tree.'get'('varlist', $P0, 'Lua::Grammar::assignment')
     $P0 = node['primary_expression']
     $P1 = tree.'get'('past', $P0, 'Lua::Grammar::primary_expression')
+    $P1.'islvalue'(1)
     unshift varlist, $P1
-    .return tree.'assigns'(node, varlist, explist)
+    .local pmc past
+    past = new 'PAST::Op'
+    past.'init'(varlist, explist, 'node'=>node, 'pasttype'=>'assignlist')
+    .return (past)
 }
 
+
 transform varlist (Lua::Grammar::assignment) :language('PIR') {
+    .local pmc varlist
     $P0 = node['expression_list']
     if null $P0 goto L1
-    new $P0, .ResizablePMCArray
-    .return ($P0)
+    varlist = new .ResizablePMCArray
+    .return (varlist)
 L1:
     $P0 = node['assignment']
-    $P1 = tree.'get'('varlist', $P0, 'Lua::Grammar::assignment')
+    varlist = 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)
+    $P1 = tree.'get'('past', $P0, 'Lua::Grammar::primary_expression')
+    $P1.'islvalue'(1)
+    unshift varlist, $P1
+    .return (varlist)
 }
 
+
 transform explist (Lua::Grammar::assignment) :language('PIR') {
     $P0 = node['expression_list']
     if null $P0 goto L1
@@ -244,92 +261,183 @@
     .return tree.'get'('explist', $P0, 'Lua::Grammar::assignment')
 }
 
+
 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
+    explist = new .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
+    explist = new .ResizablePMCArray
     push explist, past
     .return (explist)
 L2:
     $P0 = node['expression_list']
     unless null $P0 goto L3
-    new explist, .ResizablePMCArray
+    explist = new .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, pastb
+    .local pmc past, var
     $P0 = node['functionname']
-    past = tree.'get'('past', $P0, 'Lua::Grammar::functionname')
+    var = tree.'get'('past', $P0, 'Lua::Grammar::functionname')
+    $S0 = $P0.'result_object'()
+    $I0 = index $S0, ':'
+    if $I0 < 0 goto L1
+    past = new 'PAST::Var'
+    past.'init'('node'=>$P0, 'name'=>'self', 'scope'=>'parameter')
+    set_hll_global ['Lua::PAST'], '$?self', past
+L1:
     $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')
+    past = tree.'get'('past', $P0, 'Lua::Grammar::function_body')
+    past.'name'($S0)
+    .return past.'new'('PAST::Op', var, past, 'node'=>node, 
'pasttype'=>'assign')
 }
 
+
 transform past (Lua::Grammar::functionname) :language('PIR') {
-    .local pmc past
-    # INCOMPLETE
+    .local pmc past, iter, key
     $P0 = node['name']
-    $P0 = shift $P0
+    iter = new .Iterator, $P0
+    $P0 = shift iter
     $S0 = $P0.'result_object'()
     past = new 'PAST::Var'
     past.'init'('node'=>node, 'name'=>$S0, 'scope'=>'package')
+L2:
+    unless iter goto L1
+    $P0 = shift iter
+    $S0 = $P0.'result_object'()
+    key = past.'new'('PAST::Val', 'node'=>$P0, 'vtype'=>'.LuaString', 
'name'=>$S0, 'ctype'=>'s~')
+    past = past.'new'('PAST::Var', past, key, 'node'=>node, 'scope'=>'keyed')
+    goto L2
+L1:
+    past.'islvalue'(1)
     .return (past)
 }
 
+
 transform past (Lua::Grammar::function_body) :language('PIR') {
-    .local pmc past, parlist
-    new parlist, .ResizablePMCArray
+    .local pmc past, parlist, var
+    parlist = new .ResizablePMCArray
+    var = get_hll_global ['Lua::PAST'], '$?self'
+    if null var goto L1
+    push parlist, var
+    null var
+    set_hll_global ['Lua::PAST'], '$?self', var
+L1:
     $P0 = node['parameter_list']
-    if null $P0 goto L1
+    if null $P0 goto L2
     $P0 = shift $P0
     $P1 = $P0['name_list']
-    if null $P1 goto L2
+    if null $P1 goto L3
     $P1 = $P1['name']
     .local pmc iter
-    new iter, .Iterator, $P1
-L3:
-    unless iter goto L2
+    iter = new .Iterator, $P1
+L4:
+    unless iter goto L3
     $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:
+    var = new 'PAST::Var'
+    var.'init'('node'=>$P1, 'name'=>$S0, 'scope'=>'parameter')
+    push parlist, var
+    goto L4
+L3:
     $P1 = $P0['vararg']
-    if null $P1 goto L1
+    if null $P1 goto L2
     $P1 = shift $P1
-    new $P2, 'PAST::Var'
-    $P2.'init'('node'=>$P1, 'name'=>'vararg', 'scope'=>'parameter', 
'isslurpy'=>1)
-    push parlist, $P2
-L1:
+    var = new 'PAST::Var'
+    var.'init'('node'=>$P1, 'name'=>'...', 'scope'=>'parameter', 'isslurpy'=>1)
+    push parlist, var
+L2:
     $P0 = node['block']
     past = tree.'get'('past', $P0, 'Lua::Grammar::block')
-    .return past.'new'('PAST::Block', parlist :flat, past, 'node'=>node)
+    .return past.'new'('PAST::Block', parlist :flat, past, 'node'=>node, 
'pragma'=>':anon :lex')
 }
 
+
 transform past (Lua::Grammar::constructor) :language('PIR') {
-    internal_error("not implemented (constructor)")
+    .local pmc past, table
+    new table, 'PAST::Val'
+    table.'init'('node'=>node, 'vtype'=>'.LuaTable')
+    past = table.'new'('PAST::Stmts', table, 'node'=>node)
+    $P0 = node['tablefieldlist']
+    if null $P0 goto L1
+    $P0 = shift $P0
+    $P0 = $P0['tablefield']
+    .local pmc iter, key, expr, var
+    $I0 = 1
+    iter = new .Iterator, $P0
+L2:
+    unless iter goto L1
+    $P0 = shift iter
+    $S0 = $P0.'find_key'()
+    $P0 = $P0[$S0]
+    $S0 = concat 'Lua::Grammar::', $S0
+    expr = tree.'get'('past', $P0, $S0)
+    key = tree.'get'('key', $P0, $S0)
+    unless null key goto L3
+    $S0 = $I0
+    inc $I0
+    key = past.'new'('PAST::Val', 'node'=>$P0, 'vtype'=>'.LuaNumber', 
'name'=>$S0, 'ctype'=>'n+')
+L3:
+    var = past.'new'('PAST::Var', table, key, 'node'=>$P0, 'scope'=>'keyed', 
'islvalue'=>1)
+    past.'push_new'('PAST::Op', var, expr, 'node'=>$P0, 'pasttype'=>'assign')
+    goto L2
+L1:
+    .return (past)
+}
+
+
+transform key (Lua::Grammar::expression) :language('PIR') {
+    .local pmc key
+    null key
+    .return (key)
+}
+
+
+transform key (Lua::Grammar::record_field) :language('PIR') {
+    $S0 = node.'find_key'()
+    $P0 = node[$S0]
+    $S0 = concat 'Lua::Grammar::', $S0
+    .return tree.'get'('key', $P0, $S0)
+}
+
+
+transform key (Lua::Grammar::name) :language('PIR') {
+    .local pmc past
+    $S0 = node.'result_object'()
+    past = new 'PAST::Val'
+    past.'init'('node'=>node, 'vtype'=>'.LuaString', 'name'=>$S0, 
'ctype'=>'s~')
+    .return (past)
+}
+
+
+transform key (Lua::Grammar::index) :language('PIR') {
+    $P0 = node['expression']
+    .return tree.'get'('past', $P0, 'Lua::Grammar::expression')
+}
+
+
+transform past (Lua::Grammar::record_field) :language('PIR') {
+    $P0 = node['expression']
+    .return tree.'get'('past', $P0, 'Lua::Grammar::expression')
 }
 
+
 transform explist (Lua::Grammar::expression_list) :language('PIR') {
     .local pmc explist
-    new explist, .ResizablePMCArray
+    explist = new .ResizablePMCArray
     $P0 = node['expression']
     .local pmc iter
     iter = new .Iterator, $P0
@@ -343,11 +451,13 @@
     .return (explist)
 }
 
+
 transform past (Lua::Grammar::expression) :language('PIR') {
     $P0 = node['expr']
     .return tree.'get'('past', $P0, 'Lua::Grammar::expr')
 }
 
+
 transform past (Lua::Grammar::expr) :language('PIR') {
     .local string type
     type = node['type']
@@ -393,23 +503,45 @@
     .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)
+    .local pmc past, iter, key
+    $P0 = node['prefix_expression']
+    past = tree.'get'('past', $P0, 'Lua::Grammar::prefix_expression')
+    $P0 = node['name']
+    if null $P0 goto L1
+    iter = new .Iterator, $P0
+L2:
+    unless iter goto L1
+    $P0 = shift iter
+    key = tree.'get'('key', $P0, 'Lua::Grammar::name')
+    past = past.'new'('PAST::Var', past, key, 'node'=>node, 'scope'=>'keyed')
+    goto L2
 L1:
+
+    $P0 = node['index']
+    if null $P0 goto L3
+    iter = new .Iterator, $P0
+L4:
+    unless iter goto L3
+    $P0 = shift iter
+    key = tree.'get'('key', $P0, 'Lua::Grammar::index')
+    past = past.'new'('PAST::Var', past, key, 'node'=>node, 'scope'=>'keyed')
+    goto L4
+L3:
+
+    $P0 = node['function_args']
+    unless null $P0 goto L9
+    .return (past)
+
+L9:
     $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::prefix_expression) :language('PIR') {
     $S0 = node.'find_key'()
     $P0 = node[$S0]
@@ -417,14 +549,16 @@
     .return tree.'get'('past', $P0, $S0)
 }
 
+
 transform past (Lua::Grammar::name) :language('PIR') {
     .local pmc past
-    $S0 = node
+    $S0 = node.'result_object'()
     past = new 'PAST::Var'
     past.'init'('node'=>node, 'name'=>$S0, 'scope'=>'package')
     .return (past)
 }
 
+
 transform past (Lua::Grammar::nil) :language('PIR') {
     .local pmc past
     new past, 'PAST::Val'
@@ -432,34 +566,38 @@
     .return (past)
 }
 
+
 transform past (Lua::Grammar::true) :language('PIR') {
     .local pmc past
-    new past, 'PAST::Val'
+    past = new 'PAST::Val'
     past.'init'('node'=>node, 'vtype'=>'.LuaBoolean', 'name'=>1)
     .return (past)
 }
 
+
 transform past (Lua::Grammar::false) :language('PIR') {
     .local pmc past
-    new past, 'PAST::Val'
+    past = new 'PAST::Val'
     past.'init'('node'=>node, 'vtype'=>'.LuaBoolean', 'name'=>0)
     .return (past)
 }
 
+
 transform past (Lua::Grammar::number) :language('PIR') {
     .local pmc past
-    new past, 'PAST::Val'
+    past = new 'PAST::Val'
     $S0 = node.'result_object'()
     past.'init'('node'=>node, 'vtype'=>'.LuaNumber', 'name'=>$S0, 
'ctype'=>'n+')
     .return (past)
 }
 
+
 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 = new 'PAST::Val'
     past.'init'('node'=>node, 'vtype'=>'.LuaString', 'name'=>$S1, 
'ctype'=>'s~')
     .return (past)
 }

Modified: trunk/languages/lua/src/POSTGrammar.tg
==============================================================================
--- trunk/languages/lua/src/POSTGrammar.tg      (original)
+++ trunk/languages/lua/src/POSTGrammar.tg      Tue May 29 04:13:42 2007
@@ -39,10 +39,19 @@
   iter_end:
     set_hll_global ['Lua::POST'], '$?SUB', outerpost
   unless null outerpost goto no_chunk
+#    .local pmc onload
+#    onload = post.'new'('POST::Sub', 'name'=>'__onload', 'pragma'=>':anon 
:init', 'result'=>'')
+##    onload.'push_pirop'('inline', '    print "onload\n"')
+#    onload.'push_pirop'('inline', '    load_bytecode 
"languages/lua/lib/luabasic.pbc"')
+    pragma .= ' :main'
+    post.'pragma'(pragma)
     post = post.'new'('Lua::POST::Chunk', post, 'prologue'=><<'PIRCODE')
 
 .HLL "Lua", "lua_group"
 
+#.sub "__onload" :anon :init
+#    load_bytecode "languages/lua/lib/luabasic.pbc"
+#.end
 PIRCODE
   no_chunk:
     .return (post)
@@ -50,6 +59,19 @@
 
 
 transform post (PAST::Stmts) :language('PIR') {
+#    .local pmc ops
+#    ops =  new 'POST::Ops'
+#    ops.'init'('node'=>node)
+#    .local pmc iter
+#    iter = node.'iterator'()
+#  iter_loop:
+#    unless iter goto iter_end
+#    $P0 = shift iter
+#    $P1 = tree.'get'('post', $P0)
+#    ops.'push'($P1)
+#    goto iter_loop
+#  iter_end:
+#    .return (ops)
     .local pmc ops
     ops =  new 'POST::Ops'
     ops.'init'('node'=>node)
@@ -57,13 +79,12 @@
     iter = node.'iterator'()
     unless iter goto end
   iter_loop:
-    .local pmc cpast, cpost
-    cpast = shift iter
-    cpost = tree.'get'('post', cpast)
-    ops.'push'(cpost)
+    $P0 = shift iter
+    $P1 = tree.'get'('post', $P0)
+    ops.'push'($P1)
     if iter goto iter_loop
   iter_end:
-    ops.'result'(cpost)
+    ops.'result'($P1)
   end:
     .return (ops)
 }
@@ -174,15 +195,13 @@
 
 transform call (PAST::Op) :language('PIR') {
     node.'pirop'('call')
-    $P0 = tree.'get'('pirop', node)
-    .return ($P0)
+    .return tree.'get'('pirop', node)
 }
 
 
 transform callmethod (PAST::Op) :language('PIR') {
     node.'pirop'('callmethod')
-    $P0 = tree.'get'('pirop', node)
-    .return ($P0)
+    .return tree.'get'('pirop', node)
 }
 
 
@@ -236,11 +255,6 @@
 }
 
 
-transform unless (PAST::Op) :language('PIR') {
-    .return tree.'get'('if', node)
-}
-
-
 transform while (PAST::Op) :language('PIR') {
     .local pmc ops
     ops = new 'POST::Ops'
@@ -281,147 +295,62 @@
 }
 
 
-transform until (PAST::Op) :language('PIR') {
-    .return tree.'get'('while', node)
-}
-
-
-transform try (PAST::Op) :language('PIR') {
-    .local pmc trypast, trypost, post, traplabel, endlabel
-    trypast = node[0]
-    trypost = tree.'get'('post', trypast)
-    post = trypost.'new'('POST::Ops', 'node'=>node, 'result'=>trypost)
-    $S0 = node.'unique'('trap_')
-    traplabel = post.'new'('POST::Label', 'result'=>$S0)
-    $S0 = concat $S0, '_end'
-    endlabel = post.'new'('POST::Label', 'result'=>$S0)
-    post.'push_pirop'('push_eh', traplabel)
-    post.'push'(trypost)
-    post.'push_pirop'('clear_eh')
-    post.'push_pirop'('goto', endlabel)
-    post.'push'(traplabel)
-    .local pmc catchnode, catchpast
-    catchnode = node[1]
-    unless catchnode goto have_catch
-    catchpast = tree.'get'('post', catchnode)
-    post.'push'(catchpast)
-  have_catch:
-    post.'push'(endlabel)
-    .return (post)
-}
-
-
-transform xor (PAST::Op) :language('PIR') {
-    .local pmc ops
-    ops = new 'POST::Ops'
-    ops.'init'('node'=>node)
-
-    .local pmc endlabel, falselabel
-    falselabel = ops.'new'('POST::Label', 'name'=>'xor_false')
-    endlabel = ops.'new'('POST::Label', 'name'=>'xor_end')
-
-    .local pmc iter, apast, apost, i, t, u
-    i = ops.unique('$I')
-    t = ops.unique('$I')
-    u = ops.unique('$I')
-    iter = node.'iterator'()
-    apast = shift iter
-    apost = tree.'get'('post', apast)
-    ops.'push'(apost)
-    ops.'push_pirop'('set', ops, apost)
-    ops.'push_pirop'('istrue', t, apost)
-  middle_child:
-    .local pmc bpast, bpost
-    bpast = shift iter
-    bpost = tree.'get'('post', bpast)
-    ops.'push'(bpost)
-    ops.'push_pirop'('istrue', u, bpost)
-    ops.'push_pirop'('and', i, t, u)
-    ops.'push_pirop'('if', i, falselabel)
-    unless iter goto last_child
-    .local pmc s
-    s = ops.'new'('POST::Label', 'name'=>'xor_skip')
-    ops.'push_pirop'('if', t, s)
-    ops.'push_pirop'('set', ops, bpost)
-    ops.'push_pirop'('set', t, u)
-    ops.'push'(s)
-    goto middle_child
-  last_child:
-    ops.'push_pirop'('if', t, endlabel)
-    ops.'push_pirop'('set', ops, bpost)
-    ops.'push_pirop'('goto', endlabel)
-    ops.'push'(falselabel)
-    ops.'push_pirop'('new', ops, '.LuaNil')
-    ops.'push'(endlabel)
-    .return (ops)
-}
-
-
-transform bind (PAST::Op) :language('PIR') {
-    .local pmc lpast, rpast, lpost, rpost, post
-    rpast = node[1]
-    rpost = tree.'get'('post', rpast)
-    lpast = node[0]
-    lpast.'bindvalue'(rpost)
-    lpost = tree.'get'('bind', lpast)
-    post = lpost.'new'('POST::Ops', rpost, lpost, 'node'=>node)
-    .return (post)
-}
-
-
 transform assign (PAST::Op) :language('PIR') {
-    .local pmc lpost, rpost, post
+    .local pmc lpost, rpost, ops
     $P0 = node[1]
     rpost = tree.'get'('post', $P0)
     $P0 = node[0]
     lpost = tree.'get'('post', $P0)
-    post = lpost.'new'('POST::Ops', rpost, lpost, 'node'=>node, 
'result'=>lpost)
-    post.'push_pirop'('assign', lpost, rpost)
-    .return (post)
+#    ops = lpost.'new'('POST::Ops', rpost, lpost, 'node'=>node, 
'result'=>lpost)
+    ops = lpost.'new'('POST::Ops', rpost, lpost, 'node'=>node)
+    ops.'push_pirop'('set', lpost, rpost)
+    .return (ops)
 }
 
 
-transform chain (PAST::Op) :language('PIR') {
-    .local pmc clist, cpast
-    clist = new .ResizablePMCArray
-    cpast = node
-  chain_loop:
-    $I0 = isa cpast, 'PAST::Op'
-    if $I0 == 0 goto chain_end
-    .local string pasttype
-    pasttype = cpast.'pasttype'()
-    if pasttype != 'chain' goto chain_end
-    push clist, cpast
-    cpast = cpast[0]
-    goto chain_loop
-  chain_end:
-
-    .local pmc ops, endlabel, apast, apost
-    ops = new 'POST::Ops'
+transform assignlist (PAST::Op) :language('PIR') {
+    .local pmc lpost, rpost, ops
+    ops =  new 'POST::Ops'
     ops.'init'('node'=>node)
-    cpast = pop clist
-    endlabel = ops.'new'('POST::Label', 'name'=>'chain_end_')
-    apast = cpast[0]
-    apost = tree.'get'('post', apast)
-    ops.'push'(apost)
-
-  clist_loop:
-    .local pmc bpast, bpost
-    bpast = cpast[1]
-    bpost = tree.'get'('post', bpast)
-    .local string name
-    name = cpast.'name'()
-    name = cpast.'escape'(name)
-    ops.'push'(bpost)
-    $P0 = ops.'push_pirop'('call', name, apost, bpost)
-    $P0.'result'(ops)
-    unless clist goto clist_end
-    ops.'push_pirop'('unless', ops, endlabel)
-    cpast = pop clist
-    apost = bpost
-    goto clist_loop
-  clist_end:
-    ops.'push'(endlabel)
+    .local pmc namelist, explist
+    namelist = node[0]
+    explist = node[1]
+    $I0 = namelist
+    unless $I0 == 1 goto L1
+    $P1 = explist[0]
+    unless $P1 goto L2
+    rpost = tree.'get'('post', $P1)
+    ops.'push'(rpost)
+    goto L3
+L2:
+    rpost = ops.'push_pirop'('new')
+    rpost.'arglist'(rpost, '.LuaNil')
+L3:
+    $P0 = namelist[0]
+    lpost = tree.'get'('post', $P0)
+    ops.'push'(lpost)
+    ops.'push_pirop'('set', lpost, rpost)
+    .return (ops)
+L1:
+    .local pmc iter
+    new iter, .Iterator, namelist
+L4:
+    unless iter goto L5
+    $P0 = shift iter
+    unless explist goto L6
+    $P1 = shift explist
+    rpost = tree.'get'('post', $P1)
+    ops.'push'(rpost)
+    goto L7
+L6:
+    rpost = ops.'push_pirop'('new')
+    rpost.'arglist'(rpost, '.LuaNil')
+L7:
+    lpost = tree.'get'('post', $P0)
+    ops.'push'(lpost)
+    ops.'push_pirop'('set', lpost, rpost)
+    goto L4
+L5:
     .return (ops)
 }
 
@@ -437,75 +366,16 @@
     name = node.'escape'(name)
   skip_escape:
 
-    .local pmc post
-    post = new 'POST::Ops'
-    post.'init'('node'=>node)
-    $P0 = post.'push_new'('POST::Op', 'pirop'=>'new')
+    .local pmc ops
+    ops = new 'POST::Ops'
+    ops.'init'('node'=>node)
+    $P0 = ops.'push_pirop'('new')
     $P0.'arglist'($P0, vtype)
-    $P1 = post.'push_pirop'('assign', $P0, name, 'result'=>$P0)
-    post.'result'($P1)
-    .return (post)
-}
-
-
-transform keypost (PAST::Var) :language('PIR') {
-    .local pmc post
-    post = new 'POST::Ops'
-    post.'init'('node'=>node)
-    .local pmc basepast, keypast
-    .local pmc basepost, keypost
-    basepast = node[0]
-    keypast = node[1]
-    keypast.'atype'('*')
-    keypost = tree.'get'('post', keypast)
-    post.'push'(keypost)
-    basepost = tree.'get'('post', basepast)
-    post.'push'(basepost)
-    .local string key
-    key = basepost.'result'()
-    key = concat key, '['
-    $S0 = keypost.'result'()
-    key .= $S0
-    key .= ']'
-    post.'result'(key)
-    .return (post)
-}
-
-
-transform bind (PAST::Var) :language('PIR') {
-    .local pmc bindvalue
-    .local string scope
-    bindvalue = node.'bindvalue'()
-    scope = node.'scope'()
-    if scope == 'keyed' goto keyed
-
-    .local string name
-    name = node.'name'()
-    name = node.'escape'(name)
-    .local pmc post
-    post = new 'POST::Op'
-    post.'init'('node'=>node, 'result'=>bindvalue, 'pirop'=>'set_global')
-    post.'arglist'(name, bindvalue)
-    if scope == 'lexical' goto lexical
-    .return (post)
-
-  lexical:
-    .local int isdecl
-    isdecl = node.'ismy'()
-    if isdecl goto lexical_decl
-    post.'pirop'('store_lex')
-    .return (post)
-
-  lexical_decl:
-    post.'pirop'('.lex')
-    .return (post)
-
-  keyed:
-    .local pmc post, keypost
-    keypost = tree.'get'('keypost', node)
-    post = keypost.'new'('POST::Op', keypost, 'node'=>node, 'pirop'=>'set', 
'result'=>bindvalue)
-    post.'arglist'(keypost, bindvalue)
-    .return (post)
+    if name == '' goto end
+    $P0 = ops.'push_pirop'('set', $P0, name, 'result'=>$P0)
+  end:
+    ops.'result'($P0)
+    .return (ops)
 }
 
 
@@ -525,11 +395,12 @@
 
 transform post (PAST::Var) :language('PIR') {
     .local pmc vivipost, vivilabel, post
+    .local pmc keypost, basepost
     vivipost = tree.'get'('vivipost', node)
     post = vivipost.'new'('POST::Ops', 'node'=>node, 'result'=>vivipost)
     vivilabel = post.'new'('POST::Label', 'name'=>'vivify_')
 
-    .local string scope, name, fetchop, storeop
+    .local string scope, name, key, fetchop, storeop
     scope = node.'scope'()
     if scope == 'keyed' goto scope_keyed
     name = node.'name'()
@@ -537,17 +408,20 @@
     if scope == 'lexical' goto scope_lexical
     if scope == 'parameter' goto scope_parameter
   scope_package:
-    fetchop = 'get_global'
-    storeop = 'set_global'
+    basepost = post.'push_pirop'('get_global')
+    basepost.'arglist'(basepost, '"_G"')
+    keypost = post.'push_pirop'('new')
+    keypost.'arglist'(keypost, '.LuaString')
+    post.'push_pirop'('set', keypost, name)
     goto have_scope
 
   scope_keyed:
-    .local pmc keypost, basepost
-    keypost = tree.'get'('keypost', node)
+    $P0 = node[0]
+    basepost = tree.'get'('post', $P0)
+    post.'push'(basepost)
+    $P0 = node[1]
+    keypost = tree.'get'('post', $P0)
     post.'push'(keypost)
-    name = keypost.'result'()
-    fetchop = 'set'
-    storeop = 'set'
     goto have_scope
 
   scope_lexical:
@@ -568,19 +442,27 @@
     post.'result'(pname)
     .local pmc subpost
     subpost = get_hll_global ['Lua::POST'], '$?SUB'
-    subpost.'push_param'('pmc', pname)
+    $I0 = node.'isslurpy'()
+    unless $I0 goto no_slurpy
+    subpost.'push_param'('pmc', pname, ':slurpy')
+    .return (post)
+  no_slurpy:
+    subpost.'push_param'('pmc', pname, ':optional')
     .return (post)
 
   have_scope:
-#    post.'push_pirop'(fetchop, vivipost, name)
-#    post.'push_pirop'('unless_null', post, vivilabel)
-#    post.'push'(vivipost)
-#    .local int islvalue
-#    islvalue = node.'islvalue'()
-#    unless islvalue goto done_lvalue
-    post.'push_pirop'(storeop, name, post)
-#  done_lvalue:
-#    post.'push'(vivilabel)
+    key = basepost.'result'()
+    key = concat key, '['
+    $S0 = keypost.'result'()
+    key .= $S0
+    key .= ']'
+    post.'result'(key)
+    $I0 = node.'islvalue'()
+    if $I0 goto done_lvalue
+    $P0 = post.'push_pirop'('set')
+    $P0.'arglist'($P0, key)
+    post.'result'($P0)
+  done_lvalue:
     .return (post)
 }
 

Modified: trunk/languages/lua/src/lua51.pg
==============================================================================
--- trunk/languages/lua/src/lua51.pg    (original)
+++ trunk/languages/lua/src/lua51.pg    Tue May 29 04:13:42 2007
@@ -122,7 +122,7 @@
 }
 
 rule record_field {
-  [ <name> | <index> ] <?assign> <expression>
+  [ <name> | <index> ] <'='> <expression>
 }
 
 rule constructor {
@@ -130,7 +130,7 @@
 }
 
 rule tablefieldlist {
-  <tablefield> [ <?fieldsep> <tablefield> ]* <?fieldsep>?
+  <tablefield> [ <fieldsep> <tablefield> ]* <fieldsep>?
 }
 
 rule fieldsep {
@@ -138,7 +138,7 @@
 }
 
 rule tablefield {
-  [ <record_field> | <expression> ]*
+  <record_field> | <expression>
 }
 
 rule parameter_list {
@@ -223,10 +223,6 @@
   <'in'> | <syntax_error: 'in' expected>
 }
 
-rule assign {
-  <'='>  | <syntax_error: '=' expected>
-}
-
 rule closebracket {
   <']'>  | <syntax_error: ']' expected>
 }
@@ -326,9 +322,9 @@
 proto 'infix:=='    is equiv('infix:<')     is pirop('iseq')
                     is returns('.LuaBoolean')                   { ... }
 
-proto 'infix:and'   is looser('infix:<')    is past('if')       { ... }
+proto 'infix:and'   is looser('infix:<')    is past('and')      { ... }
 
-proto 'infix:or'    is looser('infix:and')  is past('unless')   { ... }
+proto 'infix:or'    is looser('infix:and')  is past('or')       { ... }
 
 
 =head1 AUTHORS

Modified: trunk/languages/lua/src/lua51.pir
==============================================================================
--- trunk/languages/lua/src/lua51.pir   (original)
+++ trunk/languages/lua/src/lua51.pir   Tue May 29 04:13:42 2007
@@ -663,41 +663,6 @@
     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
-
 .namespace [ "Lua::POST" ]
 
 .sub '__onload' :load :init

Reply via email to