Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Интерпритатор языка или что-то в этом роде. [D5, D6, D7]


Страницы:   1 2 3 4 5

S0N1K ©   (2004-10-08 21:00:00) 

Как бы объяснить то, что я хочу сделать?... Надо сделать интерпритатор нес-ких стандартных команд(такой маленький язык).
Пишем (на русском) текст, а прога берёт из него команды и т.п.
и выполняет.
Например пишем:
объект перемещение на 2 вверх
объект перемещение на 3 влево
объект перемещение на 2 вправо
А в рез-те на клеточном поле показано куда переместился наш объект.
При этом могут быть и циклы, условия...
Если меня кто-то понял, то подскажите с какой стороны подступиться к решению.


Defunct   (2004-10-11 05:07:00) [41]

programania ©   (11.10.04 03:57)

посмотрите на мертвый проект
http://www.dca.narod.ru/simulation/mk51.htm
наглядная интерпретация


Defunct   (2004-10-11 04:15:00) [42]

> Работает как надо

Может быть для вас 2 пункта меню и есть "Работает как надо"?
Опишите хотя бы чего ждать от программы?
Скриншот выложите.

PS: не серьезен такой подход как у вас.
1. Пишете программу, допускаете ошибки на сайте поддержки, а это ведь лицо программы. (значит и в программе есть ошибки).
2. Нет нормального инсталлятора, приходится иметь дело с self-extract архивом "publisher - unknown" доверие к такой программе падает.
3. Интерфейс крайне непонятен (случайно нажал кнопку '=' меню съехало куда-то на бок). Без специальной подготовки с вашей программой разобраться нельзя.


Defunct   (2004-10-11 04:06:00) [43]

[41]

Сделал именно так.
Результат - [37]


programania   (2004-10-11 03:57:00) [44]

>Defunct
Сам переписал Enlis.zip, распаковал
переписал туда же KADR.EXE запустил
ответил Yes to all
Запустил Enlis.exe
Работает как надо
>Несерьезно это чтобы программу из RAR архива вытаскивать.
Не надо вытаскивать надо запустить KADR.EXE и ответить
yes to all


Defunct   (2004-10-11 03:44:00) [45]

Напишите нормальную инсталляшку.
(в комплект поставки Delphi входит Install Shield Express)
Несерьезно это чтобы программу из RAR архива вытаскивать.


Defunct   (2004-10-11 03:42:00) [46]

[38]
так и сделал. или демка выложена не рабочая. или я уже не знаю что.


programania   (2004-10-11 03:36:00) [47]

>Defunct
При распаковке Kadr.exe
нужно переписать т.е выбрать Yes to all


Defunct   (2004-10-11 03:22:00) [48]

programania ©   (11.10.04 03:07) [36]

Если это была шутка, то она не совсем удалась.
После распаковки KADR.EXE в один каталог с ENLIS, на экране все то же самое, что я привел в [35], разница лишь в том, что теперь меню (2 пункта "Помощь F1" и "Выход") вертикальное и при наведении на него мышки фон становится синеватым.


programania   (2004-10-11 03:07:00) [49]

>Defunct
Спасибо за тестирование моей программы Enlis
Это инструмент для создания
меню, форм ввода вывода обработки и т.п.
Чтобы это сделать нужно читать инструкции
или дописать к Enlis
programania.com/KADR.EXE 800kb как и указано на
странице под заголовком образец применения.

>программу не пришлось бы заново переписывать (а это и есть >отладка алгоритма).
Перепишите KADR.EXE и распакуйте это self Rar
Запустите ту же самую Enlis.exe
И тогда увидите что можно делать не переписывая программы


Defunct   (2004-10-11 02:35:00) [50]

programania ©   (11.10.04 01:38) [32]
> Кстати я наверно состряпал что-то похожее: programania.com/enlis.htm  800kb

Сходил по вышей ссылке, честно сказать мои подозрения оправдались:

С приведенной странички:

