Я собираюсь начать программировать демонстрационную программу для лекции, которую собираюсь прочесть. Я хочу, чтобы каждый ученик в классе загрузил это приложение, а затем смог создавать экземпляры объектов (и их графические представления) в интерактивном режиме через командную строку. Я решил писать на java не потому, что это язык, с которым я лучше всего знаком, а потому, что в нем есть простые графические классы, и я могу быть уверен, что jar будет работать на их компьютерах.
Интро окончено. Теперь вопрос:
Каков хороший способ реализовать некоторый пользовательский синтаксис командной строки для этой программы? Я хочу использовать простой произвольный синтаксис, например:
CREATE Monster Bob;
Bob.jump();
LS Bob //to list Bob's methods or something.
LS CREATE //to list all the classes
Сначала я расскажу о том, что первое пришло мне в голову, когда я подумал об этой проблеме.
Я могу представить, что у меня мог бы быть набор карт в виде дерева. Я мог разобрать каждое ключевое слово как ключ к следующей карте. Таким образом, «СОЗДАЙТЕ монстра Боба» можно оценить как
1) Найдите карту ключевых слов для ключа «СОЗДАТЬ». Возвращает значение, являющееся ссылкой на карту классов. 2) Поиск карты классов по ключу "Монстр". Возвращает значение, которое является фабричным классом, реализующим некоторый интерфейс Leaf, который позволяет мне узнать, что это значение листа (я проверю, используя instanceof).
3) Возможно, интерфейс Leaf будет содержать метод с именем execute(), который будет делать все, что захочет. В этом случае он создал бы объект Monster, добавив этот объект на карту под названием Objects с именем Bob. (Эта история с Листом звучит уродливо, но ее можно исправить.)
Прохладный. Но вот это утверждение для меня немного сложнее: Bob.jump();
1) Найдите на карте объектов «Боба». Возвратите некоторый объект, реализующий интерфейс, с помощью метода вроде "evaluate(String s)" и передайте ему строку "jump()"
2) Боб ищет некоторую внутреннюю карту методов для "jump()", затем... ? В С++ ключ был бы указателем на функцию-член Monster.jump(), которая будет выполняться. Но я не верю, что в java нет такой вещи, как указатель на функцию. Я читал, что для этого можно использовать анонимный класс, хотя я не пробовал. Похоже, это сработает.
Итак, это сработает, но есть ли более элегантный способ сделать это? Я никогда раньше не писал никаких интерпретаторов. Я хотел бы сделать это красиво и научиться чему-то в процессе, если у кого-то есть несколько советов. Это кажется потенциально подверженным ошибкам способом делать что-то, если я не очень структурирован, особенно когда Боб и любой другой объект начинают анализировать свои собственные инструкции и использовать анонимные функции. Кроме того, похоже, что каждому классу помимо обычного кода потребуется готовый к выполнению интерфейс.
Я также не очень хорошо знаю Java, поэтому, если есть места, где я могу столкнуться с кирпичной стеной, то я тоже хотел бы знать.
Спасибо за помощь заранее.