src.org.python.antlr.PythonTreeAdaptor Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of jython Show documentation
Show all versions of jython Show documentation
Jython is an implementation of the high-level, dynamic, object-oriented
language Python written in 100% Pure Java, and seamlessly integrated with
the Java platform. It thus allows you to run Python on any Java platform.
package org.python.antlr;
import org.antlr.runtime.CommonToken;
import org.antlr.runtime.RecognitionException;
import org.antlr.runtime.Token;
import org.antlr.runtime.TokenStream;
import org.antlr.runtime.tree.CommonTreeAdaptor;
public class PythonTreeAdaptor extends CommonTreeAdaptor {
@Override
public void setTokenBoundaries(Object t, Token startToken, Token stopToken) {
if (t==null) {
return;
}
//System.out.println("setting boundries on '"+t+"' with start: '" + startToken + "' and '" +
// stopToken + "'");
int start = 0;
int stop = 0;
int startChar = 0;
int stopChar = 0;
if (startToken!=null) {
start = startToken.getTokenIndex();
startChar = ((CommonToken)startToken).getStartIndex();
}
if (stopToken!=null) {
stop = stopToken.getTokenIndex();
stopChar = ((CommonToken)stopToken).getStopIndex() + 1;
}
PythonTree pt = (PythonTree)t;
pt.setTokenStartIndex(start);
pt.setTokenStopIndex(stop);
pt.setCharStartIndex(startChar);
pt.setCharStopIndex(stopChar);
}
@Override
public Object create(Token token) {
return new PythonTree(token);
}
@Override
public Object errorNode(TokenStream input, Token start, Token stop,
RecognitionException e)
{
PythonErrorNode t = new PythonErrorNode(input, start, stop, e);
//System.out.println("returning error node '"+t+"' @index="+input.index());
return t;
}
@Override
public Object dupNode(Object t) {
if (t == null) {
return null;
}
return create(((PythonTree) t).getToken());
}
@Override
public boolean isNil(Object tree) {
return ((PythonTree)tree).isNil();
}
@Override
public void addChild(Object t, Object child) {
if ( t!=null && child!=null ) {
((PythonTree)t).addChild((PythonTree)child);
}
}
@Override
public Object becomeRoot(Object newRoot, Object oldRoot) {
//System.out.println("becomeroot new "+newRoot.toString()+" old "+oldRoot);
PythonTree newRootTree = (PythonTree)newRoot;
PythonTree oldRootTree = (PythonTree)oldRoot;
if ( oldRoot==null ) {
return newRoot;
}
// handle ^(nil real-node)
if ( newRootTree.isNil() ) {
int nc = newRootTree.getChildCount();
if ( nc==1 ) newRootTree = newRootTree.getChild(0);
else if ( nc >1 ) {
// TODO: make tree run time exceptions hierarchy
throw new RuntimeException("more than one node as root (TODO: make exception hierarchy)");
}
}
// add oldRoot to newRoot; addChild takes care of case where oldRoot
// is a flat list (i.e., nil-rooted tree). All children of oldRoot
// are added to newRoot.
newRootTree.addChild(oldRootTree);
return newRootTree;
}
@Override
public Object rulePostProcessing(Object root) {
//System.out.println("rulePostProcessing: "+((PythonTree)root).toStringTree());
PythonTree r = (PythonTree)root;
if ( r!=null && r.isNil() ) {
if ( r.getChildCount()==0 ) {
r = null;
}
else if ( r.getChildCount()==1 ) {
r = r.getChild(0);
// whoever invokes rule will set parent and child index
r.setParent(null);
r.setChildIndex(-1);
}
}
return r;
}
@Override
public Object create(int tokenType, Token fromToken) {
fromToken = createToken(fromToken);
//((ClassicToken)fromToken).setType(tokenType);
fromToken.setType(tokenType);
PythonTree t = (PythonTree)create(fromToken);
return t;
}
@Override
public Object create(int tokenType, Token fromToken, String text) {
fromToken = createToken(fromToken);
fromToken.setType(tokenType);
fromToken.setText(text);
PythonTree t = (PythonTree)create(fromToken);
return t;
}
@Override
public Object create(int tokenType, String text) {
Token fromToken = createToken(tokenType, text);
PythonTree t = (PythonTree)create(fromToken);
return t;
}
@Override
public int getType(Object t) {
((PythonTree)t).getType();
return 0;
}
@Override
public String getText(Object t) {
return ((PythonTree)t).getText();
}
@Override
public Object getChild(Object t, int i) {
return ((PythonTree)t).getChild(i);
}
@Override
public void setChild(Object t, int i, Object child) {
((PythonTree)t).setChild(i, (PythonTree)child);
}
@Override
public Object deleteChild(Object t, int i) {
return ((PythonTree)t).deleteChild(i);
}
@Override
public int getChildCount(Object t) {
return ((PythonTree)t).getChildCount();
}
}