namespace DesignPattern.Interpreter
  {
public abstract class Expression
 {
public abstract bool Interpret();
}
public class Constant : Expression
 {
private bool m_val;
public Constant(bool val)
 {
this.m_val=val;
}
public override bool Interpret()
 {
return this.m_val;
}
public override string ToString()
 {
return this.m_val.ToString();
}
}
public class And : Expression
 {
public Expression left,right;
public And(Expression left,Expression right)
 {
this.left=left;
this.right=right;
}
public override bool Interpret()
 {
return left.Interpret()&&right.Interpret();
}
public override string ToString()
 {
return "("+this.left.ToString()+" && "+this.right.ToString()+")";
}
}
public class Or : Expression
 {
public Expression left,right;
public Or(Expression left,Expression right)
 {
this.left=left;
this.right=right;
}
public override bool Interpret()
 {
return left.Interpret()||right.Interpret();
}
public override string ToString()
 {
return "("+this.left.ToString()+" || "+this.right.ToString()+")";
}
}
public class Not : Expression
 {
private Expression exp;
public Not(Expression exp)
 {
this.exp=exp;
}
public override bool Interpret()
 {
return !exp.Interpret();
}
public override string ToString()
 {
return "(! "+exp.ToString()+")";
}
}
public class Client
 {
public static void Main()
 {
Expression exp=new Or(new And(new Constant(true),new Constant(false)),
new And(new Constant(true),new Not(new Constant(false))));
Console.WriteLine(exp.ToString()+"="+exp.Interpret());
}
}
}
|