It's been a while since I took a compilers course too, and when I did 
Parsing Expression Grammars apparently hadn't even been invented yet, I 
hadn't encountered them until recently (and not in my past coursework), 
which led me to using Parslet. (I am not a developer of Parslet, just a 
user).

Using a PEG is a bit different in some ways (mostly for the better!) 
than the lexing/parsing approach I learned about in school, it might be 
helpful to do a bit of googling on PEG's and how they work. Or just 
continue to experiment with Parslet, I personally found Parslet so 
excellent to use that just playing around with it was the best tutorial 
in using PEG's for me.

On 4/18/2011 10:34 AM, Thiel Chang wrote:
> Hi Jonathan,
>
> I also assumed there should be nothing particular with '<=', '==' and
> '>='. So I changed the order: the '<=', '>=' and '==' first and then the
> other two ones as you advised, and my problem was solved.
>
> By the way it has been a long time ago when I did the course
> 'Constructing Compilers and Interpreters' and I read Alfred Aho, Ravei
> Seth and Jeffrrey Ulman's book about compilers. Anyhow, now I am retired
> but still love to  do software engineering.
>
> Many thanks,
>
> Thiel
>
>
> Op 18-4-2011 15:17, Jonathan Rochkind schreef:
>> There's nothing special about "<=" and ">=", but you've left out the part of 
>> your grammar that probably matters.
>>
>> Parslet will evaluate alternatives in a rule in the order they are given, 
>> matching the first one that matches. Consider:
>>
>> ...
>> rule :operator {  gt_op | ge_op }
>> ...
>>
>> parse(">=")
>>
>> First it will try to match gt_op, and say, yeah, that first character 
>> matches gt_op, great.  Then it will go on to try to match the next 
>> character, "=", according to whatever other rules are present in the 
>> grammar, either matching it to something else or failing to parse.
>>
>> If you instead put ge_op first in that rule, then first it will try to match 
>> the whole ">=", and consume both characters, and only then go on. Only if 
>> ge_op fails to match, will it go on to the next alternative, gt_op, and then 
>> match a ">" which is not followed by an "=".
>>
>> So in your case, changing the order you list alternatives to have the 
>> 'longer' one first may work. But in general, this manner of parsing, where 
>> alternatives are tested in the order given and the first one that matches is 
>> 'consumed'.... is fundamental to the way a PEG works, and wrapping your head 
>> around it is neccesary to write a grammar that does what you want.
>> ________________________________________
>> From: [email protected] [[email protected]] on behalf of 
>> Thiel Chang [[email protected]]
>> Sent: Monday, April 18, 2011 6:49 AM
>> To: [email protected]
>> Subject: [ruby.parslet] Problem with parsing a relational operator
>>
>> Hi guys,
>>
>> I am testing to parse relational expressions and defined  the following
>> relational operators:
>>
>> rule(:gt_op)      { str('>')>>   space? }
>> rule(:ge_op)     { str('<=')>>   space? }
>> rule(:lt_op)       { str('<')>>   space? }
>> rule(:le_op)       { str('<=')>>   space? }
>> rule(:eq_op)     { str('==')>>   space? }
>>
>>
>> To test them I used the following parse statements:
>>
>> Parser.new.rel_operation.parse_with_debug(' ( a - b )<   c ')
>> =>    Parsing succeds
>>
>> Parser.new.rel_operation.parse_with_debug(' ( a + b )>     c ')
>> =>    Parsing succeeds
>>
>> Parser.new.rel_operation.parse_with_debug(' ( a + b ) == c' )
>> =>     Parsing succeeds
>>
>> Parser.new.rel_operation.parse_with_debug(' ( a + b )>=  c' )
>> =>     Parsing does NOT succeeds
>>
>> Parser.new.rel_operation.parse_with_debug(' ( a + b )<=  c' )
>> =>     Parsing does NOT succeeds
>>
>> Because of the parsing failures of the '>=' and '<=' operators  I
>> replaced the relational operator '>='  with ':='  just to know if Parslet
>> could parse those two tokens as a  relational operator.
>>
>> Parser.new.rel_operation.parse_with_debug(' ( a + b ) :=  c' )
>>       =>     Parsing DOES succeeds!
>>
>> Can anyone explain why  parsing with e.g. '==',  '<','>' and ':=' went
>> well and '>=' and '<=' does not.
>>
>> Is there an 'undocumented' feature ;-)     in Parslet which does not
>> allow using '>=' and '<=' as symbols in Parslet or did I made a mistake?
>>
>> Thanks in advance,
>>
>> Thiel
>>
>>
>>
>>
>>
>>
>>

Reply via email to