[antlr-interest] semantic predicate affects nothing

Kay Roepke kroepke at classdump.org
Sun Jun 17 23:37:44 PDT 2007


Hi Markus!

On Jun 18, 2007, at 2:31 AM, Markus Kuhla wrote:

> page		:	paragraph *;
> paragraph 	:	text_parag  |  block;
> text_paragr	:	(OPEN ((NEWLINE)=>{false}? )) => text_line+;

I think the reason why the semantic predicate is not generated into  
the code is that there isn't any matching done immediately after it,  
but I'm not totally sure.

Does this help:

text_paragr	:	(OPEN ~NEWLINE)=> text_line+;

I can't test it right now, but I think it should do the trick.  
Synpred reads as "there must be OPEN followed by not NEWLINE" to  
match text_line+.
For the actual predicate evalutation look in the code for rule  
paragraph, as the predicate is hoisted from text_paragraph.
This is the code I get for the grammar then:

    // /tmp/Test.g:5:1: paragraph : ( text_paragr | block );
     public final void paragraph() throws RecognitionException {
         try {
             // /tmp/Test.g:5:14: ( text_paragr | block )
             int alt2=2;
             int LA2_0 = input.LA(1);

             if ( (LA2_0==NEWLINE||LA2_0==ANY) ) {
                 alt2=1;
             }
             else if ( (LA2_0==OPEN) ) {
                 int LA2_2 = input.LA(2);

                 if ( (LA2_2==NEWLINE) ) {
                     alt2=2;
                 }
                 else if ( ((LA2_2>=CLOSE && LA2_2<=ANY)) ) {
                     alt2=1;
                 }
                 else {
                     if (backtracking>0) {failed=true; return ;}
                     NoViableAltException nvae =
                         new NoViableAltException("5:1: paragraph :  
( text_paragr | block );", 2, 2, input);

                     throw nvae;
                 }
             }
             else {
                 if (backtracking>0) {failed=true; return ;}
                 NoViableAltException nvae =
                     new NoViableAltException("5:1: paragraph :  
( text_paragr | block );", 2, 0, input);

                 throw nvae;
             }
             switch (alt2) {
                 case 1 :
                     // /tmp/Test.g:5:14: text_paragr
                     {
                     pushFollow(FOLLOW_text_paragr_in_paragraph22);
                     text_paragr();
                     _fsp--;
                     if (failed) return ;

                     }
                     break;
                 case 2 :
                     // /tmp/Test.g:5:30: block
                     {
                     pushFollow(FOLLOW_block_in_paragraph28);
                     block();
                     _fsp--;
                     if (failed) return ;

                     }
                     break;

             }
         }
         catch (RecognitionException re) {
             reportError(re);
             recover(input,re);
         }
         finally {
         }
         return ;
     }


HTH,

-k

-- 
Kay Röpke
http://classdump.org/






More information about the antlr-interest mailing list