Java — глобальная переменная или что-то в этом роде

#java #variables #interface

#java #переменные #интерфейс

Вопрос:

У меня возникли проблемы с пониманием назначения в Java. В основном мы пишем интерпретатор, и он должен быть простым. Я не использовал Java более 2 лет, поэтому почти все мои знания забыты.

В основном классы, которые мне нужно создать, выглядят так.

     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, и все они должны быть отредактированы интерпретатором.

Спасибо, если вы прочитали до сих пор!

Комментарии:

1. Program pro_inst = new Program(); С помощью этой строки вы создали переменную и присвоили ей что-то

2. Вы вообще перестали программировать за последние 2 года или около того?

3. Перемещаются ли классы и нужно ли реализовывать обработчик, когда они расширяют Stmt?

4. ДА. Это прямая копия заметок учителей.

Ответ №1:

Похоже, вам нужно понять идею области видимости.

Ваш программный класс добавляет различные действия (запуск, остановка, перемещение и т. Д.), Каждое из которых инкапсулируется «Обработчиком».

Каждый обработчик что-то делает. Вам решать, как определять интерпретируемые блоки кода.

Таким образом, чтобы заставить вашу программу работать, вам нужно будет добавить переменные в класс Program и изменить эти переменные в ваших методах interpretate() .

Комментарии:

1. Я знаю идею области видимости. Мой учитель написал упомянутую программу и хочет, чтобы мы использовали ее такой, какая она есть. Когда я звоню new Forward ( new Exp( new Numbers(15))) , мне нужно получить глобальную переменную x и добавить к ней 15, если вы поймете мой дрейф.

Ответ №2:

Не уверен, как вы это подразумеваете. но когда вы создаете экземпляр любого объекта, вы должны сохранять данные, используемые в объекте, с помощью конструктора —

 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 методов.

Извините, если это не то, что вы спрашиваете!

Комментарии:

1. Я понимаю вашу точку зрения, но действительно ли контекст — единственный путь? Мне нужно следовать структуре программы в моем вступительном сообщении, иначе я потерплю неудачу. Это имитация языка, написанного на BNF.