> On Monday, July 28, 2003, at 11:26  AM, Orton, Yves wrote:
> 
> >> what seems to me as wrong is that i may have not only :
> >>
> >>  '(' expression ')'
> >>
> >> but also just :
> >>
> >> expression
> >>
> >> but then it becomes left-recursive..
> >>
> >> brackExpr   :  expression |  '(' expression ')' | comparison
> >
> > Use the <leftop> or <rightop> directives and youll be fine.
> >
> <leftop> and <rightop> are for left- and right-associative infix 
> operators, so I don't see how they'll affect left recursion 
> one way or another.

Well, isnt a common cause of left recursion infix operators? And hence the
existance of the <leftop> directive?

I could be wrong of course, I didnt look into it that deeply. But it seems
to me that the grammar

expression  : <leftop: andExpr 'or' andExpr>
andExpr     : <leftop: notExpr 'and' notExpr>
notExpr     : 'not' brackExpr | brackExpr
brackExpr   : '(' expression ')' |  comparison
comparison  : identifier compType identifier
compType    : '=' | '>' | '<' | '>=' | '<='
identifier  : fieldName | number
fieldName   : /[a-z]+/
number      : /\d+/

works fine. (At least off the top of my head I couldnt build an expression
that would break it.)

Anyway, the below link documents a mechanical means of eliminating left
recursion from a PRD grammar. And has lots of links to better articles on
the subject.

  http://perlmonks.org/index.pl?node_id=153155

Yves

Reply via email to