CommonParseTree.java
package edu.udel.cis.vsl.abc.front.common.ptree;
import java.util.Collection;
import org.antlr.runtime.tree.CommonTree;
import edu.udel.cis.vsl.abc.config.IF.Configurations.Language;
import edu.udel.cis.vsl.abc.front.IF.ParseTree;
import edu.udel.cis.vsl.abc.token.IF.CivlcToken;
import edu.udel.cis.vsl.abc.token.IF.CivlcTokenSequence;
import edu.udel.cis.vsl.abc.token.IF.CivlcTokenSource;
import edu.udel.cis.vsl.abc.token.IF.Source;
import edu.udel.cis.vsl.abc.token.IF.SourceFile;
import edu.udel.cis.vsl.abc.token.IF.SyntaxException;
import edu.udel.cis.vsl.abc.token.IF.TokenFactory;
public abstract class CommonParseTree implements ParseTree {
protected Language language;
protected CivlcTokenSource tokenSource;
protected TokenFactory tokenFactory;
protected CommonTree root;
public CommonParseTree(Language language, CivlcTokenSource tokenSource,
CommonTree root) {
this.language = language;
this.tokenSource = tokenSource;
this.tokenFactory = tokenSource.getTokenFactory();
this.root = root;
}
@Override
public Language getLanguage() {
return this.language;
}
@Override
public CommonTree getRoot() {
return root;
}
@Override
public Source source(CommonTree tree) {
CivlcToken firstToken = null, lastToken = null;
int start = tree.getTokenStartIndex();
int stop = tree.getTokenStopIndex();
if (start >= 0)
firstToken = tokenSource.getToken(start);
if (stop >= 0)
lastToken = tokenSource.getToken(stop);
if (firstToken == null)
if (lastToken == null)
throw new IllegalArgumentException(
"No tokens associated to tree node " + tree);
else
firstToken = lastToken;
else if (lastToken == null)
lastToken = firstToken;
return tokenFactory.newSource(firstToken, lastToken);
}
@Override
public SyntaxException newSyntaxException(String message, CommonTree tree) {
return tokenFactory.newSyntaxException(message, source(tree));
}
@Override
public CivlcTokenSequence getTokenSourceProducer(CommonTree tokenListNode) {
int numChildren = tokenListNode.getChildCount();
if (numChildren == 0) {
return tokenFactory.getEmptyTokenSubsequence(tokenSource);
} else {
CivlcToken startToken = (CivlcToken) ((CommonTree) tokenListNode
.getChild(0)).getToken();
CivlcToken stopToken = (CivlcToken) ((CommonTree) tokenListNode
.getChild(numChildren - 1)).getToken();
return tokenFactory.getTokenSubsequence(tokenSource, startToken,
stopToken);
}
}
@Override
public Collection<SourceFile> getSourceFiles() {
return tokenSource.getSourceFiles();
}
@Override
public String toString() {
return tokenSource.toString();
}
@Override
public CivlcTokenSource getCivlcTokenSource() {
return this.tokenSource;
}
@Override
public TokenFactory getTokenFactory() {
return this.tokenFactory;
}
}