Looks good.  I'll be doing something similar in the Spring when I get  
to optimization. :)
Thanks!
Ter
On Nov 13, 2008, at 4:59 PM, Sam Harwell wrote:

> I made a few changes to address an issue I was seeing in the  
> generated code. I’m not confident at this point that it can’t  
> introduce new bugs, so I’d like some of you to take a look and see  
> if it could apply to your targets as well. This update saved me tens  
> of millions of calls to input.LA(x) while parsing our sources.
>
> If the existing success code in the matchSet StringTemplate is  
> extracted to its own StringTemplate, we can optimizing the handling  
> of certain set alts. Here is what the StringTemplate code in the C#  
> port looks like with the code extracted:
>
> matchSet(s,label,elementIndex,postmatchCode="") ::= <<
> <if(label)>
> <if(LEXER)>
> <label>= input.LA(1);<\n>
> <else>
> <label>=(<labelType>)input.LT(1);<\n>
> <endif>
> <endif>
> if ( <s> )
> {
>         <! code originally here moved to matchSetUnchecked !>
>         <matchSetUnchecked(...)>
> }
> else
> {
>         <ruleBacktrackFailure()>
>         MismatchedSetException mse = new  
> MismatchedSetException(null,input);
>         <@mismatchedSetException()>
> <if(LEXER)>
>         recover(mse);
>         throw mse;
> <else>
>         throw mse;
>         <! use following code to make it recover inline; remove  
> throw mse;
>          
> recoverFromMismatchedSet 
> (input,mse,FOLLOW_set_in_<ruleName><elementIndex>);
>         !>
> <endif>
> }<\n>
> >>
>
> matchSetUnchecked(s,label,elementIndex,postmatchCode="") ::= <<
> input.consume();
> <postmatchCode>
> <if(!LEXER)>
>         state.errorRecovery=false;
> <endif>
>         <if(backtracking)>state.failed=false;<endif>
> >>
>
> I then updated the code in the codegen tree walker to directly use  
> matchSetUnchecked in alts where the prediction code already  
> guarantees success. I also have fallback code should one of the  
> targets (or at this point – all of the targets except my C# one) not  
> support the optimization.
>
> protected StringTemplate getTokenElementST( String name,
>                                            String elementName,
>                                            GrammarAST elementAST,
>                                            GrammarAST ast_suffix,
>                                            String label )
> {
>     // BEGIN PIXELMINE: sets optimization
>     bool tryUnchecked = false;
>     if ( name == "matchSet" && ! 
> string.IsNullOrEmpty( elementAST.enclosingRuleName ) &&  
> char.IsUpper( elementAST.enclosingRuleName[0] ) )
>     {
>         tryUnchecked = true;
>     }
>     // END PIXELMINE
>
>     string suffix = getSTSuffix( elementAST, ast_suffix, label );
> // PIXELMINE: I removed the "name += suffix;" line that was here
>     // if we're building trees and there is no label, gen a label
>     // unless we're in a synpred rule.
>     Rule r = grammar.getRule( currentRuleName );
>     if ( ( grammar.BuildAST || suffix.length() > 0 ) && label ==  
> null &&
>          ( r == null || !r.isSynPred ) )
>     {
>         label = generator.createUniqueLabel( elementName );
>         CommonToken labelTok = new CommonToken( ANTLRParser.ID,  
> label );
>         grammar.defineTokenRefLabel( currentRuleName, labelTok,  
> elementAST );
>     }
>
>     // BEGIN PIXELMINE: sets optimization
>     StringTemplate elementST = null;
>     if ( tryUnchecked )
>         elementST = templates.getInstanceOf( name + "Unchecked" +  
> suffix );
>     if ( elementST == null )
>         elementST = templates.getInstanceOf( name + suffix );
>     // END PIXELMINE
>
>     if ( label != null )
>     {
>         elementST.setAttribute( "label", label );
>     }
>     return elementST;
> }
>
> Sam
> _______________________________________________
> antlr-dev mailing list
> [email protected]
> http://www.antlr.org:8080/mailman/listinfo/antlr-dev

_______________________________________________
antlr-dev mailing list
[email protected]
http://www.antlr.org:8080/mailman/listinfo/antlr-dev

Reply via email to