#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.