| 
 (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 
  
以上这个例子很容易扩展,增加乘除运算。 
   
 
  |