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