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