On Thu, Jul 06, 2006 at 12:29:12AM -0700, Allison Randal wrote:
> >$ cat xyz.pir
> >.sub main :main
> >    load_bytecode 'PGE.pbc'
> >    load_bytecode 'ar.pir'
> >    load_bytecode 'dumper.pbc'
> >    load_bytecode 'PGE/Dumper.pbc'
> >
> >    $P0 = find_global 'XYZ', 'start'
> >    $P1 = $P0("\n\n\n\n\n\n\n", 'grammar' => 'XYZ')
> 
> What the original didn't have is the 'grammar' named argument when 
> calling the start rule. When I replace the previous line with:
> 
>       $P1 = $P0("\n\n\n\n\n\n\n")
> 
> then your sample code exhibits the same problem. I assume this means 
> that the reason overriding <ws> wasn't working is because it was calling 
> the default version of <ws> in the root namespace. But, if it was 
> defaulting to the root namespace, why was it able to find any of the 
> rules? Shouldn't it have complained that it couldn't find <emptyline>?

At the moment (and this may be incorrect), PGE looks for named rules
via inheritance, and if not found that way it looks in the available
symbol tables using the find_name opcode.

So, the match was able to find the rules because they are in the 
current namespace, but when it came time to find the rule for <?ws> 
there was a "ws" method available (the default) and so that one
was used.

Again, this may not be the correct behavior; I've been using S12 as
the guide here, in that a method call first considers methods from
the class hierarchy and fails over to subroutine dispatch.

Pm

Reply via email to