using System;
using System.Collections.Generic;
using System.Text;
using CLab.Auxiliary;
using CLab.Exceptions;
namespace CLab
{
///
/// Superclass for the different types of Expressions
///
abstract public class Expression
{
private Common.ExprType type;
///
/// Constructor
///
/// The type of the expression: This can be either an operator
/// working on a left and right side, or an id or integer expression
public Expression(Common.ExprType type)
{
this.type = type;
}
///
/// Returns the type
///
public Common.ExprType Type
{
get { return this.type; }
}
///
/// Converts the type to an operator sign for printout
///
/// The operator to print out
///
public String Type2oper(Common.ExprType type)
{
String setOper;
switch (type)
{
case Common.ExprType.et_impl:
setOper = ">>";
break;
case Common.ExprType.et_or:
setOper = "|";
break;
case Common.ExprType.et_and:
setOper = "&";
break;
case Common.ExprType.et_lte:
setOper = "<=";
break;
case Common.ExprType.et_gte:
setOper = ">=";
break;
case Common.ExprType.et_lt:
setOper = "<";
break;
case Common.ExprType.et_gt:
setOper = ">";
break;
case Common.ExprType.et_ne:
setOper = "!=";
break;
case Common.ExprType.et_eq:
setOper = "==";
break;
case Common.ExprType.et_minus:
setOper = "-";
break;
case Common.ExprType.et_plus:
setOper = "+";
break;
case Common.ExprType.et_mod:
setOper = "%";
break;
case Common.ExprType.et_div:
setOper = "/";
break;
case Common.ExprType.et_times:
setOper = "*";
break;
default:
throw new ClabInternalErrorException("Invalid ExpressionGammel type");
}
return setOper;
}
public override string ToString()
{
if (this.type.Equals(Common.ExprType.et_id))
{
IdExpression idExpression = (IdExpression)this;
return (String.Format("{0}", idExpression.Id));
}
else if (this.type.Equals(Common.ExprType.et_val))
{
IntExpression intExpression = (IntExpression)this;
return (String.Format("{0}", intExpression.IntegerValue));
}
else if (this.type.Equals(Common.ExprType.et_neg))
{
NotNegExpression nnExpression = (NotNegExpression)this;
return (String.Format("(-{0})", nnExpression.Left));
}
else if (this.type.Equals(Common.ExprType.et_not))
{
NotNegExpression nnExpression = (NotNegExpression)this;
return (String.Format("(!{0})", nnExpression.Left));
}
else
{
BinaryExpression binExpression = (BinaryExpression)this;
return (String.Format("({0} {1} {2})", binExpression.Left, Type2oper(binExpression.Type), binExpression.Right));
}
}
}
}