Вход на хостинг
IT-новости
20.04.2016 iPhone 2017 года поместят в водонепроницаемый корпус из стекла
Линейка iPhone в новом году серьезно поменяется. В этом уверен аналитический исследователь Мин Чи Ку......
30.07.2015 Ищем уникальный контент для сайта
Ищем уникальный контент для сайта Без уникального контента Ваш сайт обречен на то, что его страницы......
}
}
public boolean mustQuit() {
String quit = context.getProperty("$QUIT");
if (quit == null) {
return false;
}
if (quit.equals("yes")
|| quit.equals("true")) {
return true;
} else {
return false;
}
}
public boolean mustStopOnError() {
String quit = context.getProperty("$STOPONERROR");
if (quit == null) {
return true;
}
if (quit.equals("yes")
|| quit.equals("true")) {
return true;
} else {
return false;
}
}
Отметим пару особенностей потокового режима работы.
Во-первых, каким образом интепретатор узнает о необходимости завершения интерпретации? Если программа для выполнения считывается из файла, то, очевидно, конец файла и служит сигналом интерпретатору. Но что, если строки программы поступают с консоли?
Во-вторых, что должен делать интерпретатор при обнаружении ошибки – прервать выполнение или продолжить его со следующего оператора?
Обе проблемы просто решаются с использованием контекста выполнения. Заведем в контексте специальные переменные (назовем их соответственно $QUIT и $STOPON-ERROR) и заставим интерпретатор проверять их значения после выполнения очередного оператора.
Аналогичным образом можно решить задачу выдачи приглашения ко вводу, если ввод осуществляется с консоли. Если контекстная переменная $PROMPT что-то содержит, то это «что-то» и будет использовано в качестве приглашения.
Конкретный интерпретатор
Описанный абстрактный интерпретатор все еще не может быть непосредственно встроен в какую-либо систему. Необходимо конкретизировать методы инициализации.
В качестве примера создадим конкретный интепретатор и реализуем для него простую, но мощную систему команд.
package simplecli;
import java.util.*;
import simplecli.command.*;
public class BaseInterpreter extends Interpreter {
public void initContext(Properties context) {
context.setProperty("$QUIT", "false");
context.setProperty("$STOPONERROR", "false");
context.setProperty("$PROMPT", ">");
}
public void initCommands(Hashtable commands) {
commands.put("exit", new ExitCommand());
commands.put("quit", new ExitCommand());
commands.put("bye", new ExitCommand());
commands.put("help", new HelpCommand(this));