On Jun 7, 2006, at 8:08 AM, Klaas-Jan Stol wrote:

I had a look at this, but I'm not that good at Perl, and regular expressions. However, I found where things go wrong, so someone who really groks REs may fix it.

I'm no Abigail, :-) but I'll try to help.

THe problem is (well, at least I think it is) at about line 440 in pmc2c.pl

sub parse_pmc {
   my $code = shift;

   my $signature_re = qr{
   ^
(?: #blank spaces and comments and spurious semicolons
     [;\n\s]*
     (?:/\*.*?\*/)?    # C-like comments
   )*

You're asking for multiple instances of something that could be empty. I don't know if this is problematic, but I suspect it might cause unnecessary backtracking. I would write: (?: [;\n\s] | (?:/ \*.*?\*/) )*

   (METHOD\s+)?        #method flag

(\w+\**) #type <<<==========I'd say this should be (\w+\s*\**) so it matches a word (the return type), optional spaces, and then optial *'s to indicate a pointer
     \s+
       (\w+)           #method name

In the case where there are no '*'s in the text, the pattern '\s*' eats up all the whitespace so the following '\s+' doesn't match. Although I don't understand why backtracking wouldn't kick in and make things match up, albeit inefficiently.

Try writing: ( \w+ (?: \s* \*+ )? )

(Some word characters optionally followed by any whitespace and some '*'.)

     \s*
       \( ([^\(]*) \)  #parameters
   }sx;

If the fix as I noted above is done, things don't compile anymore.
I'm sorry I can't provide a real fix, but at least it's easier to fix now, hopefully.

The real solution would use regular expressions but not rely on them.

I've been reading Higher Order Perl, by Mark Jason Dominus. It has a chapter on writing parsers which is applicable to this discussion, and I cannot recommend it highly enough.

Higher Order Perl
http://hop.perl.plover.com/

Josh

kind regards,

klaas-jan



Leopold Toetsch (via RT) wrote:

# New Ticket Created by Leopold Toetsch # Please include the string: [perl #39313] # in the subject line of all future correspondence about this issue. # <URL: https://rt.perl.org/rt3/Ticket/Display.html?id=39313 >


It's easy to add 'invalide' code to .pmc files. E.g. I had defined:

   METHOD parent() {
       return PMC_pmc_val(SELF) ? PMC_pmc_val(SELF) : PMCNULL;
   }

Due to the absence of a return value, the PMC compiler just ignores this 'method' without further notice.

This also is happening, if there's just a whitespace before the '*':

   METHOD PMC *parent() {
       return PMC_pmc_val(SELF) ? PMC_pmc_val(SELF) : PMCNULL;
   }

This totally valid C type declaration is just ignored.

Fixes welcome,
leo




Reply via email to