ENLIS
Engine of Lists
Что это за программа?
Это программа для работы с данными в виде таблиц. Она может работать с данными таких форматов:
- массив структур языка Паскаль на диске,
- DBF, DB, при наличии BDE или добавке из


особый интерес представляет ссылка:

RFK.htm - Описание клавишей программы"Редактор" для пользователей.

Ну да ладно, скачал. Распаковал. Проверил на вирусы, вроде бы чисто. Запустил.

При первом запуске появилась табличка:

M: не найден, содаю D:\.....\...\

Честно сказать не понял, что она там создала. Нажал ОК.

На экране вылезла красочная картинка на весь экран включаяя панель задачь, в виде лучей из центра экрана. Поразило обилие пунктов меню, аж 2 - "Помощь F1" и "Выход". Других инструментов не нашел, нажал выход.. вышло...

В том же каталоге нашел файл с именем RT.EXE и иконкой которую кажись D4 ставит по-умолчанию. Запустил...
В центре экрана появилась свернутая форма, которая через пару секунд развернулась на весь экран. Опять же поразило обилие инструментов - ни строки меню, ни панели инструментов... Форма представляет собой развернутый на весь экран TMemo и заголовок с гордой надписью "Редактор текста". Обрадовал тот факт, что в заголовке присутствует кнопка "закрыть". Закрыл...

В общем остались самые "радужные" впечатления о таком программном продукте.


Defunct   (2004-10-11 02:10:00) [51]

>> Похоже, Вы не видите разницы между отладкой программы и
>> отладкой ее алгоритма.

> Эт точно: в таких словесных дебрях я не силен
> Вот программы это другое дело

Для простоты понимания "дебрей" предлагаю вам доработать интерпретатор [18], чтобы он понимал:

Объект: <круг> <квадрат> <текстовое поле>
Команда: <создать> <переместить> <скрыть> <показать> <удалить> <изменить радиус> <изменить ширину> <изменить текст>

если бы ваш алгоритм учитывал внесение как новых объектов, так и новых действий над ними, тогда программу не пришлось бы заново переписывать (а это и есть отладка алгоритма).


Defunct   (2004-10-11 01:51:00) [52]

programania ©   (11.10.04 01:38) [32]
> если SON1K будет изучать БНФ и пр. точно ничего не сделает
> А поковыряв мою программу есть шанс.

Странно, но спасибо он сказал почему-то Юрию Зотову, а не вам.

>S0N1K   (08.10.04 21:40) [4]
>> Юрий Зотов
> Огромное спасибо!!!
> Нарыл кучу материала, теперь буду разгребать:)

Да и, справедливости ради, пример [13] более показателен чем [18].


programania   (2004-10-11 01:38:00) [53]

>Юрий Зотов
Сожалею что ничего не знаю о вашей программе наверно 1с ее совсем задавила.
Кстати я наверно состряпал что-то похожее: programania.com/enlis.htm  800kb
правда без всяких теорий.
Интересно на вашу программу взглянуть, но судя по всему она не для модема.
>И этот кусок поддержки практически не требует
Как оказалось требует и поддерживается тогда конечно, не спихнули еще, извините.
>Можете назвать количество Ваших юзеров?
Не могу, многие работают без поддержки, но я никому не отказываю и без договора.

>Похоже, Вы не видите разницы между отладкой программы и отладкой ее алгоритма.
Эт точно: в таких словесных дебрях я не силен
Вот программы это другое дело

>А что, уже писали, раз так заявляете?
Написал:
1. Интерпретатор выражений арифметических, логических и c данными файлов.
2. Интерпретатор описания меню: пункты, команды, оформление и т.д.
3. Интерпретатор описания форм ввода: поля, кнопки, переходы и т.д.
4. Интерпретатор описания форм вывода итоги, листы, заголовки и т.д.
5. Интерпретатор Bat файлов: if call exist copy del shift goto и т.д.
6. Интерпретатор воспроизведения музыки, картинок c переменными, условиями и т.д.
все это без теорий размером примерно по 800kb можно взять на programania.com.

