package com.icona.tree.nodes;
import java.util.ArrayList;
import com.icona.helper.CodeStringBuilder;
import com.icona.tree.nodes.GenericRef.RefType;
import com.icona.tree.nodes.Operator.AssignmentOperator;
import com.icona.tree.nodes.Operator.AssignmentOperator.AssignmentSymbol;
import com.icona.tree.nodes.Operator.BinaryOperator;
import com.icona.tree.nodes.Operator.BinaryOperator.BinarySymbol;
import com.icona.tree.nodes.Operator.TertiaryOperator;
import com.icona.tree.nodes.Operator.UnaryOperator;
import com.icona.tree.nodes.Operator.UnaryOperator.UnarySymbol;
public abstract class Expression extends Statement {
public Expression(Node parent, int line_no) {
super(parent, line_no);
// TODO Auto-generated constructor stub
}
public abstract boolean isNonBoolean();
@Override
public boolean hasMultipleExpressions(){
return false;
}
public static class AssignmentExpression extends Expression{
Expression target=null;
Expression value=null;
AssignmentOperator operator=null;
public AssignmentExpression(Node parent, int line_no,AssignmentSymbol symbol) {
super(parent, line_no);
operator=new AssignmentOperator(symbol);
}
public AssignmentSymbol getOperator() {
return operator.getSymbol();
}
public void setOperator(AssignmentSymbol operator) {
this.operator.setSymbol(operator);
}
public Expression getTarget() {
return target;
}
public void setTarget(Expression target) {
this.target = target;
}
public Expression getValue() {
return value;
}
public void setValue(Expression value) {
this.value = value;
}
public String toString(){
StringBuilder sb=new StringBuilder();
//sb.append("\t");
sb.append(target.toString());
//sb.append(" ");
if(!operator.isNull()){
sb.append(operator.toString());
//sb.append(" ");
sb.append(value.toString());
}
return sb.toString();
}
@Override
public boolean isNonBoolean() {
return true;//TODO: Check if simple assignment in java returns anything
}
}
public static class UnaryExpression extends Expression{
UnaryOperator operator;
Expression expression;
public UnaryExpression(Node parent, int line_no,UnarySymbol symbol) {
super(parent, line_no);
operator=new UnaryOperator(symbol);
}
public UnaryExpression(Node parent, int line_no,UnarySymbol symbol,Expression expression) {
super(parent, line_no);
operator=new UnaryOperator(symbol);
this.expression=expression;
}
public UnarySymbol getOperator() {
return operator.getSymbol();
}
public void setOperator(UnarySymbol operator) {
this.operator.setSymbol(operator);
}
public Expression getExpression() {
return expression;
}
public void setExpression(Expression expression) {
this.expression = expression;
}
public String toString(){
StringBuilder sb=new StringBuilder();
if(operator!=null && !operator.isNull())
sb.append(operator.toString());
sb.append(expression.toString());
return sb.toString();
}
@Override
public boolean isNonBoolean() {
return true;
}
}
public static class BinaryExpression extends Expression{
//ArrayList<Expression> expressions=new ArrayList<Expression>();
Expression lhs=null;
Expression rhs=null;
BinaryOperator operator=null;
public BinaryExpression(Node parent, int line_no,BinarySymbol operator) {
super(parent, line_no);
this.operator=new BinaryOperator(operator);
}
public Expression getLhs() {
return lhs;
}
public void setLhs(Expression lhs) {
this.lhs = lhs;
}
public Expression getRhs() {
return rhs;
}
public void setRhs(Expression rhs) {
this.rhs = rhs;
}
public BinarySymbol getOperator() {
return operator.getSymbol();
}
public void setOperator(BinarySymbol operator) {
this.operator.setSymbol(operator);
}
public String toString(){
StringBuilder sb=new StringBuilder();
//sb.append(" ");
sb.append(lhs.toString());
//sb.append(" ");
if(!operator.isNull()){
sb.append(operator.toString());
//sb.append(" ");
sb.append(rhs.toString());
}
return sb.toString();
}
@Override
public boolean isNonBoolean() {
// TODO Auto-generated method stub
if(rhs==null) return lhs.isNonBoolean();
else if(operator.isBoolean() ==false) return true;
return false;
}
/*public ArrayList<Expression> getExpressions(){
return expressions;
}
@Override
public void addChild(Node node) {
expressions.add((Expression)node);
}
@Override
public Node getNextChild(Node existing) {
int index=expressions.indexOf((Expression)existing);
return (index >=0 )? expressions.get(index+1):null;
}
@Override
public Node getPreviousChild(Node existing) {
int index=expressions.indexOf((Expression)existing);
return (index >=0 )? expressions.get(index-1):null;
}
@Override
public boolean replaceChild(Node existing, Node by) {
// TODO Auto-generated method stub
return super.replaceChild(existing, by);
}
@Override
public Node getNextSibling() {
return super.getNextChild(this);
}
@Override
public Node getPreviousSibling() {
return super.getPreviousChild(this);
}*/
}
public static class TertiaryExpression extends Expression{
private Expression conditionExpression=null;
private Expression ifExpression=null;
private Expression elseExpression=null;
public TertiaryExpression(Node parent, int line_no) {
super(parent, line_no);
// TODO Auto-generated constructor stub
}
public Expression getConditionExpression() {
return conditionExpression;
}
public void setConditionExpression(Expression conditionExpression) {
this.conditionExpression = conditionExpression;
}
public Expression getIfExpression() {
return ifExpression;
}
public void setIfExpression(Expression ifExpression) {
this.ifExpression = ifExpression;
}
public Expression getElseExpression() {
return elseExpression;
}
public void setElseExpression(Expression elseExpression) {
this.elseExpression = elseExpression;
}
public String toString(){
StringBuilder sb=new StringBuilder();
sb.append(conditionExpression.toString());
if(ifExpression!=null){
sb.append(TertiaryOperator.TERTIARY_CONDITION.toString());
sb.append(ifExpression.toString());
sb.append(TertiaryOperator.TERTIARY_ELSE.toString());
sb.append(elseExpression.toString());
}
return sb.toString();
}
@Override
public boolean isNonBoolean() {
// TODO Auto-generated method stub
return (ifExpression.isNonBoolean() || elseExpression.isNonBoolean());
}
}
public static class PrimaryExpression extends Expression{
GenericRef ref=null;
Expression expression=null;
boolean hasParanthesis=false;
public PrimaryExpression(Node parent, int line_no,String str,RefType type) {
super(parent, line_no);
// TODO Auto-generated constructor stub
ref=new GenericRef(str, type);
}
public PrimaryExpression(Node parent, int line_no,Expression expression) {
super(parent, line_no);
// TODO Auto-generated constructor stub
this.expression=expression;
}
public boolean isHasParanthesis() {
return hasParanthesis;
}
public void setHasParanthesis(boolean hasParanthesis) {
this.hasParanthesis = hasParanthesis;
}
public String toString(){
if(ref!=null)
return ref.toString();
StringBuilder sb=new StringBuilder();
if(hasParanthesis)
sb.append("(");
sb.append(expression.toString());
if(hasParanthesis)
sb.append(")");
return sb.toString();
}
@Override
public boolean isNonBoolean() {
// TODO Auto-generated method stub
if(ref!=null) return true;
else if(expression!=null) return expression.isNonBoolean();
return false;
}
}
public static class PostfixExpression extends Expression{
PrimaryExpression primaryExpression=null;
Expression expression=null;
UnaryOperator operator=null;
boolean isArr=false; //TODO hardcoded should be changed
public PostfixExpression(Node parent, int line_no) {
super(parent, line_no);
// TODO Auto-generated constructor stub
}
public boolean isArr() {
return isArr;
}
public void setArr(boolean isArr) {
this.isArr = isArr;
}
public PrimaryExpression getPrimaryExpression() {
return primaryExpression;
}
public void setPrimaryExpression(PrimaryExpression primaryExpression) {
this.primaryExpression = primaryExpression;
}
public Expression getExpression() {
return expression;
}
public void setExpression(Expression expression) {
this.expression = expression;
}
public UnarySymbol getOperator() {
return operator.getSymbol();
}
public void setOperator(UnarySymbol operator) {
this.operator.setSymbol(operator);
}
public String toString(){
return primaryExpression.toString();
}
@Override
public boolean isNonBoolean() {
// TODO Auto-generated method stub
return false;
}
}
static public class ListExpression extends Expression{
ArrayList<Expression> expressions;
public ListExpression(Node parent, int line_no) {
super(parent, line_no);
// TODO Auto-generated constructor stub
expressions=new ArrayList<Expression>();
}
public void addExpression(Expression e){
expressions.add(e);
}
public ArrayList<Expression> getExpressions() {
return expressions;
}
public void setExpressions(ArrayList<Expression> expressions) {
this.expressions = expressions;
}
private Expression getLastExpression(){
if(expressions.size()<=0)
return null;
return expressions.get(expressions.size()-1);
}
private ArrayList<Expression> getAllExceptLastExpression(){
ArrayList<Expression> le=(ArrayList<Expression>)expressions.clone();
le.remove(le.size()-1);
return le;
}
public String getLastExpressionString(){
Expression e=getLastExpression();
return (e!=null)? e.toString() : "";
}
public String getAllExceptLastExpressionString(){
ArrayList<Expression> le=getAllExceptLastExpression();
CodeStringBuilder sb=new CodeStringBuilder();
for(int i=0;i<le.size();i++){
sb.appendWithTabNewLine(le.get(i).toString()+";");
}
return sb.toString();
}
public String getAllExpressionStringCommaSeperated(){
StringBuilder sb=new StringBuilder();
for(int i=0;i<expressions.size()-1;i++){
sb.append(expressions.get(i).toString());
sb.append(",");
}
sb.append(expressions.get(expressions.size()-1));
return sb.toString();
}
public String toString(){
//TODO: Implement toString of ListExpression
CodeStringBuilder sb=new CodeStringBuilder();
for(int i=0;i<expressions.size();i++){
sb.appendWithTabNewLine(expressions.get(i).toString()+";");// TODO Creating Problems
}
return sb.toString();
}
public boolean isMultipleExpression(){
return (expressions.size()>1); //TODO: Method isMultipleExpression needs to be deleted
}
@Override
public boolean hasMultipleExpressions(){
return (expressions.size()>1);
}
@Override
public boolean isNonBoolean() {
// TODO Auto-generated method stub
return false;
}
}
}