[antlr-interest] Help with "unexpected AST node: 1"

Brett Crawley brett at crawley.uk.com
Tue May 13 04:16:19 PDT 2003


I have been trying to get the code below to work, basically I want to 
populate a vector or list with a series of numbers passed in the form:

1,3,8-12,14,20-

where 20- is from 20 to the last available number. 

However I am having problems walking the AST, I believe the problem 
to be related to the fact I have not defined in the tree walker the 
list construct with a # element. However when I try to define it in 
this way I get an error because it appears that the first element of 
the construct must be a lexer token and not a parser construct. Any 
help much appreciated.


header{
/**
 * A Java Lexer for Printing Ranges.<br>
 * Creation date: (08/05/2002 09:45:53)
 * @author: Jonathan Brett Crawley
 */
}
class PrintRangeLexer extends Lexer;

options{
    k=2;
}

NUMBER :
		    (DIGIT)+ ;
MINUS : 
		    '-' ;
COMMA : 
                    ',' ;
WS! : 
		    (' '|'\r'|'\n'|'\t')+ {$setType(Token.SKIP);} ;
protected
DIGIT : 
		    '0'..'9' ;



header {
/**
 * A Java Parser for Printing Ranges.<br>
 * Creation date: (21/03/2002 17.43.58)
 * @author: Jonathan Brett Crawley
 */
}
class PrintRangeParser extends Parser;

options {
    k=3;
    buildAST=true;
    importVocab=PrintRangeLexer;
}

list  :
                    range | NUMBER^ (COMMA (range | NUMBER))* ;
range : 
		    NUMBER^ MINUS NUMBER ;
                    



header {
/**
 * A tree walking class for lr tree structures 
 * representing Printing Ranges.<br>
 * Creation date: (21/03/2002 17.43.58)
 * @author: Brett Crawley
 */

//imports follow
import java.util.Vector;
import java.util.Hashtable;
import antlr.LLkParser;
}
class PrintRangeWalker extends TreeParser;

options{
    k=2;
    importVocab=PrintRangeParser;
}

{
        protected int lastPage = 0;
        
        public void setMaxPage(int lastPage) {
		this.lastPage = lastPage;
	}

}

list returns [Vector listPages] { listPages = new Vector(); Vector 
rangePages = null; } :
                    ((NUMBER MINUS) => rangePages=range { 
listPages.addAll(rangePages); } | 
                        (NUMBER) => num1:NUMBER { listPages.add(new 
Integer(Integer.parseInt(num1.getText()))); }) 
                    (COMMA ((NUMBER MINUS) => rangePages=range { 
listPages.addAll(rangePages); } | 
                        (NUMBER) => num2:NUMBER { listPages.add(new 
Integer(Integer.parseInt(num2.getText()))); }))* ;
                    
range returns [Vector rangePages] { rangePages = new Vector(); } :
                    #( startRange:NUMBER^ MINUS endRange:NUMBER ) { 
                        if (endRange != null) {
                                for (int i = Integer.parseInt
(startRange.getText()); i <= Integer.parseInt(endRange.getText()); 
++i) {
                                        rangePages.add(new Integer
(i));
                                }
                        } else {
                                for (int i = Integer.parseInt
(startRange.getText()); i <= this.lastPage; ++i) {
                                        rangePages.add(new Integer
(i));
                                }
                        } 
                    } ;
                    

The call to the tree walker list method from the main method of the 
program.
Vector test = walker.list(parser.getAST());

example call to a very simple main class, taking the input 1,2,3
java -classpath "%CLASSPATH%;x:/repository/" PrintRangeMain 1,2,3

error returned
unexpected AST node: 1



 

Your use of Yahoo! Groups is subject to http://docs.yahoo.com/info/terms/ 




More information about the antlr-interest mailing list