Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 566

/ вопрос открыт /

Здравствуйте, уважаемые эксперты!
Продолжая тему "реакции" программы, назрел вопрос. Нужна реализация командного языка. допустим есть команда "Load" (будет каким-нибудь действием, например LoadFromFile), вводим в TEdit фразу "Load fail.txt". Программа должна разделить-понять фразу и выполнить LoadFromFile('file.txt'). Какие мысли по осуществлению? заранее спасибо.

Phoenix Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Phoenix (статус: Посетитель)
Вопрос отправлен: 10 мая 2007, 20:21
Состояние вопроса: открыт, ответов: 3.

Ответ #1. Отвечает эксперт: Сергей Устинов

Здравствуйте, Phoenix!

var comand,parametr:string;
begin
comand:=copy(Edit1.Text,1,pos(' ',Edit1.Text)-1);
parametr:=copy(Edit1.Text,pos(' ',Edit1.Text)+1,length(Edit1.Text)-pos(' ',Edit1.Text));
if comand='copy' then LoadFromFile(parametr);
if comand='save' then SaveToFile(parametr);
end;

В Edit1 введете текст, его разбиваем на 2 части - первая - команда - содержится в переменной comand - все до первого пробела, вторая часть - все после первого пробела - содержится в переменной parametr.
Далее в зависимости от значения переменной comand совершаем разные действия с параметром.

Удачи!

Ответ отправил: Сергей Устинов (статус: 2-ой класс)
Время отправки: 10 мая 2007, 20:52

Ответ #2. Отвечает эксперт: Матвеев Игорь Владимирович

Здравствуйте, Phoenix!
1. - Если планируется просто команды и параметры, разделяете строку по словам, проверяете первое слово, а остальные слова - параметры для команды;
2. - Если нужно вычисление, например 1+1 должно значить 2, а 'стр1'+'стр2'='стр1стр2' возьмите что-нибудь из темы "вычисление выражений" и адаптируйте для строк, т.е. если справа и слева строка - соединение строк, если числа - сложение, иначе - ошибка;
3. - Если нужно что-то более сложное, как условное ветвление, переменные и т.д. возьмите один из скрипт-движков и не изобретайте свой велосипед;

P.S. В последнем случае могу порекомендовать скрипт движок Cajscript, прикреплённый файл. Синтаксис нативного паскаля, без объектов. Простой, понятный, не использует объектов и компонентов. Легко изменить для своих нужд.
К ответу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки ответа)

Ответ отправил: Матвеев Игорь Владимирович (статус: Студент)
Время отправки: 11 мая 2007, 07:24

Ответ #3. Отвечает эксперт: min@y™

Я имею некоторый опят по написанию командных интерпретаторов. Делал на работе программу для универсального пульта настройки устройств, изготавливаемых нашим заводиком. Изложу кратко назначение программы. В ISA-слот компа вставляется спец-плата, которая по параллельному интерфейсу (через 54-жильный жгут) связывается с универсальным пультом настройки. В этом пульте имеется 135-контактный разъём, в который, собственно, вставляется опытный образец изделия. Далее, разработчиком изделия пишется программа-скрипт для выдачи на устройство данных, их приём оттуда и анализ. Кусок типичного скрипта выглядит так:
//-----------------------------------
=p0601: "Параметр 1. Проверка команд <20> и <60>.";
=iap;
m2 100, 001;
=halt "Проконтролировать вольтметром на гнезде А32 относительно гнезда А33 универсального адаптера ия (2,4-5) В.";
m2 100, 002;
=halt "Проконтролировать на гнезде А32 относительно гнезда А33 универсального адаптера уровень напряжения (0-0,4) В.";
m2 100, 001;
=halt "Проконтролировать вольтметром на гнезде А32 относительно гнезда А33 универсального адаптера ия (2,4-5) В.";

[Reg136] b2? 136; / Чтение регистра 136 /
{(Reg136 & $20) / $20}; / Вычисление 1 в ИМ5 /
~cmpf 1, 0.0001;

m2 100, 010;
=halt "Проконтролировать вольтметром на гнезде А32 относительно гнезда А33 универсального адаптера уровень напряжения (0-0,4) В.";
[Reg136] b2? 136; / Чтение регистра 136 /
{(Reg136 & $20) / $20}; / Вычисление 0 в ИМ5 /
~cmpf 0, 0.0001;

=halt "";
//-----------------------------------

Чтобы интерпретатор понимал и различал более сотни разных команд, у которых может быть ПЕРЕМЕННОЕ количество параметров (операндов), а также операнды разных типов, например, строки в кавычках, числа с плавающей точкой, целые, а также комментарии, пришлось некисло потрудиться. Но особенно хорошо вышла возможность быстро и без особых усилий добавлять новые команды.

Эта моя программа легла в основу статьи в журнале "Хакер №67" от 07.2004 "Интерпретируй это" (я был соавтором статьи). Советую прочитать. Также ты можешь скачать хэлп от моей проги отсюда: http://sourceviewer.narod.ru/downloads/help.rar и почитать, что там как.

Также, могу выслать исходники, мне не жалко, только предупреждаю, что одних *.pas файлов там пол-мегабайта.

З.Ы. Если что - пиши в мыло.

Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 11 мая 2007, 08:56


Мини-форум вопроса

Мини-форум пуст.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:57
Выполнено за 0.02 сек.