[antlr-interest] Exception tests eat performance?
Terence Parr
parrt at cs.usfca.edu
Wed Jan 7 09:56:58 PST 2004
Hi gang, my only additional comment would be that using return values
makes it pretty hard to have other return values from a rule, which are
arguably very handy.
Note that antlr does a simple static k lookahead test before resorting
to backtracking in the generated parser.
Further, the use of boatloads of syn preds is not usually necessary and
are used as a crutch too often. At least they are there though ;)
Ter
On Wednesday, January 7, 2004, at 08:54 AM, Karl Meissner wrote:
>
> It seems that antlr uses exceptions in a lot of the generated parsers
> where simple test will do.
> Everything that I have read is that an exceptions have a very high
> overhead and it is undesirable
> to generate them in a tight loop where they happen a lot.
>
> Exceptions are used so extensivly it would require a big rewrite to
> change but I wanted to
> raise it as an issue
>
> A very common piece of code in a parser is
>
> try {
> {
> match( SYM1 );
> match( SYM2 );
> match( SYM3 );
> }
> } catch (RecognitionException) {
> synPredMatched84 = false;
> }
>
> where match throws an exception if the next token is not the parameter.
> Since match is just
> public virtual void match(int t)
> {
> if (LA(1) != t)
> throw new MismatchedTokenException(tokenNames, LT(1), t, false,
> getFilename());
> else
> consume();
> }
>
>
> Using if based tests would be faster I think...
>
> Something like this
>
> bool Rule10() {
> if( !Rule22() ) goto _RecognitionException_123:
>
> currentSym = SYM1; if ( LA( 1 ) != currentSym ) goto
> _RecognitionException_123; consume();
> currentSym = SYM2; if ( LA( 1 ) != currentSym ) goto
> _RecognitionException_123; consume();
> currentSym = SYM3; if ( LA( 1 ) != currentSym ) goto
> _RecognitionException_123; consume();
>
> return true;
>
> _RecognitionException_123:
> if (0 == inputState.guessing)
> {
> reportError(currentSym);
> consume();
> consumeUntil(tokenSet_27_);
>
> return true; //attempt to recover in the calling rule
> }
> else //guessing
> {
> return false;
> }
> }
>
> I probably missed some the the code paths with predicate guessing and
> error handling but
> I still think you can get the same behavior as the exception with a
> combination of if, goto and
> storing information into stack.
>
> And get a performance improvement....
>
> Karl
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
> __________________________________
> Do you Yahoo!?
> Yahoo! Hotjobs: Enter the "Signing Bonus" Sweepstakes
> http://hotjobs.sweepstakes.yahoo.com/signingbonus
>
>
>
> Yahoo! Groups Links
>
> To visit your group on the web, go to:
> http://groups.yahoo.com/group/antlr-interest/
>
> To unsubscribe from this group, send an email to:
> antlr-interest-unsubscribe at yahoogroups.com
>
> Your use of Yahoo! Groups is subject to:
> http://docs.yahoo.com/info/terms/
>
>
>
--
Professor Comp. Sci., University of San Francisco
Creator, ANTLR Parser Generator, http://www.antlr.org
Co-founder, http://www.jguru.com
Co-founder, http://www.knowspam.net enjoy email again!
Co-founder, http://www.peerscope.com link sharing, pure-n-simple
Yahoo! Groups Links
To visit your group on the web, go to:
http://groups.yahoo.com/group/antlr-interest/
To unsubscribe from this group, send an email to:
antlr-interest-unsubscribe at yahoogroups.com
Your use of Yahoo! Groups is subject to:
http://docs.yahoo.com/info/terms/
More information about the antlr-interest
mailing list