[antlr-interest] Re: Bounded Left Recursion
lgcraymer
lgc at mail1.jpl.nasa.gov
Fri Mar 21 11:33:26 PST 2003
Brian--
I would suggest taking a look at some of the ANTLR example grammars,
particularly the one for the exprAST example and java.g (or Monty's C
grammar). ANTLR handles operator precedence in the same way that you
probably learned it (at least, it's the way I learned it)--additive
expressions operate on atomic numbers, multiplicative expressions, or
parenthesized expressions; multiplicative expressions operate on
atomic numbers or parenthesized expressions, and so on.
The biggest problem with using semantic predicates (besides the the
ones you have already encountered) to try to shortcut the
identification process is that you then have to jump through hoops to
structure your abstract syntax trees.
--Loring
--- In antlr-interest at yahoogroups.com, mzukowski at y... wrote:
> Very interesting post. Two main problems:
>
> 1. PCCTS hoisted those sem preds. ANTLR doesn't. So if you have
1+2, after
> you match the 1, as you enter infixOperator[6] it will fail. In
PCCTS it
> would not have even been entered because the predicates would have
been
> hoisted into the ()? subrule and level==6 & LA(1)==PLUS would have
failed.
> ANTLR doesn't know about the level when deciding when to enter
> infixOperator[level], so it will call it for level==6 and it will
fail
> because it will try to match STAR | SLASH.
>
> 2. It is infinite recursion there, and antlr's analysis won't allow
it.
> You're stuck with that one, I think.
>
> I agree it would be nice to have such a compact representation of
expression
> rules. I can't think of an easy way to do that in antlr currently,
and it's
> really not too difficult to do it the standard LL way.
>
> Monty
>
> -----Original Message-----
> From: Brian Smith [mailto:brian-l-smith at u...]
> Sent: Thursday, March 20, 2003 10:40 PM
> To: antlr-interest at yahoogroups.com
> Subject: [antlr-interest] Bounded Left Recursion
>
>
> Hi, I have a grammar like the one below. Basically, I am trying to
use
> semantic predicates to handle precedence of infix operators. I can
see
> that ANTLR is unhappy with the left recursion in infixExpCS. I know
that
> _unconstrained_ left recursion is not allowed in LL grammars because
it
> results in infinite recursion. However, in this example, the
recursion
> will never go more than seven levels deep. So, is there any way to
get
> this trick to work? It is actualy adapted from a very old posting
that
> Terence made on comp.compilers on the topic of implementing
predecence
> rules via predicates. Perhaps, I am not using the predicate feature
> correctly?
>
> Terence's posting (from 1994):
http://makeashorterlink.com/?X330167E3
>
> I would also like to read the paper cited as [MiF79]. Does anybody
know
> what paper he is referring to?
>
> Thanks,
> Brian
>
> class simple extends Parser;
>
> infixExpCS[int level]
> : {level==7}? prefixExpCS
> | infixExpCS[level+1]
> (infixOperator[level]
> infixExpCS[level])?
> ;
>
> infixOperator[int level]
> : {level==1}? (IMPLIES)
> | {level==2}? (AND | OR | XOR)
> | {level==3}? (EQUALS | NOT_EQUALS)
> | {level==4}? (LESS_THAN | LESS_EQUAL
> |GREATER_THAN | GREATER_EQUAL)
> | {level==5}? (PLUS|MINUS)
> | {level==6}? (STAR | SLASH)
> ;
>
> prefixExpCS: NOT prefixExpCS
> | INTEGER_LITERAL
> ;
>
>
> [antlr] 5:21: infinite recursion to rule infixExpCS from rule
infixExpCS
> [antlr] 5:21: infinite recursion to rule infixExpCS from rule
infixExpCS
> [antlr] 5:41: warning: nondeterminism upon
> [antlr] 5:41: k==1:IMPLIES,AND,OR,XOR,EQUALS,NOT_EQUALS,
> LESS_THAN,LESS_EQUAL,GREATER_THAN,GREATER_EQUAL,
> PLUS,MINUS,STAR,SLASH
> [antlr] 5:41: between alts 1 and 2 of block
> [antlr] Exiting due to errors.
>
>
>
>
>
>
>
> Your use of Yahoo! Groups is subject to
http://docs.yahoo.com/info/terms/
Your use of Yahoo! Groups is subject to http://docs.yahoo.com/info/terms/
More information about the antlr-interest
mailing list