Author: fperrad
Date: Wed Jun  6 00:14:37 2007
New Revision: 18840

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

Log:
[Lua]
- PAST/POST suite

Modified: trunk/languages/lua/lib/luaaux.pir
==============================================================================
--- trunk/languages/lua/lib/luaaux.pir  (original)
+++ trunk/languages/lua/lib/luaaux.pir  Wed Jun  6 00:14:37 2007
@@ -580,11 +580,11 @@
 .end
 
 
-=item C<infix:!=>
+=item C<infix:~=>
 
 =cut
 
-.sub 'infix:!='
+.sub 'infix:~='
     .param pmc a
     .param pmc b
     $I0 = isne a, b

Modified: trunk/languages/lua/src/PASTGrammar.tg
==============================================================================
--- trunk/languages/lua/src/PASTGrammar.tg      (original)
+++ trunk/languages/lua/src/PASTGrammar.tg      Wed Jun  6 00:14:37 2007
@@ -262,10 +262,10 @@
     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')
+    past.'init'($P1 :flat, 'node'=>node, 'pasttype'=>'return')
     .return (past)
   L1:
-    past.'init'('node'=>node, 'pasttype'=>'pirop', 'pirop'=>'return')
+    past.'init'('node'=>node, 'pasttype'=>'return')
     .return (past)
 }
 
@@ -273,7 +273,7 @@
 transform past (Lua::Grammar::break_statement) :language('PIR') {
     .local pmc past
     past = new 'PAST::Op'
-    past.'init'('node'=>node, 'pasttype'=>'pirop', 'pirop'=>'goto')
+    past.'init'('node'=>node, 'pasttype'=>'break')
     .return (past)
 }
 
@@ -431,7 +431,7 @@
   L2:
     $P0 = node['block']
     past = tree.'get'('past', $P0, 'Lua::Grammar::block')
-    .return past.'new'('PAST::Block', parlist :flat, past, 'node'=>node, 
'pragma'=>':anon :lex')
+    .return past.'new'('PAST::Block', parlist :flat, past, 'node'=>node)
 }
 
 
@@ -627,6 +627,11 @@
 }
 
 
+transform past (Lua::Grammar::vararg) :language('PIR') {
+    internal_error("not implemented (vararg)")
+}
+
+
 transform past (Lua::Grammar::nil) :language('PIR') {
     .local pmc past
     new past, 'PAST::Val'

Modified: trunk/languages/lua/src/POSTGrammar.tg
==============================================================================
--- trunk/languages/lua/src/POSTGrammar.tg      (original)
+++ trunk/languages/lua/src/POSTGrammar.tg      Wed Jun  6 00:14:37 2007
@@ -15,18 +15,16 @@
 
 
 transform post (PAST::Block) :language('PIR') {
-    .local string name, pragma, blocktype
+    .local string name
     name = node.'name'()
     if name != '' goto with_name
-    name = node.unique('_block')
+    name = node.unique('anon_')
   with_name:
-    pragma = node.'pragma'()
-    blocktype = node.'blocktype'()
     .local pmc outerpost
     outerpost = get_hll_global ['Lua::POST'], '$?SUB'
     .local pmc post
     post = new 'POST::Sub'
-    post.'init'('node'=>node, 'name'=>name, 'outer'=>outerpost, 
'pragma'=>pragma, 'blocktype'=>blocktype, 'result'=>'')
+    post.'init'('node'=>node, 'name'=>name, 'outer'=>outerpost, 
'pragma'=>':anon :lex', 'blocktype'=>'declaration', 'result'=>'')
     set_hll_global ['Lua::POST'], '$?SUB', post
     .local pmc iter
     iter = node.'iterator'()
@@ -60,9 +58,20 @@
     onload = post.'new'('POST::Sub', 'name'=>'__onload', 'pragma'=>':anon 
:init', 'result'=>'')
     onload.'push_pirop'('inline', '    .const .Sub main = "_main"')
     onload.'push_pirop'('inline', '#    print "onload\n"')
-    post = post.'new'('Lua::POST::Chunk', post, onload, start, 
'prologue'=>'.HLL "Lua", "lua_group"')
+    .return post.'new'('Lua::POST::Chunk', post, onload, start, 
'prologue'=>'.HLL "Lua", "lua_group"')
   no_chunk:
-    .return (post)
+    .local pmc ops
+    ops = post.'new'('POST::Ops', 'node'=>node)
+    ops.'push'(post)
+    $S0 = node.'unique'('fct_')
+    $S1 = node.'escape'(name)
+    ops.'push_pirop'('inline', '    .const .Sub %0 = %1', $S0, $S1)
+    $P0 = ops.'push_pirop'('get_global')
+    $P0.'arglist'($P0, '"_G"')
+    #ops.'push_pirop'('callmethod', 'setfenv', $S0, $P0, 'result'=>'')
+    ops.'push_pirop'('callmethod', 'setfenv', $S0, $P0)
+    ops.'result'($S0)
+    .return (ops)
 }
 
 
@@ -370,6 +379,35 @@
 }
 
 
+transform return (PAST::Op) :language('PIR') {
+    .local pmc ops, var, limit, step, blk
+    ops = new 'POST::Ops'
+    ops.'init'('node'=>node)
+    $S0 = ''
+    .local pmc iter
+    iter = node.'iterator'()
+  iter_loop:
+    unless iter goto iter_end
+    $P0 = shift iter
+    $P1 = tree.'get'('post', $P0)
+    ops.'push'($P1)
+    $S1 = $P1.'result'()
+    if $S0 == '' goto first
+    $S0 = concat ', '
+  first:
+    $S0 = concat $S1
+    goto iter_loop
+  iter_end:
+    ops.'push_pirop'('inline', '    .return (%0)', $S0)
+    .return (ops)
+}
+
+
+transform break (PAST::Op) :language('PIR') {
+    internal_error("not implemented (break)")
+}
+
+
 transform assign (PAST::Op) :language('PIR') {
     .local pmc lpost, rpost, ops
     $P0 = node[1]

Modified: trunk/languages/lua/src/lua51.pg
==============================================================================
--- trunk/languages/lua/src/lua51.pg    (original)
+++ trunk/languages/lua/src/lua51.pg    Wed Jun  6 00:14:37 2007
@@ -303,7 +303,7 @@
                     is returns('.LuaNumber')                    { ... }
 
 proto 'infix:..'    is looser('infix:+')    is pirop('concat')  is 
assoc('right')
-                    is returns('.LusString')                    { ... }
+                    is returns('.LuaString')                    { ... }
 
 proto 'infix:<'     is looser('infix:..')                       { ... }
 proto 'infix:>'     is equiv('infix:<')                         { ... }

Reply via email to