>только анализируя слова, переносила бы их по СТРОГИМ правилам русского языка
А вот что касается естественных языков теорию вы будете писать всю жизнь
и все равно будут исключения поэтому по СТРОГИМ правилам русского языка
я и пытаться не буду ведь язык живой он развивается не по правилам а как удобней.
И не надейтесь сделать интерпретатор естественного языка,
который будет всегда правильно работать: весь язык ни один человек не понимает,
но на ограниченном подмножестве это возможно.
Например, тот же интерпретатор за час: ведь его можно
считать интерпретатором ограниченного русского языка.
Кстати сложная программа обычно не во всех ситуациях правильно работает,
например delphi, и тем не менее может приносить большую пользу, так
что надо к этому стремиться насколько хватает ума и времени, смириться
с их нехваткой, и не мучать людей каверзными примерами для калькулятора.

>Или Вы полагаете, что их писали по Вашей методе - "на коленке"?
А ведь не пишут как писали гады: только придумали правила и сразу уже готовый
компилятор. Может стыдно писать потому что и правда "на коленке".

>Придет, это точно. Но еще лучше, если он придет к ним, не угробив сначала кучу времени на бессмысленный труд.
я пишу в этот форум не только для вас а для всех
почитайте что людям надо: решение конкретных проблем с программой
никто о теориях и не упоминает.
вспомните >Надо сделать интерпритатор нес-ких стандартных команд(такой маленький язык).
если SON1K будет изучать БНФ и пр. точно ничего не сделает
А поковыряв мою программу есть шанс.

>VMcL
>Особенное внимание, в частности, обратить на пост №681.
Калькулятор я написал еще в DOS и даже несколько раз переделал.
Возможно не все замысловатые выражения он вычисляет, но
используются даже до сих пор.

>KSergey
>Уймись, дите неразумное. На кого батон крошишь?
Пожалуста пишите по теме: про интерпретатор.


Юрий Зотов   (2004-10-10 23:35:00) [54]

> Defunct ©   (10.10.04 21:00) [30]

Вы правы. Второе слово тоже ни на что не влияет. И поэтому его тоже можно просто выбросить.

Позор на мои седины...
:о)


Defunct   (2004-10-10 21:00:00) [55]

>Юрий Зотов ©   (10.10.04 20:27) [29]

> только у него первое слово можно просто выбросить (оно ни на что не влияет).

второе слово помоему тоже..

PS: знаете, удивительно, ждал от Вас чего угодно, но только не этого:

> можно сделать и без всякой теории

Тем более, что вроде бы и не спорил о надобности теории. просто обратил внимание на время.


Юрий Зотов   (2004-10-10 20:27:00) [56]

> KSergey ©   (10.10.04 16:05) [20]
Естественно. Для того и выкладывал.

> ЮрийК ©   (10.10.04 17:32) [22]
В данном случае - с помощью головы. Задача слишком простая.

> Defunct ©   (10.10.04 19:18) [28]
Конечно, такие простейшие задачи (в Вашей первое слово предложения сразу является ключевым, а все дальнейшее определяется этим ключевым словом) можно сделать и без всякой теории (причем буквально в полсотни-сотню строк - что нам и продемонстирировал уважаеиый оппонент, только у него первое слово можно просто выбросить (оно ни на что не влияет), а ключевым является второе слово). Но стоит ввести во входной язык что-нибудь не столь однозначное - и все. Приплыли. И полезли в БНФ. Чтобы не тратить полжизни на переделки (которые почему-то называют отладкой).


Defunct   (2004-10-10 19:18:00) [57]

> Не могли бы Вы подтвердить свои слова делом? То есть взять - и написать за час работающий интерпретатор команд, который хотя бы не будет спотыкаться на каждом шагу. И выложить его здесь.

Однажды была задача сделать для устройства работающего без вмешательства человека простенький интерпретатор команд, для того чтобы можно было обновлять программное обеспечение удаленно (патч скрипт). Я вначале думал, что потребуется много времени на реализацию такового, но оказалось ушло порядка часа, а может и того меньше.

