[antlr-interest] ClassCastException with custom node type
Stefan Mätje (d)
Stefan.Maetje at esd-electronics.com
Thu Jul 5 03:18:31 PDT 2012
Am 05.07.2012 11:22:55 schrieb(en) Ale Strooisma:
> Thanks for your reply,
>
> I didn't see much difference between your and my code, and when I added
> the line "nodes.setTokenStream(tokens);" the problem was still there.
> Please see my code below.
>
> Kind Regards, Ale
I don't see much difference also. Perhaps the difference comes from the tree
adaptor. I'll paste my adaptor below. Maybe that helps?
-----8<-----------8<-----------8<-----------8<---------8<---------8<--------
import org.antlr.runtime.*;
import org.antlr.runtime.tree.CommonTreeAdaptor;
/** A tree adaptor that tells ANTLR to build Pearl90Tree nodes. Derived from
http://www.antlr.org/wiki/display/ANTLR3/Tree
+construction#Treeconstruction-UsingcustomASTnodetypes
*/
public class Pearl90TreeAdaptor extends CommonTreeAdaptor {
public Object create(Token token) {
return new Pearl90Tree(token);
}
/** Of the following create() methods only the third is used atm. by the
program. The apparently unused ones are added to the implementation
but
print some information. All are used but 1 & 2 triggered by hand from
parser only.
*/
public Object create(int tokenType, Token fromToken) {
fromToken = createToken(fromToken);
fromToken.setType(tokenType);
// System.err.println("1 Create node"+fromToken.toString());
return this.create(fromToken);
}
public Object create(int tokenType, Token fromToken, String text) {
if (fromToken == null) return create(tokenType, text);
fromToken = createToken(fromToken);
fromToken.setType(tokenType);
fromToken.setText(text);
// System.err.println("2 Create node"+fromToken.toString());
return this.create(fromToken);
}
public Object create(int tokenType, String text) {
Token fromToken = createToken(tokenType, text);
// System.err.println("3 Create node"+fromToken.toString()+text
+tokenType);
return this.create(fromToken);
}
public Object dupNode(Object t) {
if (null == t) {
return null;
}
return create(((Pearl90Tree)t).token);
}
public Object errorNode(TokenStream input, Token start, Token stop,
RecognitionException e)
{
Pearl90ErrorNode t = new Pearl90ErrorNode(input, start, stop, e);
System.out.println("returning error node '"+t+"' @index="+input.index
());
return t;
}
}
-----8<-----------8<-----------8<-----------8<---------8<---------8<--------
> TreeAdaptor adaptor = new ASTNodeAdaptor();
>
> System.out.println("Starting Lexer... ");
> WcLexer lexer = new WcLexer(new ANTLRInputStream(fileInputStream));
> TokenStream tokens = new CommonTokenStream(lexer);
>
> System.out.println("Starting Parser... ");
> WcParser parser = new WcParser(tokens);
> parser.setTreeAdaptor(adaptor);
> WcParser.program_return result = parser.program();
> ASTNode tree = (ASTNode) result.getTree();
>
> System.out.println("Checking Context... ");
> CommonTreeNodeStream nodes = new CommonTreeNodeStream(adaptor, tree);
> nodes.setTokenStream(tokens);
> WcChecker checker = new WcChecker(nodes,f);
> checker.program();
>
>
> On 07/05/2012 10:05 AM, Stefan Mätje wrote:
> > Hi,
> >
> > the attachment seems to be stripped by the mailing list. I'll put it now
> > directly in the message.
> >
> > My classes are
> > Pearl90Tree a tree node
> > Pearl90TreeAdaptor the node factory?
> > Pearl90ErrorNode the error node object
> >
> > Code excerpt follows, sorry for line wraps:
> > {
> > // ==== Prepare tree node adaptor for later use =========
> > Pearl90TreeAdaptor pearl90Adaptor = new Pearl90TreeAdaptor();
> >
> > // SNIP-SNAP
> >
> > // ==== PARSER STAGE ====================================
> > // Create a stream of tokens fed by the lexer
> > // But use TokenRewriteStream if we need to change the AST
> > // with a tree grammar later. See ANTLR Ref p. 224
> > CommonTokenStream tokens = new CommonTokenStream(lexer);
> >
> > // Create a parser that feeds off the token stream
> > parser = new Pearl90Parser(tokens);
> >
> > // Use my own tree adaptor to build Pearl90Tree nodes in the AST.
> > parser.setTreeAdaptor(pearl90Adaptor);
> >
> > // Begin parsing at rule "file" and get return value
> > Pearl90Parser.file_return r = parser.file();
> > // Change the returned value to an AST
> > Pearl90Tree ast = (Pearl90Tree)r.getTree();
> >
> > // SNIP-SNAP
> >
> > // ---------------------------------------
> > // Do error accounting ...
> > // SNIP-SNAP
> >
> > // ==== Symbol Table Generation =========================
> > // This stage fills the symbol table and may rewrite the AST
> > // based on its findings.
> > // CommonTreeNodeStream nodes = new CommonTreeNodeStream(ast);
> > CommonTreeNodeStream nodes = new
> > CommonTreeNodeStream(pearl90Adaptor, ast);
> > nodes.setTokenStream(tokens);
> > // This line fixed crash on spurious CommonToken insertions.
> > Already done
> > // now by constructor above.
> > //nodes.setTreeAdaptor(pearl90Adaptor);
> >
> > SymbolTable symtab = new SymbolTable();
> > // Use my custom constructor for AST tree parser
> > // Use workaround with new for missing debug output stream...
> > Pearl90Sym syms = new Pearl90Sym(nodes, symtab, new
> > PrintWriter(System.out,true));
> >
> > // Use my own tree adaptor to build Pearl90Tree nodes in the AST.
> > syms.setTreeAdaptor(pearl90Adaptor);
> >
> > // Trigger symtab actions upon certain subtrees,
> > // return the rewritten AST as directed by Pearl90Sym.g
> > ast = (Pearl90Tree)syms.downup(ast);
> >
> >
> > }
> >
> > List: http://www.antlr.org/mailman/listinfo/antlr-interest
> > Unsubscribe: http://www.antlr.org/mailman/options/antlr-interest/your-
> email-address
> >
>
>
> List: http://www.antlr.org/mailman/listinfo/antlr-interest
> Unsubscribe: http://www.antlr.org/mailman/options/antlr-interest/your-email-
> address
>
>
More information about the antlr-interest
mailing list