hi, attached a patch for languages/PIR, fixing:
* changed PIRGrammar into PIR::Grammar (changes many files) * updated pirgrammar.pod * updates to ASTGrammar.tg regards, kjs
Index: languages/PIR/docs/pirgrammar.pod =================================================================== --- languages/PIR/docs/pirgrammar.pod (revision 17008) +++ languages/PIR/docs/pirgrammar.pod (working copy) @@ -308,7 +308,7 @@ .param num nParam .param pmc argv :slurpy .param string sParam :named('foo') - .param $P0 :named('bar') + .param $P0 :named('bar') # body .end @@ -327,8 +327,16 @@ :named('x') -The parameter is known in the called sub by name C<'x'>. +The parameter is known in the called sub by name C<'x'>. The C<:named> flag can also be used B<without> an +identifier, in combination with the C<:flat> or C<:slurpy> flag, i.e. on a container holding several values: + .param pmc args :slurpy :named + +and + + .arg args :flat :named + + =item * :optional @@ -453,6 +461,15 @@ .local pmc p .lex 'i', p +The same is true when a parameter should be stored as a lexical: + + .param pmc p + .lex 'i', p + +So, now it is also clear why C<.lex 'i', p> is B<not> a declaration of p: +it needs a separate declaration, because it may either be a C<.local> or a C<.param>. +The C<.lex> directive merely is a shortcut for saving and retrieving lexical variables. + =head2 Global definitions global_def: @@ -795,8 +812,14 @@ Pass the denoted argument into the named parameter that is denoted by 'x', like so: - .param <type> <identifier> :named('x') + .param int myX :named('x') # the type 'int' is just an example +As was mentioned at the parameter declaration section, the C<:named> section can be used +on an aggregate value in combination with the C<:flat> flag. + + .arg pmc myArgs :flat :named + + =back .local pmc arr @@ -840,6 +863,7 @@ obj.'toString'() # call the method 'toString' obj.x() # call the method whose name is stored in 'x'. +Note that no spaces are allowed between the invocant and the dot; "obj . 'toString'" is not valid. IMCC also allows the "->" instead of a dot, to make it readable for C++ programmers: obj->'toString'() @@ -929,7 +953,14 @@ foo() # returns 42 foo() # returns 43 +NOTE: IMCC allows for writing: + .pcc_begin_yield + ... + .pcc_end_return + +which is of course not consistent; languages/PIR does B<not> allow this. + =head2 Short yield statements short_yield_stat: @@ -956,8 +987,11 @@ .return(results) The call to C<foo> can be considered a normal function call with respect to parameters: it can take the exact -same format using argument flags. +same format using argument flags. The tail call can also be a method call, like so: + .return obj.'foo'() + + =head2 Symbol namespaces open_namespace: @@ -1132,8 +1166,11 @@ =head2 Tokens, types and targets string_constant: - charset_specifier? quoted_string + [ encoding_specifier? charset_specifier ]? quoted_string + encoding_specifier: + "utf8:" + charset_specifier: "ascii:" | "binary:" @@ -1161,7 +1198,11 @@ but if desirable, the character set can be specified: unicode:"Hello world" + +When using the "unicode" character set, one can also specify an encoding specifier; currently only C<utf8> is allowed: + utf8:unicode:"hello world" + IMCC currently allows identifiers to be used as types. During the parse, the identifier is checked whether it is a defined class. The built-in types int, num, pmc and string are always available. Index: languages/PIR/examples/test.pir =================================================================== --- languages/PIR/examples/test.pir (revision 17008) +++ languages/PIR/examples/test.pir (working copy) @@ -1,3 +1,4 @@ +.include 'HELLO' .sub 'main' :main Index: languages/PIR/lib/ASTGrammar.tg =================================================================== --- languages/PIR/lib/ASTGrammar.tg (revision 17008) +++ languages/PIR/lib/ASTGrammar.tg (working copy) @@ -10,21 +10,21 @@ .local pmc past past = new 'PAST::Block' #past.'init'('node'=>node) - past.'init'('node'=>node, 'name'=>'anon') + past.'init'('node'=>node, 'blocktype'=>'immediate', 'name'=>'anon') .local pmc childnode, childpast childnode = node['program'] - childpast = tree.'get'('past', childnode, 'PIRGrammar::program') + childpast = tree.'get'('past', childnode, 'PIR::Grammar::program') past.'push'(childpast) .return (past) #.return (childpast) } -# past (PIRGrammar::program) +# past (PIR::Grammar::program) # # Store each of the compilation units into a PAST::Stmts node. # -transform past (PIRGrammar::program) :language('PIR') { +transform past (PIR::Grammar::program) :language('PIR') { .local pmc past past = new 'PAST::Stmts' past.'init'('node'=>node) @@ -37,53 +37,53 @@ unless iter goto iter_end .local pmc cnode, cpast cnode = shift iter - cpast = tree.'get'('past', cnode, 'PIRGrammar::compilation_unit') + cpast = tree.'get'('past', cnode, 'PIR::Grammar::compilation_unit') past.'push'(cpast) goto iter_loop iter_end: .return (past) } -# past (PIRGrammar::compilation_unit) +# past (PIR::Grammar::compilation_unit) # # Call the appropiate transform rule depending on the type of compilation unit. # -transform past (PIRGrammar::compilation_unit) :language('PIR') { +transform past (PIR::Grammar::compilation_unit) :language('PIR') { global_def: $P0 = node['global_def'] if null $P0 goto sub_def - .return tree.'get'('past', $P0, 'PIRGrammar::global_def') + .return tree.'get'('past', $P0, 'PIR::Grammar::global_def') sub_def: $P0 = node['sub_def'] if null $P0 goto const_def - .return tree.'get'('past', $P0, 'PIRGrammar::sub_def') + .return tree.'get'('past', $P0, 'PIR::Grammar::sub_def') const_def: $P0 = node['const_def'] if null $P0 goto macro_def - .return tree.'get'('past', $P0, 'PIRGrammar::const_def') + .return tree.'get'('past', $P0, 'PIR::Grammar::const_def') macro_def: $P0 = node['macro_def'] if null $P0 goto pragma - .return tree.'get'('past', $P0, 'PIRGrammar::macro_def') + .return tree.'get'('past', $P0, 'PIR::Grammar::macro_def') pragma: $P0 = node['pragma'] if null $P0 goto emit - .return tree.'get'('past', $P0, 'PIRGrammar::pragma') + .return tree.'get'('past', $P0, 'PIR::Grammar::pragma') emit: $P0 = node['emit'] if null $P0 goto const_def - .return tree.'get'('past', $P0, 'PIRGrammar::emit') + .return tree.'get'('past', $P0, 'PIR::Grammar::emit') } -transform past (PIRGrammar::global_def) :language('PIR') { +transform past (PIR::Grammar::global_def) :language('PIR') { } -# past (PIRGrammar::sub_def) +# past (PIR::Grammar::sub_def) # # Transform a sub_def into a PAST::Block node. # -transform past (PIRGrammar::sub_def) :language('PIR') { +transform past (PIR::Grammar::sub_def) :language('PIR') { .local pmc past past = new 'PAST::Block' @@ -95,22 +95,22 @@ .local pmc pnode, pragma pnode = node['sub_pragmas'] if null pnode goto skip_pragma - pragma = tree.'get'('past', pnode, 'PIRGrammar::sub_pragma') + pragma = tree.'get'('past', pnode, 'PIR::Grammar::sub_pragma') past.'pragma'(pragma) skip_pragma: .local pmc child $P1 = node['body'] - child = tree.'get'('past', $P1, 'PIRGrammar::body') + child = tree.'get'('past', $P1, 'PIR::Grammar::body') past.'push'(child) .return (past) } -#transform past (PIRGrammar::sub_pragmas) { +#transform past (PIR::Grammar::sub_pragmas) { # #} -transform past (PIRGrammar::sub_pragma) { +transform past (PIR::Grammar::sub_pragma) { .local pmc past past = node[':main'] ### mmm why does *this* work for all pragmas?? if null past goto skip @@ -119,7 +119,7 @@ .return () } -transform past (PIRGrammar::const_def) :language('PIR') { +transform past (PIR::Grammar::const_def) :language('PIR') { .local pmc past past = new 'PASM::Op' # FIX: @@ -127,56 +127,87 @@ .return (past) } -transform past (PIRGrammar::macro_def) :language('PIR') { +transform past (PIR::Grammar::macro_def) :language('PIR') { } -transform past (PIRGrammar::pragma) :language('PIR') { +transform past (PIR::Grammar::pragma) :language('PIR') { .local pmc past include_pragma: - $P0 = node['.include'] + $P0 = node['include'] if null $P0 goto n_op_pragma - past = new 'PASM::Op' - past.'init'('node'=>node, 'pasttype'=>'pirop', 'pirop'=>'.include') - .return (past) + #past = new 'PAST::Op' + #past.'init'('node'=>node, 'pasttype'=>'pirop', 'pirop'=>'.include') + .return tree.'get'('past', $P0, 'PIR::Grammar::include') + #.return (past) n_op_pragma: + $P0 = node['new_operators'] if null $P0 goto loadlib_pragma - past = new 'PASM::Op' + past = new 'PAST::Op' past.'init'('node'=>node, 'pasttype'=>'pirop', 'pirop'=>'.include') .return (past) loadlib_pragma: + $P0 = node['loadlib'] if null $P0 goto namespace_pragma - past = new 'PASM::Op' + past = new 'PAST::Op' past.'init'('node'=>node, 'pasttype'=>'pirop', 'pirop'=>'.include') .return (past) namespace_pragma: + $P0 = node['namespace'] if null $P0 goto hll_map_pragma - past = new 'PASM::Op' + past = new 'PAST::Op' past.'init'('node'=>node, 'pasttype'=>'pirop', 'pirop'=>'.include') .return (past) hll_map_pragma: + $P0 = node['hll_mapping'] if null $P0 goto hll_spec_pragma - past = new 'PASM::Op' + past = new 'PAST::Op' past.'init'('node'=>node, 'pasttype'=>'pirop', 'pirop'=>'.include') .return (past) hll_spec_pragma: + $P0 = node['hll_specifier'] if null $P0 goto source_pragma - past = new 'PASM::Op' + past = new 'PAST::Op' past.'init'('node'=>node, 'pasttype'=>'pirop', 'pirop'=>'.include') .return (past) source_pragma: + $P0 = node['source_info'] if null $P0 goto unknown - past = new 'PASM::Op' + past = new 'PAST::Op' past.'init'('node'=>node, 'pasttype'=>'pirop', 'pirop'=>'.include') .return (past) + unknown: printerr "unknown pragma in tree transformation\n" + .local pmc iter, obj + iter = new .Iterator, node + loop: + unless iter goto endloop + obj = shift iter + printerr obj + printerr "\n" + goto loop + endloop: + end } -transform past (PIRGrammar::emit) :language('PIR') { +transform past (PIR::Grammar::include) :language('PIR') { + .local pmc past + + .local pmc strn, strp + strn = node['string_constant'] + strp = tree.'get'('past', strn, 'PIR::Grammar::string_constant') + + past = new 'PAST::Op' + past.'init'('node'=>node, 'pasttype'=>'inline', 'inline'=>".include %0") + past.'push'(strp) + .return (past) +} + +transform past (PIR::Grammar::emit) :language('PIR') { .local pmc past, startop, endop past = new 'PAST::Block' past.'init'('node'=>node) @@ -193,11 +224,11 @@ } -# past (PIRGrammar::body) +# past (PIR::Grammar::body) # # Store each of the instructions in a body node in a PAST::Stmts node. # -transform past (PIRGrammar::body) :language('PIR') { +transform past (PIR::Grammar::body) :language('PIR') { .local pmc past past = new 'PAST::Stmts' past.'init'('node'=>node) @@ -212,7 +243,7 @@ iter_param_loop: unless iter goto iter_param_end cnode = shift iter - cpast = tree.'get'('past', cnode, 'PIRGrammar::param_decl') + cpast = tree.'get'('past', cnode, 'PIR::Grammar::param_decl') past.'push'(cpast) goto iter_param_loop iter_param_end: @@ -225,58 +256,68 @@ unless iter goto iter_instr_end cnode = shift iter - cpast = tree.'get'('past', cnode, 'PIRGrammar::labeled_pir_instr') + cpast = tree.'get'('past', cnode, 'PIR::Grammar::labeled_pir_instr') past.'push'(cpast) 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: +transform past (PIR::Grammar::param_decl) :language('PIR') { + .local pmc past + past = new 'PAST::Op' - past.'init'('node'=>node, 'scope'=>'parameter', 'name'=>name) + $P0 = node['id'] + if null $P0 goto get_reg + .local pmc idpast, typepast, typenode + idpast = tree.'get'('past', $P0, 'PIR::Grammar::id') + typenode = node['type'] + typepast = tree.'get'('past', typenode, 'PIR::Grammar::type') + + past.'init'('node'=>node, 'pasttype'=>'inline', 'inline'=>".param %0 %1") + past.'push'(typepast) + past.'push'(idpast) + goto done + + get_reg: + .local pmc regnode, regpast + regnode = node['reg'] + regpast = tree.'get'('past', regnode, 'PIR::Grammar::reg') + past.'init'('node'=>node, 'pasttype'=>'inline', 'inline'=>".param %0") + past.'push'(regpast) + + done: .return (past) } -transform past (PIRGrammar::local_decl) :language('PIR') { +transform past (PIR::Grammar::local_decl) :language('PIR') { .local pmc past, cnode past = new 'PAST::Op' $P0 = node['type'] - cnode = tree.'get'('past', $P0, 'PIRGrammar::type') + cnode = tree.'get'('past', $P0, 'PIR::Grammar::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') { + +transform past (PIR::Grammar::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') { +transform past (PIR::Grammar::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') { +transform past (PIR::Grammar::assignment_stat) :language('PIR') { .local pmc past, lhs past = new 'PAST::Var' lhs = node['target'] @@ -287,21 +328,21 @@ others: } -transform past (PIRGrammar::open_namespace) :language('PIR') { +transform past (PIR::Grammar::open_namespace) :language('PIR') { .local pmc past past = new 'PAST::Op' past.'init'('node'=>node, 'pasttype'=>'pirop', 'pirop'=>'.namespace') .return (past) } -transform past (PIRGrammar::close_namespace) :language('PIR') { +transform past (PIR::Grammar::close_namespace) :language('PIR') { .local pmc past past = new 'PAST::Op' past.'init'('node'=>node, 'pasttype'=>'pirop', 'pirop'=>'.endnamespace') .return (past) } -transform past (PIRGrammar::return_stat) :language('PIR') { +transform past (PIR::Grammar::return_stat) :language('PIR') { .local pmc past, begin_ret, end_ret past = new 'PAST::Stmts' @@ -315,7 +356,7 @@ .return (past) } -transform past (PIRGrammar::sub_invocation) :language('PIR') { +transform past (PIR::Grammar::sub_invocation) :language('PIR') { .local pmc past, op_begin, op_call, op_end past = new 'PAST::Stmts' op_begin = new 'PAST::Op' @@ -334,18 +375,18 @@ } -transform past (PIRGrammar::macro_invocation) :language('PIR') { +transform past (PIR::Grammar::macro_invocation) :language('PIR') { } -transform past (PIRGrammar::globalconst_def) :language('PIR') { +transform past (PIR::Grammar::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') { +transform past (PIR::Grammar::conditional_stat) :language('PIR') { .local pmc past, expr, exprnode, gotolabel, block expr = node['conditional_expr'] gotolabel = node['id'] @@ -363,26 +404,26 @@ # now handle common stuff do_body: - #exprnode = tree.'get'('past', expr, 'PIRGrammar::conditional_expr') + #exprnode = tree.'get'('past', expr, 'PIR::Grammar::conditional_expr') #past.'push'(exprnode) #past.'push'(gotolabel) .return (past) } -transform past (PIRGrammar::conditional_expr) :language('PIR') { +transform past (PIR::Grammar::conditional_expr) :language('PIR') { .local pmc past past = node['simple_expr'] .return (past) } -transform past (PIRGrammar::jump_stat) :language('PIR') { +transform past (PIR::Grammar::jump_stat) :language('PIR') { .local pmc past past = new 'PAST::Op' past.'init'('node'=>node, 'pasttype'=>'pirop', 'pirop'=>'goto') .return (past) } -transform past (PIRGrammar::source_info) :language('PIR') { +transform past (PIR::Grammar::source_info) :language('PIR') { .local pmc past past = new 'PAST::Op' past.'init'('node'=>node, 'pasttype'=>'pirop', 'pirop'=>'#line') @@ -390,83 +431,83 @@ } -transform past (PIRGrammar::instr) :language('PIR') { +transform past (PIR::Grammar::instr) :language('PIR') { $P0 = node['pir_instr'] if null $P0 goto pasm_instr pir_instr: - .return tree.'get'('past', $P0, 'PIRGrammar::pir_instr') + .return tree.'get'('past', $P0, 'PIR::Grammar::pir_instr') pasm_instr: $P0 = node['pasm_instr'] - .return tree.'get'('past', $P0, 'PIRGrammar::pasm_instr') + .return tree.'get'('past', $P0, 'PIR::Grammar::pasm_instr') } -transform past (PIRGrammar::labeled_pir_instr) :language('PIR') { +transform past (PIR::Grammar::labeled_pir_instr) :language('PIR') { $P0 = node['instr'] if null $P0 goto end - .return tree.'get'('past', $P0, 'PIRGrammar::instr') + .return tree.'get'('past', $P0, 'PIR::Grammar::instr') end: } -# past (PIRGrammar::pir_instr) +# past (PIR::Grammar::pir_instr) # # Return the transformed tree of a PIR instruction. # -transform past (PIRGrammar::pir_instr) :language('PIR') { +transform past (PIR::Grammar::pir_instr) :language('PIR') { local_decl: $P0 = node['local_decl'] if null $P0 goto lexical_decl - .return tree.'get'('past', $P0, 'PIRGrammar::local_decl') + .return tree.'get'('past', $P0, 'PIR::Grammar::local_decl') lexical_decl: $P0 = node['lexical_decl'] if null $P0 goto const_def - .return tree.'get'('past', $P0, 'PIRGrammar::lexical_decl') + .return tree.'get'('past', $P0, 'PIR::Grammar::lexical_decl') const_def: $P0 = node['const_def'] if null $P0 goto globalconst_def - .return tree.'get'('past', $P0, 'PIRGrammar::const_def') + .return tree.'get'('past', $P0, 'PIR::Grammar::const_def') globalconst_def: $P0 = node['globalconst_def'] if null $P0 goto conditional_stat - .return tree.'get'('past', $P0, 'PIRGrammar::globalconst_def') + .return tree.'get'('past', $P0, 'PIR::Grammar::globalconst_def') conditional_stat: $P0 = node['conditional_stat'] if null $P0 goto assignment_stat - .return tree.'get'('past', $P0, 'PIRGrammar::conditional_stat') + .return tree.'get'('past', $P0, 'PIR::Grammar::conditional_stat') assignment_stat: $P0 = node['assignment_stat'] if null $P0 goto open_namespace - .return tree.'get'('past', $P0, 'PIRGrammar::assignment_stat') + .return tree.'get'('past', $P0, 'PIR::Grammar::assignment_stat') open_namespace: $P0 = node['open_namespace'] if null $P0 goto close_namespace - .return tree.'get'('past', $P0, 'PIRGrammar::open_namespace') + .return tree.'get'('past', $P0, 'PIR::Grammar::open_namespace') close_namespace: $P0 = node['close_namespace'] if null $P0 goto return_stat - .return tree.'get'('past', $P0, 'PIRGrammar::close_namespace') + .return tree.'get'('past', $P0, 'PIR::Grammar::close_namespace') return_stat: $P0 = node['return_stat'] if null $P0 goto sub_invocation - .return tree.'get'('past', $P0, 'PIRGrammar::return_stat') + .return tree.'get'('past', $P0, 'PIR::Grammar::return_stat') sub_invocation: $P0 = node['sub_invocation'] if null $P0 goto macro_invocation - .return tree.'get'('past', $P0, 'PIRGrammar::sub_invocation') + .return tree.'get'('past', $P0, 'PIR::Grammar::sub_invocation') macro_invocation: $P0 = node['macro_invocation'] if null $P0 goto unknown - .return tree.'get'('past', $P0, 'PIRGrammar::macro_invocation') + .return tree.'get'('past', $P0, 'PIR::Grammar::macro_invocation') unknown: printerr "Error in Tree Transform!\n" } -# past (PIRGrammar::pasm_instr) +# past (PIR::Grammar::pasm_instr) # # Create a PAST::Op node that represents the PASM instruction # -transform past (PIRGrammar::pasm_instr) :language('PIR') { +transform past (PIR::Grammar::pasm_instr) :language('PIR') { .local pmc past past = new 'PAST::Op' # FIX: set the correct pirop @@ -476,7 +517,7 @@ -transform past (PIRGrammar::simple_expr) :language('PIR') { +transform past (PIR::Grammar::simple_expr) :language('PIR') { .local pmc past int_constant: $P0 = node['int_constant'] @@ -493,28 +534,41 @@ string_constant: $P0 = node['string_constant'] if null $P0 goto target - .return tree.'get'('past', $P0, 'PIRGrammar::string_constant') + .return tree.'get'('past', $P0, 'PIR::Grammar::string_constant') target: $P0 = node['target'] - .return tree.'get'('past', $P0, 'PIRGrammar::target') + .return tree.'get'('past', $P0, 'PIR::Grammar::target') } -transform past (PIRGrammar::target) :language('PIR') { +transform past (PIR::Grammar::target) :language('PIR') { } +transform past (PIR::Grammar::id) :language('PIR') { + .local pmc past + past = new 'PAST::Val' + past.'init'('node'=>node, 'name'=>node, 'ctype'=>'~') + .return (past) +} -transform past (PIRGrammar::string_constant) :language('PIR') { +transform past (PIR::Grammar::type) :language('PIR') { + .local pmc past + past = new 'PAST::Val' + past.'init'('node'=>node, 'name'=>node) + .return (past) +} + +transform past (PIR::Grammar::string_constant) :language('PIR') { stringsingle: $P0 = node['stringsingle'] if null $P0 goto stringdouble - .return tree.'get'('past', $P0, 'PIRGrammar::stringsingle') + .return tree.'get'('past', $P0, 'PIR::Grammar::stringsingle') stringdouble: $P0 = node['stringsingle'] - .return tree.'get'('past', $P0, 'PIRGrammar::stringsingle') + .return tree.'get'('past', $P0, 'PIR::Grammar::stringdouble') } -transform past (PIRGrammar::stringdouble) :language('PIR') { +transform past (PIR::Grammar::stringdouble) :language('PIR') { .local pmc result result = new 'PAST::Val' @@ -535,20 +589,19 @@ .return (result) } -transform past (PIRGrammar::stringsingle) :language('PIR') { - .local pmc result +transform past (PIR::Grammar::stringsingle) :language('PIR') { + .local pmc result result = new 'PAST::Val' - + .local string value # Check if this is a string match $I0 = defined node["PGE::Text::bracketed"] - if $I0 goto bracketed_value + if $I0 goto bracketed_value value = node goto no_bracketed_value bracketed_value: - value = node["PGE::Text::bracketed"] - no_bracketed_value: - - result.'init'('node'=>node, 'vtype'=>'.String', 'name'=>value) - .return (result) + value = node["PGE::Text::bracketed"] + no_bracketed_value: + result.'init'('node'=>node, 'vtype'=>'.String', 'name'=>value) + .return (result) } Index: languages/PIR/lib/pasm.pg =================================================================== --- languages/PIR/lib/pasm.pg (revision 17008) +++ languages/PIR/lib/pasm.pg (working copy) @@ -1,4 +1,4 @@ -grammar PIRGrammar; +grammar PIR::Grammar; # Index: languages/PIR/lib/pasm_core.pg =================================================================== --- languages/PIR/lib/pasm_core.pg (revision 17008) +++ languages/PIR/lib/pasm_core.pg (working copy) @@ -1,4 +1,4 @@ -grammar PIRGrammar; +grammar PIR::Grammar; rule core_op { Index: languages/PIR/lib/pasm_instr.pg =================================================================== --- languages/PIR/lib/pasm_instr.pg (revision 17008) +++ languages/PIR/lib/pasm_instr.pg (working copy) @@ -1,4 +1,4 @@ -grammar PIRGrammar; +grammar PIR::Grammar; # This file lists all PASM instructions, the rule # <id> uses this rule as an assertion, so that no Index: languages/PIR/lib/pasm_io.pg =================================================================== --- languages/PIR/lib/pasm_io.pg (revision 17008) +++ languages/PIR/lib/pasm_io.pg (working copy) @@ -1,4 +1,4 @@ -grammar PIRGrammar; +grammar PIR::Grammar; rule io_op { # Index: languages/PIR/lib/pasm_pmc.pg =================================================================== --- languages/PIR/lib/pasm_pmc.pg (revision 17008) +++ languages/PIR/lib/pasm_pmc.pg (working copy) @@ -1,4 +1,4 @@ -grammar PIRGrammar; +grammar PIR::Grammar; rule pmc_op { callmethodcc <arg_hack> # Index: languages/PIR/lib/pir.pg =================================================================== --- languages/PIR/lib/pir.pg (revision 17008) +++ languages/PIR/lib/pir.pg (working copy) @@ -1,4 +1,4 @@ -grammar PIRGrammar; +grammar PIR::Grammar; # TO DO: # 1. fix Heredocs parsing Index: languages/PIR/pirc.pir =================================================================== --- languages/PIR/pirc.pir (revision 17008) +++ languages/PIR/pirc.pir (working copy) @@ -16,7 +16,7 @@ $P0 = new [ 'HLLCompiler' ] $P0.'language'('languages-PIR') - $P0.'parsegrammar'('PIRGrammar') + $P0.'parsegrammar'('PIR::Grammar') $P0.'astgrammar'('ASTGrammar') .end @@ -136,14 +136,14 @@ .end -.namespace [ 'PIRGrammar' ] +.namespace [ 'PIR::Grammar' ] .sub _load :load :init load_bytecode 'PGE.pbc' load_bytecode 'PGE/Text.pbc' $P0 = getclass 'PGE::Grammar' - $P1 = subclass $P0, 'PIRGrammar' + $P1 = subclass $P0, 'PIR::Grammar' # The parser is split up into several files # for faster edit-compile-test cycles. @@ -158,7 +158,37 @@ load_bytecode 'languages/PIR/lib/pasm_core_gen.pbc' .end +.sub parenthesized_args_2 + .param pmc mob + .param pmc adverbs :slurpy :named + .local pmc match + .local string target + .local int cpos, mfrom, mpos + + (mob, target, mfrom, mpos) = mob.'newfrom'(mob) + printerr "Target: [" + printerr target + printerr "]" + printerr "\n" + $S0 = mob.'text'() + printerr $S0 + mob.'next'() + $S0 = mob.'text'() + printerr $S0 + + # + #printerr match + #printerr "\n" + # + #printerr cpos + #printerr "\n" + #printerr target + #printerr "\n" + .return(mob) +.end + + .sub warning .param pmc self .param string message Index: languages/PIR/PROPOSALS =================================================================== --- languages/PIR/PROPOSALS (revision 17008) +++ languages/PIR/PROPOSALS (working copy) @@ -99,26 +99,9 @@ which line is being parsed/assembled. It'd be more consistent with respect to other PIR directives ('.include' etc.). The current spelling seems rather arbitrary. -8. Parameter and argument flags - :named without a parameter does not seem to work - ever. - - Proposal: require :named to take a parenthesized identifier. - -9. .lex + .local - When declaring a .lexical like: - - .lex "a", b - - one also needs the declaration: - - .local pmc b - - Proposal: remove the need for .local declaration. Parsing the .lex declaration - expands to including the .local declaration. - NEW FEATURE PROPOSALS GO HERE: Index: languages/PIR/t/assign.t =================================================================== --- languages/PIR/t/assign.t (revision 17008) +++ languages/PIR/t/assign.t (working copy) @@ -14,7 +14,7 @@ d = e .end CODE -"parse" => PMC 'PIRGrammar' { ... } +"parse" => PMC 'PIR::Grammar' { ... } Parse successful! OUT @@ -25,7 +25,7 @@ c = 0x10 .end CODE -"parse" => PMC 'PIRGrammar' { ... } +"parse" => PMC 'PIR::Grammar' { ... } Parse successful! OUT @@ -37,7 +37,7 @@ h = x[e] .end CODE -"parse" => PMC 'PIRGrammar' { ... } +"parse" => PMC 'PIR::Grammar' { ... } Parse successful! OUT @@ -49,7 +49,7 @@ x[e] = f .end CODE -"parse" => PMC 'PIRGrammar' { ... } +"parse" => PMC 'PIR::Grammar' { ... } Parse successful! OUT @@ -74,7 +74,7 @@ a = ~ x .end CODE -"parse" => PMC 'PIRGrammar' { ... } +"parse" => PMC 'PIR::Grammar' { ... } Parse successful! OUT @@ -92,7 +92,7 @@ x >>>= 1 .end CODE -"parse" => PMC 'PIRGrammar' { ... } +"parse" => PMC 'PIR::Grammar' { ... } Parse successful! OUT @@ -106,7 +106,7 @@ s = utf8:unicode:"Hello World" .end CODE -"parse" => PMC 'PIRGrammar' { ... } +"parse" => PMC 'PIR::Grammar' { ... } Parse successful! OUT Index: languages/PIR/t/branch.t =================================================================== --- languages/PIR/t/branch.t (revision 17008) +++ languages/PIR/t/branch.t (working copy) @@ -24,7 +24,7 @@ .end CODE -"parse" => PMC 'PIRGrammar' { ... } +"parse" => PMC 'PIR::Grammar' { ... } Parse successful! OUT @@ -47,7 +47,7 @@ .end CODE -"parse" => PMC 'PIRGrammar' { ... } +"parse" => PMC 'PIR::Grammar' { ... } Parse successful! OUT @@ -59,6 +59,6 @@ .end CODE -"parse" => PMC 'PIRGrammar' { ... } +"parse" => PMC 'PIR::Grammar' { ... } Parse successful! OUT Index: languages/PIR/t/call.t =================================================================== --- languages/PIR/t/call.t (revision 17008) +++ languages/PIR/t/call.t (working copy) @@ -31,7 +31,7 @@ .end CODE -"parse" => PMC 'PIRGrammar' { ... } +"parse" => PMC 'PIR::Grammar' { ... } Parse successful! OUT @@ -49,7 +49,7 @@ .end CODE -"parse" => PMC 'PIRGrammar' { ... } +"parse" => PMC 'PIR::Grammar' { ... } Parse successful! OUT @@ -68,7 +68,7 @@ .end CODE -"parse" => PMC 'PIRGrammar' { ... } +"parse" => PMC 'PIR::Grammar' { ... } Parse successful! OUT @@ -81,7 +81,7 @@ CODE -"parse" => PMC 'PIRGrammar' { ... } +"parse" => PMC 'PIR::Grammar' { ... } Parse successful! OUT @@ -96,7 +96,7 @@ .end CODE -"parse" => PMC 'PIRGrammar' { ... } +"parse" => PMC 'PIR::Grammar' { ... } Parse successful! OUT @@ -116,7 +116,7 @@ .end CODE -"parse" => PMC 'PIRGrammar' { ... } +"parse" => PMC 'PIR::Grammar' { ... } Parse successful! OUT @@ -135,7 +135,7 @@ .end CODE -"parse" => PMC 'PIRGrammar' { ... } +"parse" => PMC 'PIR::Grammar' { ... } Parse successful! OUT @@ -149,7 +149,7 @@ .end CODE -"parse" => PMC 'PIRGrammar' { ... } +"parse" => PMC 'PIR::Grammar' { ... } Parse successful! OUT @@ -164,7 +164,7 @@ .end CODE -"parse" => PMC 'PIRGrammar' { ... } +"parse" => PMC 'PIR::Grammar' { ... } Parse successful! OUT @@ -189,7 +189,7 @@ .end CODE -"parse" => PMC 'PIRGrammar' { ... } +"parse" => PMC 'PIR::Grammar' { ... } Parse successful! OUT Index: languages/PIR/t/compunit.t =================================================================== --- languages/PIR/t/compunit.t (revision 17008) +++ languages/PIR/t/compunit.t (working copy) @@ -13,7 +13,7 @@ .global g_Y CODE -"parse" => PMC 'PIRGrammar' { ... } +"parse" => PMC 'PIR::Grammar' { ... } Parse successful! OUT @@ -28,7 +28,7 @@ .const pmc pConst = "is a PMC const a string?" CODE -"parse" => PMC 'PIRGrammar' { ... } +"parse" => PMC 'PIR::Grammar' { ... } Parse successful! OUT @@ -38,7 +38,7 @@ .endm CODE -"parse" => PMC 'PIRGrammar' { ... } +"parse" => PMC 'PIR::Grammar' { ... } Parse successful! OUT @@ -48,7 +48,7 @@ .endm CODE -"parse" => PMC 'PIRGrammar' { ... } +"parse" => PMC 'PIR::Grammar' { ... } Parse successful! OUT @@ -58,7 +58,7 @@ .include "Hitchhikers.pir" CODE -"parse" => PMC 'PIRGrammar' { ... } +"parse" => PMC 'PIR::Grammar' { ... } Parse successful! OUT @@ -67,7 +67,7 @@ .loadlib "Hitchhikers" CODE -"parse" => PMC 'PIRGrammar' { ... } +"parse" => PMC 'PIR::Grammar' { ... } Parse successful! OUT @@ -76,7 +76,7 @@ .pragma n_operators 1 CODE -"parse" => PMC 'PIRGrammar' { ... } +"parse" => PMC 'PIR::Grammar' { ... } Parse successful! OUT @@ -87,7 +87,7 @@ .namespace [""] CODE -"parse" => PMC 'PIRGrammar' { ... } +"parse" => PMC 'PIR::Grammar' { ... } Parse successful! OUT @@ -98,7 +98,7 @@ .namespace ["PIR"] CODE -"parse" => PMC 'PIRGrammar' { ... } +"parse" => PMC 'PIR::Grammar' { ... } Parse successful! OUT @@ -109,7 +109,7 @@ .namespace ["PIR";"Grammar"] CODE -"parse" => PMC 'PIRGrammar' { ... } +"parse" => PMC 'PIR::Grammar' { ... } Parse successful! OUT @@ -118,7 +118,7 @@ .namespace CODE -"parse" => PMC 'PIRGrammar' { ... } +"parse" => PMC 'PIR::Grammar' { ... } Parse successful! OUT @@ -128,7 +128,7 @@ .HLL "PIR", "PIRlib" CODE -"parse" => PMC 'PIRGrammar' { ... } +"parse" => PMC 'PIR::Grammar' { ... } Parse successful! OUT @@ -137,7 +137,7 @@ .HLL_map 42, 10 CODE -"parse" => PMC 'PIRGrammar' { ... } +"parse" => PMC 'PIR::Grammar' { ... } Parse successful! OUT @@ -148,7 +148,7 @@ .line 42, "Hitchhikers.pir" CODE -"parse" => PMC 'PIRGrammar' { ... } +"parse" => PMC 'PIR::Grammar' { ... } Parse successful! OUT @@ -160,7 +160,7 @@ .eom CODE -"parse" => PMC 'PIRGrammar' { ... } +"parse" => PMC 'PIR::Grammar' { ... } Parse successful! OUT Index: languages/PIR/t/exotic.t =================================================================== --- languages/PIR/t/exotic.t (revision 17008) +++ languages/PIR/t/exotic.t (working copy) @@ -21,7 +21,7 @@ .end CODE -"parse" => PMC 'PIRGrammar' { ... } +"parse" => PMC 'PIR::Grammar' { ... } Parse successful! OUT @@ -33,7 +33,7 @@ .end CODE -"parse" => PMC 'PIRGrammar' { ... } +"parse" => PMC 'PIR::Grammar' { ... } Parse successful! OUT @@ -43,7 +43,7 @@ .end CODE -"parse" => PMC 'PIRGrammar' { ... } +"parse" => PMC 'PIR::Grammar' { ... } Parse successful! OUT @@ -53,6 +53,6 @@ .end CODE -"parse" => PMC 'PIRGrammar' { ... } +"parse" => PMC 'PIR::Grammar' { ... } Parse successful! OUT Index: languages/PIR/t/pirstat.t =================================================================== --- languages/PIR/t/pirstat.t (revision 17008) +++ languages/PIR/t/pirstat.t (working copy) @@ -15,7 +15,7 @@ .end CODE -"parse" => PMC 'PIRGrammar' { ... } +"parse" => PMC 'PIR::Grammar' { ... } Parse successful! OUT @@ -29,7 +29,7 @@ .end CODE -"parse" => PMC 'PIRGrammar' { ... } +"parse" => PMC 'PIR::Grammar' { ... } Parse successful! OUT @@ -42,7 +42,7 @@ .end CODE -"parse" => PMC 'PIRGrammar' { ... } +"parse" => PMC 'PIR::Grammar' { ... } Parse successful! OUT Index: languages/PIR/t/sub.t =================================================================== --- languages/PIR/t/sub.t (revision 17008) +++ languages/PIR/t/sub.t (working copy) @@ -10,7 +10,7 @@ .sub main .end CODE -"parse" => PMC 'PIRGrammar' { ... } +"parse" => PMC 'PIR::Grammar' { ... } Parse successful! OUT @@ -18,7 +18,7 @@ .sub main :main .end CODE -"parse" => PMC 'PIRGrammar' { ... } +"parse" => PMC 'PIR::Grammar' { ... } Parse successful! OUT @@ -26,7 +26,7 @@ .sub main :load .end CODE -"parse" => PMC 'PIRGrammar' { ... } +"parse" => PMC 'PIR::Grammar' { ... } Parse successful! OUT @@ -34,7 +34,7 @@ .sub main :init .end CODE -"parse" => PMC 'PIRGrammar' { ... } +"parse" => PMC 'PIR::Grammar' { ... } Parse successful! OUT @@ -42,7 +42,7 @@ .sub main :immediate .end CODE -"parse" => PMC 'PIRGrammar' { ... } +"parse" => PMC 'PIR::Grammar' { ... } Parse successful! OUT @@ -50,7 +50,7 @@ .sub main :lex .end CODE -"parse" => PMC 'PIRGrammar' { ... } +"parse" => PMC 'PIR::Grammar' { ... } Parse successful! OUT @@ -58,7 +58,7 @@ .sub main :anon .end CODE -"parse" => PMC 'PIRGrammar' { ... } +"parse" => PMC 'PIR::Grammar' { ... } Parse successful! OUT @@ -74,7 +74,7 @@ .end CODE -"parse" => PMC 'PIRGrammar' { ... } +"parse" => PMC 'PIR::Grammar' { ... } Parse successful! OUT @@ -82,7 +82,7 @@ .sub main :multi(int) .end CODE -"parse" => PMC 'PIRGrammar' { ... } +"parse" => PMC 'PIR::Grammar' { ... } Parse successful! OUT @@ -90,7 +90,7 @@ .sub main :multi(int, num) .end CODE -"parse" => PMC 'PIRGrammar' { ... } +"parse" => PMC 'PIR::Grammar' { ... } Parse successful! OUT @@ -98,7 +98,7 @@ .sub main :multi(_, int, num, string, pmc) .end CODE -"parse" => PMC 'PIRGrammar' { ... } +"parse" => PMC 'PIR::Grammar' { ... } Parse successful! OUT @@ -106,7 +106,7 @@ .sub main :multi(int, _, num, string, _) .end CODE -"parse" => PMC 'PIRGrammar' { ... } +"parse" => PMC 'PIR::Grammar' { ... } Parse successful! OUT @@ -114,7 +114,7 @@ .sub main :multi(_) .end CODE -"parse" => PMC 'PIRGrammar' { ... } +"parse" => PMC 'PIR::Grammar' { ... } Parse successful! OUT @@ -122,7 +122,7 @@ .sub main :multi(int, int, int, int) .end CODE -"parse" => PMC 'PIRGrammar' { ... } +"parse" => PMC 'PIR::Grammar' { ... } Parse successful! OUT @@ -130,7 +130,7 @@ .sub main :multi(_, _, _, _, _, _) .end CODE -"parse" => PMC 'PIRGrammar' { ... } +"parse" => PMC 'PIR::Grammar' { ... } Parse successful! OUT @@ -138,7 +138,7 @@ .sub main :vtable('__set_int') .end CODE -"parse" => PMC 'PIRGrammar' { ... } +"parse" => PMC 'PIR::Grammar' { ... } Parse successful! OUT @@ -146,7 +146,7 @@ .sub main :main :load :immediate :init .end CODE -"parse" => PMC 'PIRGrammar' { ... } +"parse" => PMC 'PIR::Grammar' { ... } Parse successful! OUT @@ -156,7 +156,7 @@ .sub main :main, :load, :immediate, :init .end CODE -"parse" => PMC 'PIRGrammar' { ... } +"parse" => PMC 'PIR::Grammar' { ... } Parse successful! OUT @@ -169,7 +169,7 @@ .param object oargs .end CODE -"parse" => PMC 'PIRGrammar' { ... } +"parse" => PMC 'PIR::Grammar' { ... } Parse successful! OUT @@ -181,7 +181,7 @@ .param int arg3 :opt_flag .end CODE -"parse" => PMC 'PIRGrammar' { ... } +"parse" => PMC 'PIR::Grammar' { ... } Parse successful! OUT @@ -195,7 +195,7 @@ .param pmc kw :slurpy :named # slurpy hash .end CODE -"parse" => PMC 'PIRGrammar' { ... } +"parse" => PMC 'PIR::Grammar' { ... } Parse successful! OUT @@ -209,7 +209,7 @@ CODE -"parse" => PMC 'PIRGrammar' { ... } +"parse" => PMC 'PIR::Grammar' { ... } Parse successful! OUT Index: languages/PIR/t/sym.t =================================================================== --- languages/PIR/t/sym.t (revision 17008) +++ languages/PIR/t/sym.t (working copy) @@ -16,7 +16,7 @@ .end CODE -"parse" => PMC 'PIRGrammar' { ... } +"parse" => PMC 'PIR::Grammar' { ... } Parse successful! OUT @@ -30,7 +30,7 @@ .end CODE -"parse" => PMC 'PIRGrammar' { ... } +"parse" => PMC 'PIR::Grammar' { ... } Parse successful! OUT @@ -44,7 +44,7 @@ .end CODE -"parse" => PMC 'PIRGrammar' { ... } +"parse" => PMC 'PIR::Grammar' { ... } Parse successful! OUT @@ -57,7 +57,7 @@ .end CODE -"parse" => PMC 'PIRGrammar' { ... } +"parse" => PMC 'PIR::Grammar' { ... } Parse successful! OUT @@ -71,7 +71,7 @@ .end CODE -"parse" => PMC 'PIRGrammar' { ... } +"parse" => PMC 'PIR::Grammar' { ... } Parse successful! OUT Index: languages/PIR/t/whitespace.t =================================================================== --- languages/PIR/t/whitespace.t (revision 17008) +++ languages/PIR/t/whitespace.t (working copy) @@ -13,7 +13,7 @@ .sub main .end CODE -"parse" => PMC 'PIRGrammar' { ... } +"parse" => PMC 'PIR::Grammar' { ... } Parse successful! OUT @@ -24,7 +24,7 @@ # comments after code # CODE -"parse" => PMC 'PIRGrammar' { ... } +"parse" => PMC 'PIR::Grammar' { ... } Parse successful! OUT @@ -35,7 +35,7 @@ # .end CODE -"parse" => PMC 'PIRGrammar' { ... } +"parse" => PMC 'PIR::Grammar' { ... } Parse successful! OUT @@ -48,7 +48,7 @@ .end CODE -"parse" => PMC 'PIRGrammar' { ... } +"parse" => PMC 'PIR::Grammar' { ... } Parse successful! OUT @@ -163,7 +163,7 @@ .sub main .end CODE -"parse" => PMC 'PIRGrammar' { ... } +"parse" => PMC 'PIR::Grammar' { ... } Parse successful! OUT @@ -346,7 +346,7 @@ .end CODE -"parse" => PMC 'PIRGrammar' { ... } +"parse" => PMC 'PIR::Grammar' { ... } Parse successful! OUT @@ -460,7 +460,7 @@ CODE -"parse" => PMC 'PIRGrammar' { ... } +"parse" => PMC 'PIR::Grammar' { ... } Parse successful! OUT @@ -486,7 +486,7 @@ .sub main .end CODE -"parse" => PMC 'PIRGrammar' { ... } +"parse" => PMC 'PIR::Grammar' { ... } Parse successful! OUT @@ -502,7 +502,7 @@ =cut .end CODE -"parse" => PMC 'PIRGrammar' { ... } +"parse" => PMC 'PIR::Grammar' { ... } Parse successful! OUT @@ -518,7 +518,7 @@ =cut CODE -"parse" => PMC 'PIRGrammar' { ... } +"parse" => PMC 'PIR::Grammar' { ... } Parse successful! OUT