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'