Написан на TP7, обрабатывает команды:
<команда> [<файл> <каталог>]
Может исполнять команды:
locate файл каталог  (переместить файл в указанный каталог)
run файл каталог     (запустить файл в указанном рабочем каталоге)
delete файл          (удалить файл)
reboot               (перезагрузить устройство)

две доп. команды create и register так и не были востребованы.

Unit Scripts;

Interface

Uses Folders, Streams, Sttdos, Dos;

Type

    SmallString = String[20];
    TSmallString = String[64];

    PScriptRec = ^TScriptRec;
    TScriptRec = Record
      Line    : String;     { TDirDOSName;}
      Command : SmallString;
      Data1   : TSmallString;
      Data2   : TSmallString;
      Done    : Boolean;
      N       : PScriptRec;
    End;

    TScriptPerformer = Object
    Private
      Root : PScriptRec;
      Tail : PScriptRec;
      FFolder : String;
      FStream : TMemoryStream;

      Procedure Report(Msg:String);
      Procedure ReportLn(Msg:String);
      Procedure PerformScript;

      Procedure DoRegister(P:PScriptRec);
      Procedure DoCreate(P:PScriptRec);
      Procedure DoLocate(P:PScriptRec);
      Procedure DoRun(P:PScriptRec);
      Procedure DoReboot;
      Procedure DoDelete(P:PScriptRec);

    Public
      N       : Integer;
      Enabled : Boolean;
      Error   : Integer;
      CanShowReport : Boolean; {For debug }

      Procedure SetFolder(Folder:String);
      Procedure Load(ScriptFile:String);
      Procedure Execute;

      Procedure Clear;
      Constructor Create;
      Destructor  Destroy;

    End;

Const RebootEnabled : Boolean = False;

Procedure Reboot;

Implementation

{******************************}
{****** Script Performer ******}
{******************************}
Constructor TScriptPerformer.Create;
Begin
 Enabled := False;
 Root    := Nil;
 Tail    := Nil;
 Error   := 0;
 CanShowReport := True;
 FFolder := '.';
 FStream.Create;
End;

Procedure TScriptPerformer.Report;
Begin
 If CanShowReport Then Write(Msg);
End;

Procedure TScriptPerformer.ReportLn;
Begin
 If CanShowReport Then WriteLn(Msg);
End;

Procedure TScriptPerformer.Clear;
Var P,P2:PScriptRec;
Begin
 P := Root;
 While P<>Nil Do
 Begin
   P2 := P;
   P := P^.N;
   Dispose(P2);
 End;
 Root := Nil;
End;

Procedure TScriptPerformer.PerformScript;
Var P        : PScriptRec;
   SubStr   : String;
   Current  : Integer;
   HCounter : Integer;
Begin
 Error := 0;

 If Enabled Then
 Begin
   P := Root;
   While P<>Nil Do
   Begin
     Current := 1;
     HCounter := 0;
     SubStr := '';
     While Current<=Length(P^.Line) Do
     Begin
       If P^.Line[Current]<>' ' Then SubStr := SubStr + P^.Line[Current] Else
       If SubStr<>'' Then
       Begin
         Case HCounter Of
          0: P^.Command := SubStr;
          1: P^.Data1   := SubStr;
          2: P^.Data2   := SubStr;
          Else Inc(Error);
         End;
         Inc(HCounter);
         SubStr := '';
       End;

       Inc(Current);
     End;

     If (SubStr<>'') And (HCounter<3) Then
     Case HCounter Of
       0: P^.Command := SubStr;
       1: P^.Data1   := SubStr;
       2: P^.Data2   := SubStr;
     End;

     P := P^.N;
   End;
 End
End;

Procedure TScriptPerformer.SetFolder;
Begin
 FFolder := Folder;
End;

Procedure TScriptPerformer.Load;
Var F:Text;
   P,PL:PScriptRec;
