[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