[antlr-interest] Custom ASTLabelType - setParent called with Null?

Jim Idle jimi at temporal-wave.com
Sat Oct 15 14:40:08 PDT 2011


It just means that the node does not have a parent, probably 'yet'; which
happens when the AST is in the process of being built.

Jim

> -----Original Message-----
> From: antlr-interest-bounces at antlr.org [mailto:antlr-interest-
> bounces at antlr.org] On Behalf Of Jeremy Long
> Sent: Saturday, October 15, 2011 1:23 PM
> To: antlr-interest at antlr.org
> Subject: [antlr-interest] Custom ASTLabelType - setParent called with
> Null?
>
> Hello,
>
> I'm still relatively new to antlr, but basically I'm trying to generate
> an AST and auto-populate a Neo4j Graph. My initial thought was to use a
> custom ASTLabelType with my object over-riding the setParent method of
> the CommonTree to build the relationship. However, on a very simple
> grammar
> (Expr.g) parsing the input of  "1+2\n" of the 10 calls to setParent, 6
> of the calls where passed a null token?  Any thoughts on this?
>
> The grammar, extended commonTree, and test case are below (however,
> none of this will run as the overall project is bigger than this one
> piece).
>
> Thanks in advance if anyone can clue me into why there are so many
> calls to setParent passing a null token in.
>
> --Jeremy
>
>
>
> //////////////////////Eval Grammar
>
> grammar Eval;
>
> options {
> ASTLabelType=BaseModelNode;
> output = AST;
> }
>
> @header {
>
> package org.sangine.translator.antlr3.generated;
>
> import org.sangine.translator.antlr3.model.BaseModelNode;
>
> }
> @lexer::header {
> package org.sangine.translator.antlr3.generated;
>
> import org.sangine.translator.antlr3.model.BaseModelNode;
> }
>
> prog : stat+
> ;
>
> stat : expr NEWLINE
> | ID '=' expr NEWLINE
> | NEWLINE
> ;
>
>
> expr
> : multExpr (('+'|'-') multExpr)*
> ;
> multExpr
> : atom ('*' atom)*
> ;
> atom
> : INT
> | ID
> | '(' expr ')'
> ;
>
> ID : ('a'..'z'|'A'..'Z')+;
> INT : '0'..'9'+;
> NEWLINE : '\r'?'\n';
> WS : (' '|'\t'|'\n'|'\r')+ {skip();};
>
> ---------------------------------------------------
>
> /////////////////////////////////////////BaseModelNode.java
>
>
> /**
>  *
>  */
> package org.sangine.translator.antlr3.model;
>
> import org.antlr.runtime.Token;
> import org.antlr.runtime.tree.CommonTree;
> import org.antlr.runtime.tree.Tree;
> import org.neo4j.graphdb.Node;
> import org.sangine.model.ModelNode;
> import org.sangine.model.ModelRelationshipType;
> import org.sangine.store.ApplicationGraph;
>
> /**
>  * @author Jeremy
>  *
>  */
> public class BaseModelNode extends CommonTree {
>
> private final Node underlyingNode;
>  protected Node getUnderlyingNode()
> {
> return underlyingNode;
> }
>  /**
>  *
>  */
> public BaseModelNode(Node node)
> {
> this.underlyingNode = node;
> }
>
> /**
>  *
>  */
> public BaseModelNode(BaseModelNode node) { this.underlyingNode =
> node.underlyingNode; }
>  /**
>  * @param node
>  */
> public BaseModelNode(CommonTree node) {
> super(node);
> this.underlyingNode = ApplicationGraph.getInstance().createNode();
> }
>
> /**
>  * @param t
>  */
> public BaseModelNode(Token t) {
> super(t);
> this.underlyingNode = ApplicationGraph.getInstance().createNode();
>  if (t==null) {
> System.err.println("token was null");
> return;
> }
> System.err.println("token was NOT null");
> this.underlyingNode.setProperty("text", t.getText());
> this.underlyingNode.setProperty("linenumber", t.getLine());
> this.underlyingNode.setProperty("offset", t.getCharPositionInLine()); }
>
> public BaseModelNode()
> {
> this.underlyingNode = ApplicationGraph.getInstance().createNode();
> }
>
>  @Override
> public void setParent(Tree t) {
> if (t==null) return;
> this.parent = (CommonTree) t;
> BaseModelNode parent = (BaseModelNode) t;
> parent.underlyingNode.createRelationshipTo(this.underlyingNode,
> ModelRelationshipType.NEXT);
> }
>  @Override
> public int hashCode()
> {
>     return underlyingNode.hashCode();
> }
>
> @Override
> public boolean equals( Object o )
> {
>     return o instanceof BaseModelNode &&
>             underlyingNode.equals( ( (BaseModelNode)o
> ).getUnderlyingNode() ); }
>
> @Override
> public String toString()
> {
>     return "BaseModelNode[]";
> }
>
> }
>
> /////////////////////////////////////////////////////////// test code
>
> package org.sangine;
>
> import org.antlr.runtime.ANTLRStringStream;
> import org.antlr.runtime.CommonTokenStream;
> import org.antlr.runtime.RecognitionException;
> import org.neo4j.graphdb.Transaction;
> import org.sangine.store.ApplicationGraph;
> import org.sangine.translator.antlr3.ModelTreeAdaptor;
> import org.sangine.translator.antlr3.generated.EvalLexer;
> import org.sangine.translator.antlr3.generated.EvalParser;
>
> import junit.framework.Test;
> import junit.framework.TestCase;
> import junit.framework.TestSuite;
>
> public class EvalTest
>     extends TestCase
> {
>
> public EvalTest( String testName )
>     {
>         super( testName );
>     }
>
>     public static Test suite()
>     {
>         return new TestSuite( EvalTest.class );
>     }
>
>     public void testApp()
>     {
>     ApplicationGraph.loadOrCreateDB("evaldb");
>
>     Transaction tx =
> ApplicationGraph.getInstance().getGraphDatabaseService().beginTx();
>
>     String java = "1+2";
>
>     ANTLRStringStream input = null;
> input = new org.antlr.runtime.ANTLRStringStream(java);
>
>
> EvalLexer lexer = new EvalLexer(input);
>
>
>     CommonTokenStream tokens = new CommonTokenStream(lexer);
>
>     ModelTreeAdaptor adaptor = new ModelTreeAdaptor();
>
>     EvalParser parser = new EvalParser(tokens);
>     parser.setTreeAdaptor(adaptor);
>
>     EvalParser.stat_return cu = null;
>
>     try {
> cu = parser.stat();
> tx.success();
> assertTrue( true );
> } catch (RecognitionException e) {
> // TODO Auto-generated catch block
> e.printStackTrace();
> assertTrue( false );
> }
>     finally {
>     tx.finish();
>     ApplicationGraph.close();
>     }
>     }
> }
>
> 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