/* Generated By:JJTree: Do not edit this line. ASTterm.java Version 4.3 */
/* JavaCCOptions:MULTI=true,NODE_USES_PARSER=false,VISITOR=true,TRACK_TOKENS=false,NODE_PREFIX=AST,NODE_EXTENDS=,NODE_FACTORY=,SUPPORT_CLASS_VISIBILITY_PUBLIC=true */
package parser;
import java.util.ArrayList;
import utilities.Pair;
import warnings.StringListUtils;
public class ASTterm extends SimpleNode {
public ASTterm(int id) {
super(id);
}
public ASTterm(SparcTranslator p, int id) {
super(p, id);
}
public ASTterm(long value) {
super(SparcTranslatorTreeConstants.JJTTERM);
this.jjtAddChild(new ASTarithmeticTerm(value), 0);
}
public ASTterm(String image) {
super(SparcTranslatorTreeConstants.JJTTERM);
Pair<String, ArrayList<String>> recordContents = StringListUtils
.splitTerm(image);
if (recordContents != null) {
ASTsymbolicFunction func = new ASTsymbolicFunction(
SparcTranslatorTreeConstants.JJTSYMBOLICFUNCTION);
func.image = recordContents.first + "(";
ASTtermList termList = new ASTtermList(
SparcTranslatorTreeConstants.JJTTERMLIST);
for (int i = 0; i < recordContents.second.size(); i++) {
ASTterm newTerm = new ASTterm(recordContents.second.get(i));
termList.jjtAddChild(newTerm, i);
}
ASTsymbolicTerm sterm = new ASTsymbolicTerm(
SparcTranslatorTreeConstants.JJTSYMBOLICTERM);
sterm.jjtAddChild(func, 0);
sterm.jjtAddChild(termList, 1);
this.jjtAddChild(sterm, 0);
} else {
if(isNumericConstant(image)) {
this.jjtAddChild(new ASTarithmeticTerm(Long.parseLong(image)), 0);
}
else if (!Character.isLowerCase(image.charAt(0))) {
ASTvar var = new ASTvar(SparcTranslatorTreeConstants.JJTVAR);
var.image = image;
this.jjtAddChild(var, 0);
} else {
ASTsymbolicConstant sconstant = new ASTsymbolicConstant(
SparcTranslatorTreeConstants.JJTSYMBOLICCONSTANT);
sconstant.image = image;
ASTsymbolicTerm sterm = new ASTsymbolicTerm(
SparcTranslatorTreeConstants.JJTSYMBOLICTERM);
sterm.jjtAddChild(sconstant, 0);
this.jjtAddChild(sterm, 0);
}
}
}
public ASTterm(String recordName, ArrayList<String> varArgs) {
super(SparcTranslatorTreeConstants.JJTTERM);
ASTsymbolicFunction symFunction = new ASTsymbolicFunction(
SparcTranslatorTreeConstants.JJTSYMBOLICFUNCTION);
symFunction.image = recordName + "(";
ASTtermList termList = new ASTtermList(
SparcTranslatorTreeConstants.JJTTERMLIST);
for (int i = 0; i < varArgs.size(); i++) {
ASTterm term = new ASTterm(SparcTranslatorTreeConstants.JJTTERM);
ASTvar var = new ASTvar(SparcTranslatorTreeConstants.JJTVAR);
var.image = varArgs.get(i);
term.jjtAddChild(var, 0);
termList.jjtAddChild(term, i);
}
ASTsymbolicTerm sterm = new ASTsymbolicTerm(
SparcTranslatorTreeConstants.JJTSYMBOLICTERM);
sterm.jjtAddChild(symFunction, 0);
sterm.jjtAddChild(termList, 1);
this.jjtAddChild(sterm, 0);
}
public ASTterm(ASTvar newVar) {
super(SparcTranslatorTreeConstants.JJTTERM);
this.jjtAddChild(newVar, 0);
// TODO Auto-generated constructor stub
}
public static ASTterm createArithmeticVarTerm(ASTvar var) {
ASTterm term=new ASTterm(SparcTranslatorTreeConstants.JJTTERM);
ASTarithmeticTerm arTerm=new ASTarithmeticTerm(SparcTranslatorTreeConstants.JJTARITHMETICTERM);
ASTadditiveArithmeticTerm adTerm=new ASTadditiveArithmeticTerm(SparcTranslatorTreeConstants.JJTADDITIVEARITHMETICTERM);
adTerm.image="+";
ASTmultiplicativeArithmeticTerm multTerm=new ASTmultiplicativeArithmeticTerm(SparcTranslatorTreeConstants.JJTMULTIPLICATIVEARITHMETICTERM);
ASTatomicArithmeticTerm atTerm=new ASTatomicArithmeticTerm(SparcTranslatorTreeConstants.JJTATOMICARITHMETICTERM);
atTerm.image="";
atTerm.jjtAddChild(var, 0);
multTerm.jjtAddChild(atTerm, 0);
adTerm.jjtAddChild(multTerm, 0);
arTerm.jjtAddChild(adTerm, 0);
term.jjtAddChild(arTerm, 0);
return term;
}
public ASTterm(ASTadditiveArithmeticTerm arAdTerm) {
super(SparcTranslatorTreeConstants.JJTTERM);
ASTarithmeticTerm arTerm=new ASTarithmeticTerm(SparcTranslatorTreeConstants.JJTARITHMETICTERM);
arTerm.jjtAddChild(arAdTerm, 0);
this.jjtAddChild(arTerm, 0);
}
/** Accept the visitor. **/
public Object jjtAccept(SparcTranslatorVisitor visitor, Object data) {
return visitor.visit(this, data);
}
/**
* Check if this term has variables
*
* @return true if it has and false otherwise
*/
public boolean hasVariables() {
return hasVariables((SimpleNode) this);
}
/**
* Check if SimpleNode has variables
*
* @param n
* SimpleNode to check
* @return true if it has and false otherwise
*/
private boolean hasVariables(SimpleNode n) {
if (n.getId() == SparcTranslatorTreeConstants.JJTVAR) {
return true;
}
boolean result = false;
for (int i = 0; i < n.jjtGetNumChildren(); i++) {
if (hasVariables((SimpleNode) n.jjtGetChild(i))) {
result = true;
break;
}
}
return result;
}
/**
* Check if the terms has arithmetic operations
*
* @return true if it has an arithmetic operation ( +,-,*,/) and false
* otherwise
*/
public boolean hasArithmeticOperations() {
String termString = this.toString();
String operations = "+-*/";
for (char c : operations.toCharArray()) {
if (termString.indexOf(c) != -1)
return true;
}
return false;
}
/**
* Check if the term is ground
*
* @return true or false
*/
public boolean isGround() {
return !hasArithmeticOperations() && !hasVariables();
}
private static boolean isNumericConstant(String image) {
for (int i = 0; i < image.length(); i++) {
if (i == 0 && image.charAt(i) < '1' || image.charAt(i) > '9') {
return false;
} else {
if (image.charAt(i) < '0' || image.charAt(i) > '9')
return false;
}
}
return true;
}
public boolean isVariable() {
SimpleNode child = (SimpleNode) this.jjtGetChild(0);
return child.getId() == SparcTranslatorTreeConstants.JJTVAR;
}
public boolean isRecord() {
SimpleNode child = (SimpleNode) this.jjtGetChild(0);
if (child.getId() == SparcTranslatorTreeConstants.JJTSYMBOLICTERM) {
SimpleNode childOfChild = (SimpleNode) child.jjtGetChild(0);
return childOfChild.getId() == SparcTranslatorTreeConstants.JJTSYMBOLICFUNCTION;
} else {
return false;
}
}
public String getRecordName() {
if(!isRecord()) {
throw new IllegalArgumentException();
}
SimpleNode symTerm = (SimpleNode) this.jjtGetChild(0);
SimpleNode symFunc = (SimpleNode) symTerm.jjtGetChild(0);
return symFunc.image.substring(0,symFunc.image.length()-1);
}
public ArrayList<ASTterm> getRecordArgs() {
if(!isRecord()) {
throw new IllegalArgumentException();
}
SimpleNode symTerm = (SimpleNode) this.jjtGetChild(0);
SimpleNode symTermList = (SimpleNode) symTerm.jjtGetChild(1);
ArrayList<ASTterm> result = new ArrayList<ASTterm>();
for(int i=0;i<symTermList.jjtGetNumChildren();i++) {
result.add((ASTterm)symTermList.jjtGetChild(i));
}
return result;
}
public String toString() {
return toString(false);
}
public String toString(boolean useOriginalImages) {
if (this.jjtGetNumChildren() == 0) {
return this.image;
} else
return ((SimpleNode) (this.jjtGetChild(0)))
.toString(useOriginalImages);
}
public ASTmultiplicativeArithmeticTerm getLeftMostMultiplicativeTerm() {
ASTarithmeticTerm arTerm=(ASTarithmeticTerm)this.jjtGetChild(0);
ASTadditiveArithmeticTerm adTerm=(ASTadditiveArithmeticTerm)arTerm.jjtGetChild(0);
return (ASTmultiplicativeArithmeticTerm)adTerm.jjtGetChild(0);
}
public ASTatomicArithmeticTerm getLeftMostAtomicTerm() {
ASTmultiplicativeArithmeticTerm mTerm=getLeftMostMultiplicativeTerm();
return (ASTatomicArithmeticTerm)mTerm.jjtGetChild(0);
}
}
/*
* JavaCC - OriginalChecksum=c1ac1ba327197118b424963735d16a51 (do not edit this
* line)
*/