Author: bernhard
Date: Mon Feb 12 14:22:32 2007
New Revision: 16959
Modified:
trunk/languages/PIR/lib/ASTGrammar.tg
trunk/languages/PIR/lib/pir.pg
Log:
[languages/PIR]
* extended TGE, but far from complete
* minor changes in .pg file
Courtest of Klass Jan Stol
Modified: trunk/languages/PIR/lib/ASTGrammar.tg
==============================================================================
--- trunk/languages/PIR/lib/ASTGrammar.tg (original)
+++ trunk/languages/PIR/lib/ASTGrammar.tg Mon Feb 12 14:22:32 2007
@@ -9,6 +9,7 @@
transform past (ROOT) :language('PIR') {
.local pmc past
past = new 'PAST::Block'
+ #past.'init'('node'=>node)
past.'init'('node'=>node, 'name'=>'anon')
.local pmc childnode, childpast
@@ -16,6 +17,7 @@
childpast = tree.'get'('past', childnode, 'PIRGrammar::program')
past.'push'(childpast)
.return (past)
+ #.return (childpast)
}
# past (PIRGrammar::program)
@@ -82,27 +84,46 @@
# Transform a sub_def into a PAST::Block node.
#
transform past (PIRGrammar::sub_def) :language('PIR') {
- printerr "subdef\n"
- .local pmc result
- result = new 'PAST::Block'
+
+ .local pmc past
+ past = new 'PAST::Block'
+
.local string name
name = node['sub_id']
- result.'init'('node'=>node, 'name'=> name, 'blocktype'=>'sub')
- .local pmc child
+ past.'init'('node'=>node, 'name'=> name, 'blocktype'=>'sub')
- # TODO: parameters
+ .local pmc pnode, pragma
+ pnode = node['sub_pragmas']
+ if null pnode goto skip_pragma
+ pragma = tree.'get'('past', pnode, 'PIRGrammar::sub_pragma')
+ past.'pragma'(pragma)
+ skip_pragma:
+ .local pmc child
$P1 = node['body']
child = tree.'get'('past', $P1, 'PIRGrammar::body')
- result.'push'(child)
- .return(result)
+ past.'push'(child)
+ .return (past)
+}
+
+#transform past (PIRGrammar::sub_pragmas) {
+#
+#}
+
+transform past (PIRGrammar::sub_pragma) {
+ .local pmc past
+ past = node[':main'] ### mmm why does *this* work for all
pragmas??
+ if null past goto skip
+ .return (past)
+ skip:
+ .return ()
}
transform past (PIRGrammar::const_def) :language('PIR') {
.local pmc past
past = new 'PASM::Op'
# FIX:
- past.'init'('node'=>node, 'pasttype'=>'pirop', 'pirop'=>'const')
+ past.'init'('node'=>node, 'pasttype'=>'pirop', 'pirop'=>'.const')
.return (past)
}
@@ -110,83 +131,206 @@
}
-transform past (PIRGrammar::pragma_def) :language('PIR') {
- .local pmc past
- past = new 'PASM::Op'
- past.'init'('node'=>node, 'pasttype'=>'pirop', 'pirop'=>'.pragma')
- .return (past)
+transform past (PIRGrammar::pragma) :language('PIR') {
+ .local pmc past
+
+ include_pragma:
+ $P0 = node['.include']
+ if null $P0 goto n_op_pragma
+ past = new 'PASM::Op'
+ past.'init'('node'=>node, 'pasttype'=>'pirop',
'pirop'=>'.include')
+ .return (past)
+ n_op_pragma:
+ if null $P0 goto loadlib_pragma
+ past = new 'PASM::Op'
+ past.'init'('node'=>node, 'pasttype'=>'pirop',
'pirop'=>'.include')
+ .return (past)
+ loadlib_pragma:
+ if null $P0 goto namespace_pragma
+ past = new 'PASM::Op'
+ past.'init'('node'=>node, 'pasttype'=>'pirop',
'pirop'=>'.include')
+ .return (past)
+ namespace_pragma:
+ if null $P0 goto hll_map_pragma
+ past = new 'PASM::Op'
+ past.'init'('node'=>node, 'pasttype'=>'pirop',
'pirop'=>'.include')
+ .return (past)
+ hll_map_pragma:
+ if null $P0 goto hll_spec_pragma
+ past = new 'PASM::Op'
+ past.'init'('node'=>node, 'pasttype'=>'pirop',
'pirop'=>'.include')
+ .return (past)
+ hll_spec_pragma:
+ if null $P0 goto source_pragma
+ past = new 'PASM::Op'
+ past.'init'('node'=>node, 'pasttype'=>'pirop',
'pirop'=>'.include')
+ .return (past)
+ source_pragma:
+ if null $P0 goto unknown
+ past = new 'PASM::Op'
+ past.'init'('node'=>node, 'pasttype'=>'pirop',
'pirop'=>'.include')
+ .return (past)
+ unknown:
+ printerr "unknown pragma in tree transformation\n"
+ end
+
}
transform past (PIRGrammar::emit) :language('PIR') {
-
+ .local pmc past, startop, endop
+ past = new 'PAST::Block'
+ past.'init'('node'=>node)
+
+ #startop = new 'PAST::Op'
+ #startop.'init'('node'=>node, 'pasttype'=>'inline',
'inline'=>'.emit')
+ #past.'push'(startop)
+
+ #endop = new 'PAST::Op'
+ #endop.'init'('node'=>node, 'pasttype'=>'inline',
'inline'=>'.eom')
+ #past.'push'(endop)
+
+ .return (past)
}
-#transform past (PIRGrammar::param) :language('PIR') {
-#
-#}
# past (PIRGrammar::body)
#
# Store each of the instructions in a body node in a PAST::Stmts node.
#
-transform past (PIRGrammar::body) :language('PIR') {
- printerr "body\n"
+transform past (PIRGrammar::body) :language('PIR') {
.local pmc past
past = new 'PAST::Stmts'
past.'init'('node'=>node)
-
+
.local pmc iter
+ .local pmc cnode, cpast
+
+ # process the parameter declarations
+ $P0 = node['param_decl']
+ if null $P0 goto iter_param_end
+ iter = new .Iterator, $P0
+ iter_param_loop:
+ unless iter goto iter_param_end
+ cnode = shift iter
+ cpast = tree.'get'('past', cnode, 'PIRGrammar::param_decl')
+ past.'push'(cpast)
+ goto iter_param_loop
+ iter_param_end:
+
+ # process the instructions
$P0 = node['labeled_pir_instr']
- if null $P0 goto iter_end
+ if null $P0 goto iter_instr_end
iter = new .Iterator, $P0
- iter_loop:
- unless iter goto iter_end
- .local pmc cnode, cpast
+ iter_instr_loop:
+ unless iter goto iter_instr_end
+
cnode = shift iter
cpast = tree.'get'('past', cnode, 'PIRGrammar::labeled_pir_instr')
past.'push'(cpast)
- goto iter_loop
- iter_end:
+ goto iter_instr_loop
+ iter_instr_end:
.return (past)
}
+transform past (PIRGrammar::param_decl) :language('PIR') {
+ .local pmc past, name
+ past = new 'PAST::Var'
+ name = node['id']
+ unless null name goto done
+ name = node['reg']
+ done:
+
+ past.'init'('node'=>node, 'scope'=>'parameter', 'name'=>name)
+ .return (past)
+}
transform past (PIRGrammar::local_decl) :language('PIR') {
-
+ .local pmc past, cnode
+ past = new 'PAST::Op'
+ $P0 = node['type']
+ cnode = tree.'get'('past', $P0, 'PIRGrammar::type')
+ past.'push'(cnode)
+ past.'init'('node'=>node, 'pasttype'=>'pirop',
'pirop'=>'.local')
+ .return (past)
+}
+
+transform past (PIRGrammar::type) :language('PIR') {
+ .local pmc past
+ past = new 'PAST::Val'
+ past.'init'('node'=>node, 'vtype'=>'.String', 'ctype'=>'s')
+ .return (past)
}
transform past (PIRGrammar::lexical_decl) :language('PIR') {
-
+ .local pmc past
+ past = new 'PAST::Op'
+ past.'init'('node'=>node, 'pasttype'=>'pirop', 'pirop'=>'.lex')
+ .return (past)
}
transform past (PIRGrammar::const_def) :language('PIR') {
-
+ .local pmc past
+ past = new 'PAST::Op'
+ past.'init'('node'=>node, 'pasttype'=>'pirop',
'pirop'=>'.const')
+ .return (past)
}
transform past (PIRGrammar::assignment_stat) :language('PIR') {
-
+ .local pmc past, lhs
+ past = new 'PAST::Var'
+ lhs = node['target']
+ if null lhs goto others
+ past.'init'('node'=>lhs, 'name'=>lhs, 'scope'=>'lexical',
'islvalue'=>1)
+
+ .return (past)
+ others:
}
transform past (PIRGrammar::open_namespace) :language('PIR') {
- .local pmc past
- past = new 'PASM::Op'
- past.'init'('node'=>node, 'pasttype'=>'pirop', 'pirop'=>'.namespace')
- .return (past)
+ .local pmc past
+ past = new 'PAST::Op'
+ past.'init'('node'=>node, 'pasttype'=>'pirop',
'pirop'=>'.namespace')
+ .return (past)
}
transform past (PIRGrammar::close_namespace) :language('PIR') {
- .local pmc past
- past = new 'PASM::Op'
- past.'init'('node'=>node, 'pasttype'=>'pirop',
'pirop'=>'.endnamespace')
- .return (past)
+ .local pmc past
+ past = new 'PAST::Op'
+ past.'init'('node'=>node, 'pasttype'=>'pirop',
'pirop'=>'.endnamespace')
+ .return (past)
}
transform past (PIRGrammar::return_stat) :language('PIR') {
-
+ .local pmc past, begin_ret, end_ret
+ past = new 'PAST::Stmts'
+
+ begin_ret = new 'PAST::Op'
+ begin_ret.'init'('node'=>node, 'pasttype'=>'pirop',
'pirop'=>'.pcc_begin_return')
+ past.'push'(begin_ret)
+ end_ret = new 'PAST::Op'
+ end_ret.'init'('node'=>node, 'pasttype'=>'pirop',
'pirop'=>'.pcc_end_return')
+ past.'push'(end_ret)
+
+ .return (past)
}
transform past (PIRGrammar::sub_invocation) :language('PIR') {
+ .local pmc past, op_begin, op_call, op_end
+ past = new 'PAST::Stmts'
+ op_begin = new 'PAST::Op'
+ op_begin.'init'('node'=>node, 'pasttype'=>'pirop',
'pirop'=>'.pcc_begin')
+ past.'push'(op_begin)
+
+ op_call = new 'PAST::Op'
+ op_call.'init'('node'=>node, 'pasttype'=>'pirop',
'pirop'=>'.pcc_call')
+ past.'push'(op_call)
+
+ op_end = new 'PAST::Op'
+ op_end.'init'('node'=>node, 'pasttype'=>'pirop',
'pirop'=>'.pcc_end')
+ past.'push'(op_end)
+
+ .return (past)
}
@@ -194,20 +338,59 @@
}
+transform past (PIRGrammar::globalconst_def) :language('PIR') {
+ .local pmc past
+ past = new 'PAST::Op'
+ past.'init'('node'=>node, 'pasttype'=>'pirop',
'pirop'=>'.globalconst')
+ .return (past)
+}
+
+transform past (PIRGrammar::conditional_stat) :language('PIR') {
+ .local pmc past, expr, exprnode, gotolabel, block
+ expr = node['conditional_expr']
+ gotolabel = node['id']
+
+ past = new 'PAST::Op'
+ $P0 = node['if']
+ if null $P0 goto unless_stat
+
+ if_stat:
+ past.'init'('node'=>node, 'pasttype'=>'pirop', 'pirop'=>'if')
+ goto do_body
+
+ unless_stat:
+ past.'init'('node'=>node, 'pasttype'=>'pirop',
'pirop'=>'unless')
+
+ # now handle common stuff
+ do_body:
+ #exprnode = tree.'get'('past', expr,
'PIRGrammar::conditional_expr')
+ #past.'push'(exprnode)
+ #past.'push'(gotolabel)
+ .return (past)
+}
+
+transform past (PIRGrammar::conditional_expr) :language('PIR') {
+ .local pmc past
+ past = node['simple_expr']
+ .return (past)
+}
+
transform past (PIRGrammar::jump_stat) :language('PIR') {
.local pmc past
- past = new 'PASM::Op'
+ past = new 'PAST::Op'
past.'init'('node'=>node, 'pasttype'=>'pirop', 'pirop'=>'goto')
.return (past)
}
transform past (PIRGrammar::source_info) :language('PIR') {
-
-}
-
-
-transform past (PIRGrammar::instr) :language('PIR') {
- printerr "instr\n"
+ .local pmc past
+ past = new 'PAST::Op'
+ past.'init'('node'=>node, 'pasttype'=>'pirop', 'pirop'=>'#line')
+ .return (past)
+}
+
+
+transform past (PIRGrammar::instr) :language('PIR') {
$P0 = node['pir_instr']
if null $P0 goto pasm_instr
pir_instr:
@@ -235,13 +418,21 @@
if null $P0 goto lexical_decl
.return tree.'get'('past', $P0, 'PIRGrammar::local_decl')
lexical_decl:
- $P0 = node['local_decl']
+ $P0 = node['lexical_decl']
if null $P0 goto const_def
.return tree.'get'('past', $P0, 'PIRGrammar::lexical_decl')
const_def:
$P0 = node['const_def']
+ if null $P0 goto globalconst_def
+ .return tree.'get'('past', $P0, 'PIRGrammar::const_def')
+ globalconst_def:
+ $P0 = node['globalconst_def']
+ if null $P0 goto conditional_stat
+ .return tree.'get'('past', $P0, 'PIRGrammar::globalconst_def')
+ conditional_stat:
+ $P0 = node['conditional_stat']
if null $P0 goto assignment_stat
- .return tree.'get'('past', $P0, 'PIRGrammar::const_def')
+ .return tree.'get'('past', $P0, 'PIRGrammar::conditional_stat')
assignment_stat:
$P0 = node['assignment_stat']
if null $P0 goto open_namespace
@@ -263,9 +454,11 @@
if null $P0 goto macro_invocation
.return tree.'get'('past', $P0, 'PIRGrammar::sub_invocation')
macro_invocation:
- $P0 = node['assignment_stat']
- if null $P0 goto lexical_decl
+ $P0 = node['macro_invocation']
+ if null $P0 goto unknown
.return tree.'get'('past', $P0, 'PIRGrammar::macro_invocation')
+ unknown:
+ printerr "Error in Tree Transform!\n"
}
@@ -277,7 +470,7 @@
.local pmc past
past = new 'PAST::Op'
# FIX: set the correct pirop
- past.'init'('node'=>node, 'pasttype'=>'pirop', 'pirop'=>'XX')
+ past.'init'('node'=>node, 'pasttype'=>'pirop', 'pirop'=>node)
.return (past)
}
Modified: trunk/languages/PIR/lib/pir.pg
==============================================================================
--- trunk/languages/PIR/lib/pir.pg (original)
+++ trunk/languages/PIR/lib/pir.pg Mon Feb 12 14:22:32 2007
@@ -228,16 +228,16 @@
}
rule const_def_tail {
- [ [ int <const_assign>
+ [ [ <'int'> <const_assign>
[ <int_constant> | <syntax_error: integer constant expected> ]
]
- | [ num <const_assign>
+ | [ <'num'> <const_assign>
[ <float_constant> | <syntax_error: floating point constant expected> ]
]
- | [ pmc <const_assign>
+ | [ [ <'pmc'> | <macro_id> | <id> ] <const_assign>
[ <string_constant> | <syntax_error: string constant expected> ]
]
- | [ string <const_assign>
+ | [ <'string'> <const_assign>
[ <string_constant> | <syntax_error: string constant expected> ]
]
| <syntax_error: type expected for constant>
@@ -255,13 +255,15 @@
rule conditional_stat {
[ <'if'> | <'unless'> ]
- [ <'null'> <target>
- | <simple_expr> [ <relational_operator> <simple_expr> ]?
- ]
+ <conditional_expr>
[ <'goto'> | <syntax_error: 'goto' expected> ]
[ <id> | <pasm_instr> | <syntax_error: label identifier expected> ]
}
+rule conditional_expr {
+ [ <'null'> <target> ]
+ | [ <simple_expr> [ <relational_operator> <simple_expr> ]? ]
+}
## Jump statements
##
@@ -693,7 +695,7 @@
}
rule source_info {
- <'.line'> <int_constant> [ \, <string_constant> ]?
+ <'.line'> <int_constant> [ <','> <string_constant> ]?
}
@@ -753,9 +755,11 @@
| <'pmc'>
| <'object'>
| <'string'>
- | <'Array'>
- | <'Hash'>
+
]
+ #| <'Array'>
+ #| <'Hash'>
+
}
token target {