in reply to Parse::RecDescent without parentheses

Your grammer doesn't allow a statement to contain a calculation, where a calculation is 4+8 let's say. So, after it consumes the 4+8 it has no way to know what to do with the +5 part. Also as an asside, you have all the math operators at the same precedence...so you'll end up wandering later why 2+4*5 = 30 and not 22 :)

The grammer for parsing standard algebra is a pretty common example for teaching parsing. (Give me a sec to dig up a link for an example) :)

<update style="big">
Complete example (almost) taken straight from the "Dragon" compiler book. Page 259

expression: expression '+' term | expression '-' term | term term: term '*' factor | term '/' factor | factor factor: '(' expression ')' | /\d+/
I'm sorry I don't have time to explain exactly how it works, but I can tell you how to figure that out. Turn on tracing as you have, and watch as many examples as you can and pay close attention to HOW Parse::RecDescent walks this grammer and your input.

/\/\averick
perl -l -e "eval pack('h*','072796e6470272f2c5f2c5166756279636b672');"

Replies are listed 'Best First'.
Re: Re: Parse::RecDescent without parentheses
by merlyn (Sage) on Feb 04, 2002 at 05:19 UTC
    That's a "left recursive" grammar, which gives Recursive Descent compilers (of which P::RD is one) a hissy fit.

    I believe that the P::RD examples include a simple parser that actually works. {grin}

    -- Randal L. Schwartz, Perl hacker

      DOH! I was in such a rush that I didn't check that the grammer wasn't left recursive. Hmm... wouldn't swapping the order of the nonterminals in expression and term make it 'right recursive' and solve the problem?

      /\/\averick
      perl -l -e "eval pack('h*','072796e6470272f2c5f2c5166756279636b672');"