A Simple Sample for Expression Tree
(wang hailong)
我写过一篇用Visitor Pattern处理表达式树的例子。本文讲解表达式树处理的一般方法,给出一个简单例子的源代码,并给出相关解释。
源代码通过编译,正确运行。java expr.TestMain
首先,我们来看被表达式的类的定义。
Expression.java 表达式类公用接口,所有的表达式类都要实现这个接口
package expr;
public interface Expression {
public int value();
}
ConstantExpression.java 常数表达式
package expr;
public class ConstantExpression implements Expression{
protected int data;
public ConstantExpression(int theData){
data = theData;
}
public int value(){
return data;
}
}
VariableExpression.java 变量表达式
package expr;
import java.util.Map;
public class VariableExpression implements Expression{
protected String myName;
protected Map variableTable;
public VariableExpression(String itsName, Map theVariableTable){
myName = itsName;
variableTable = theVariableTable;
}
// get the variable name
public String name(){
return myName;
}
public int value(){
// search in table
Object valueObj = variableTable.get(myName);
if(valueObj == null){
return 0;
}
int data = ((Integer)valueObj).intValue();
return data;
}
}
AddExpression.java 加法表达式
package expr;
public class AddExpression implements Expression {
protected Expression leftNode;
protected Expression rightNode;
public AddExpression(Expression aLeftNode, Expression aRightNode) {
leftNode = aLeftNode;
rightNode = aRightNode;
}
public int value() {
return leftNode.value() + rightNode.value();
}
}
SubExpression.java 减法表达式
package expr;
public class SubExpression implements Expression {
protected Expression leftNode;
protected Expression rightNode;
public SubExpression(Expression aLeftNode, Expression aRightNode) {
leftNode = aLeftNode;
rightNode = aRightNode;
}
public int value() {
return leftNode.value() - rightNode.value();
}
}
以上就是表达式部分所有的代码了。
下面是测试程序。
TestMain.java 首先,生成一个表达式树,然后获取这个表达式的值
package expr;
import java.util.Map;
import java.util.Hashtable;
public class TestMain{
public static void main(String[] args) {
Map variableTable = new Hashtable();
//生成一个表达式树x - (6 + y)
VariableExpression x = new VariableExpression("x", variableTable);
VariableExpression y = new VariableExpression("y", variableTable);
ConstantExpression six = new ConstantExpression(6);
AddExpression six_add_y = new AddExpression(six, y);
SubExpression x_sub_6_y = new SubExpression(x, six_add_y);
// set value for variables
variableTable.put(x.name(), new Integer(11)); // x = 11
variableTable.put(y.name(), new Integer(3)); // y = 3
// 运算
int result = x_sub_6_y.value();
System.out.println(result);
}
}
输出结果为:
2
以上这个例子很容易扩展,增加乘除运算。