[antlr-interest] problem with semantic predicates,	local declarations, and hoisting
    Madden, Warren 
    warren.madden at lmco.com
       
    Wed Aug  8 07:59:11 PDT 2007
    
    
  
Greetings!
 
I'm trying to write a grammar that recognizes a particular data format
that includes some fixed length and some variable length fields.  I'm
running into problems with my semantic predicates being hoisted up, and
moving out of the context of my local variables.  Hoping someone can
point me in the right direction to solve my problem.
 
Below is a sample grammar.  It should recognize a fixed length field of
either 12 or 18 characters, then a space, and then a variable length
number string:
 
 
grammar predtest;
            
parent
            :           mandatory_child SPACE NUMBER+ (CR|LF)?EOF;
 
mandatory_child  @init { int n = 0; }
            :           ( { n <= 17 }?=>
                        ~(CR|LF)
                        { n++; })+
                        {System.out.println("text is " + $text + ", n is
" + n );}
                        {n == 12 || n == 18}?;
 
alphanum
            :           LETTER | NUMBER;
 
LETTER            :           ('a'..'z' | 'A'..'Z');
NUMBER          :           '0'..'9';
SLASH :           '/';
SPACE :           ' ';
TAB      :           '\t';
CR        :           '\r';
LF        :           '\n';
ASCIICHAR 
            :           '\u0003'..'\u0377';
 
 
The technique in mandatory_child is taken from page 286 of the ANTLR
book, with a slight modification to force the string to be either 12 or
18 chars.
 
When I try to compile, I get the following errors:
 
 
$ ant
Buildfile: build.xml
 
compile:
    [javac] Compiling 2 source files
    [javac] d:\java\predtest\predtestParser.java:285: cannot find symbol
    [javac] symbol  : variable n
    [javac] location: class predtestParser.DFA3
    [javac]                         else if (
(LA3_1==SPACE||(LA3_1>=LETTER && L
A3_1<=ASCIICHAR)) && ( n <= 17 )) {s = 2;}
    [javac]
                       ^
    [javac] d:\java\predtest\predtestParser.java:300: cannot find symbol
    [javac] symbol  : variable n
    [javac] location: class predtestParser.DFA3
    [javac]                         else if (
(LA3_0==NUMBER||(LA3_0>=LETTER &&
LA3_0<=ASCIICHAR)) && ( n <= 17 )) {s = 2;}
    [javac]
                        ^
    [javac] d:\java\predtest\predtestParser.java:313: cannot find symbol
    [javac] symbol  : variable n
    [javac] location: class predtestParser.DFA3
    [javac]                         if ( (LA3_3==SPACE||(LA3_3>=LETTER
&& LA3_3<
=ASCIICHAR)) && ( n <= 17 )) {s = 2;}
    [javac]
                  ^
    [javac] 3 errors
 
BUILD FAILED
d:\java\predtest\build.xml:8: Compile failed; see the compiler error
output for
details.
 
Total time: 1 second
 
 
It appears that ANTLR is taking my predicate and moving it into a DFA,
but not carrying the declaration of n along with it.  Any ideas how I
can fix this?  Should I make n a class variable using @members, rather
than using @init as shown in the example?
 
Thanks!
 
Warren Madden
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.antlr.org/pipermail/antlr-interest/attachments/20070808/e186d7e0/attachment-0001.html 
    
    
More information about the antlr-interest
mailing list