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:<') { ... }