|
Вопрос # 566/ вопрос открыт / |
|
Здравствуйте, уважаемые эксперты!
Продолжая тему "реакции" программы, назрел вопрос. Нужна реализация командного языка. допустим есть команда "Load" (будет каким-нибудь действием, например LoadFromFile), вводим в TEdit фразу "Load fail.txt". Программа должна разделить-понять фразу и выполнить LoadFromFile('file.txt'). Какие мысли по осуществлению? заранее спасибо.
 |
Вопрос задал: 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 дней с момента отправки ответа)
Ответ #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
|
Мини-форум вопроса
Мини-форум пуст.
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|