Begin
{$I-}
 If FileExists(FFolder + ScriptFile) Then
 Begin
   Assign(F, FFolder + ScriptFile);
   Reset(F);

   PL := Nil;
   N  := 0;

   Report('reading script.');

   While Not Eof(F) Do
   Begin
     New(P);
     ReadLn(F,P^.Line);
     If PL<>Nil Then PL^.N := P
                Else Root := P;
     PL := P;
     Inc(N);
     Report('.');
   End;

   ReportLn('  '+Int2String(N)+' lines done');

   Close(F);
   If IOResult = 0 Then Enabled := True
                   Else Enabled := False;
 End;
{$I+}
End;

Procedure TScriptPerformer.DoRegister;
Begin
 ReportLn('Registering key '+P^.Data1+'  value: '+P^.Data2+' .....done');
End;

Procedure TScriptPerformer.DoCreate;
Begin
End;

Procedure TScriptPerformer.DoLocate;
Var FC:TFolderControl;
Begin
 FC.Init;
 FC.Load(P^.Data2);

 If Not FC.Exists Then
 Begin
   Report('folder not exists, creating '+FC.Name);
   FC.CreateFolder;
   If FC.Error>0 Then ReportLn('failed')
                 Else ReportLn('done');
 End;

 If FileExists(FFolder + P^.Data1) Then
 Begin
   Report('Relocating file '+P^.Data1+'   ');
   FStream.LoadFromFile(FFolder + P^.Data1);
   FStream.SaveToFile(FC.ExpandFilePath(P^.Data1));
   ReportLn('done');
 End;

 FC.Done;
End;

Procedure TScriptPerformer.DoRun;
Begin
Report('Executing '+P^.Data1+'   ');

If Not FileExists(P^.Data1) Then
Begin
  ReportLn('failed');
  Exit;
End;

ReportLn('available memory: '+ Int2String(MaxAvail div 1024)+'Kb');

Exec(P^.Data1,P^.Data2);

End;

Procedure TScriptPerformer.DoDelete;
Var F:File;
Begin
 Report('Deleting '+P^.Data1+'   ');

 If Not FileExists(P^.Data1) Then
 Begin
   ReportLn('failed');
   Exit;
 End;

 ReportLn('done');
 Assign(F, P^.Data1);
 Erase(F);
End;

Procedure TScriptPerformer.DoReboot;
Begin
 RebootEnabled := True;
End;

Procedure TScriptPerformer.Execute;
Var P: PScriptRec;
Begin
 PerformScript;
 If Error=0 Then
 Begin
   P := Root;

   While P<>Nil Do
   Begin
     If P^.Command = 'register' Then DoRegister(P);
     If P^.Command = 'create'   Then DoCreate(P);
     If P^.Command = 'locate'   Then DoLocate(P);
     If P^.Command = 'run'      Then DoRun(P);
     If P^.Command = 'reboot'   Then DoReboot;
     If P^.Command = 'delete'   Then DoDelete(P);

     P := P^.N;
   End

 End Else ReportLn('Error, could not perform the script due to errors');
End;

Destructor TScriptPerformer.Destroy;
Begin
 Clear;
 FStream.Destroy;
End;
{******************************}

Procedure Reboot;Assembler;
Asm
 Db 0EAh, 0,0, 0FFh, 0FFh
End;

End.


VMcL   (2004-10-10 18:23:00) [58]

>> ЮрийК ©  (10.10.04 17:47) [26]

<offtopic>

Просто её отредактируй ("Редактировать анкету"):
http://www.delphimaster.ru/anketa/index.html#a3

</offtopic>


ЮрийК   (2004-10-10 17:47:00) [59]

VMcL:
Спасибо за совет по JCF, будем смотреть.

"P.S. Анкету обнови."
Что требует обновления и куда кликать для обновления анкеты?


VMcL   (2004-10-10 17:38:00) [60]

>> Palladin ©  (10.10.04 17:36) [23]

:))


Страницы:   1 2 3 4 5

Наверх

Титульная страница Поиск, карта сайта Написать письмо