我在理解Java中的赋值时遇到了问题。基本上,我们正在编写一个解释器,应该很简单。我已经两年多没有使用Java了,所以我几乎忘记了所有的知识。
基本上,我需要创建的类看起来像这些类。
public interface Handler {
void interpret();
}
public class Program implements Handler{
@Override
public void interpret() {
// write the interpret logic here
}
}
public class Stmt implements Handler {
@Override
public void interpret() {
// write the interpret logic here
}
}
public class Move extends Stmt implements Handler {
public void interpret() {
// write the interpret logic here
}
}
public class Right extends Move implements Handler {
public Right( Exp i )
{
interpret();
}
public void interpret() {
// write the interpret logic here
}
}测试程序需要如下所示:
Program pro_inst = new Program();
pro_inst.addStmt(new Start(new Exp(new Numbers(23)), new Exp(new Numbers(
pro_inst.addStmt(new Forward(new Exp(new Numbers(15)) ) );
... ...
pro_inst.addStmt( new Stop());
... ..我游手好闲了几个小时,但我很努力。例如,我在哪里赋值变量,如何使用解释器编辑它们?我发现我一直在我的测试程序中创建新的对象,我应该返回值还是什么?我需要在某个地方有一个变量x和y,它们都需要由解释器编辑。
如果你读到目前为止,谢谢你!
发布于 2011-10-15 00:15:31
听起来你需要理解作用域的概念。
您的程序类正在添加不同的操作(启动、停止、移动等)。)它们每个都由一个"Handler“封装。
每个处理程序都会做一些事情。您可以自行定义解释代码块。
因此,要使您的程序工作,您必须将变量添加到program类,并在interpret()方法中修改这些变量。
发布于 2011-10-15 00:15:38
不知道你是怎么想的。但是,当您实例化任何对象时,应该使用构造函数在对象中存储数据-
public class Numbers extends Expr{
double value = 0;
public Numbers(double x){
this.value = x;
}
public Object evaluate(){
return value;
}
}
public class Start extends Stmt{
Vector<Expr> expressions = new Vector<Expr>();
public Stmt(Expr x1, Expr x2){
expressions.add(x1);
expressions.add(x2);
}
public void interpret(){
// do something with your list of 'expressions'
}
}在执行测试程序时实例化的对象应该存储在构造函数中传递的那些值,如上所述。
例如,如果您想要进行赋值,则应该构造如下所示的内容
class Assignment extends Stmt{
String lhs;
Expr rhs;
public Assignment(String lhs, Expr rhs){
this.rhs=rhs; this.lhs=lhs;
}
public void interpret(Map context){
context.put(lhs, rhs.evaluate());
}
}
class VariableExpr extends Expr{
String name;
public VariableExpr(String name){
this.name=name;
}
public Object evaluate(Map context){
return context.get(name);
}
}在解释每个语句时,您需要有一个上下文。如果需要全局上下文,只需从一个空白的HashMap开始,并将相同的映射传递给interpret方法的每次调用。
如果这不是您要问的,很抱歉!
https://stackoverflow.com/questions/7770374
复制相似问题