Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.11.07;
Скачать: [xml.tar.bz2];

Вниз

Интерпритатор языка или что-то в этом роде.   Найти похожие ветки 

 
S0N1K   (2004-10-08 21:00) [0]

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


 
Юрий Зотов ©   (2004-10-08 21:26) [1]

> с какой стороны подступиться к решению

С форм Бэкуса-Наура (БНФ) и описания ими входного языка.


 
S0N1K   (2004-10-08 21:33) [2]

С форм Бэкуса-Наура (БНФ) и описания ими входного языка.
А чуть подробне можно?


 
Юрий Зотов ©   (2004-10-08 21:37) [3]

> S0N1K   (08.10.04 21:33) [2]

Подробнее - это получится глава книги, страниц эдак на 100. Но есть Яндекс и Гугль.
:о)


 
S0N1K   (2004-10-08 21:40) [4]

> Юрий Зотов

Огромное спасибо!!!
Нарыл кучу материала, теперь буду разгребать:)


 
programania ©   (2004-10-09 01:54) [5]

>Нарыл кучу материала, теперь буду разгребать:)
Разгребать можно всю жизнь
Лучше пишите сразу первое что придет в голову
все равно всего сразу не предусмотрите
например:

s:="объект перемещение на 2 вверх";
if (pos("перемещение",s)>0)and(pos("вверх",s)>0) then
showmessage("надо вверх на "+copy(s,pos(" на ",s)+4,2));

и т.д.
похожие конструкции оформляйте в универсальные процедуры
для циклов, условий и переходов введите номер выполняемой строки
не бойтесь все переделать
и не заметите как получите что-то типа бейсика
похоже БГ так его и написал.


 
Rouse_ ©   (2004-10-09 02:11) [6]

> [4] S0N1K   (08.10.04 21:40)
Юрий стесняется по поводу (с какой стороны подступиться к решению), в свое время за рюмкой пива он объяснил мне все довольно популярно за минут 20, чему я кстати еще раз не могу не выразить ему "Вельми Респект"... :)


 
Rouse_ ©   (2004-10-09 02:13) [7]

Зы: Так что советую спросить у него хорошо, объяснять он умеет дай боже, преподаватель как никак ;)


 
GanibalLector ©   (2004-10-09 02:17) [8]

за рюмкой пива
во дела!!!Люди начали пЫво пить из рюмок.Интелегенты что-ли???


 
Германн ©   (2004-10-09 02:48) [9]

2 GanibalLector ©   (09.10.04 02:17) [8]
за рюмкой пива

Приезжай в Москву на встречу. Сразу все поймешь! И про пиво, и про рюмки, и про ЮЗ!


 
Юрий Зотов ©   (2004-10-09 09:12) [10]

> programania ©   (09.10.04 01:54) [5]

> Разгребать можно всю жизнь
Недели достаточно.

> Лучше пишите сразу первое что придет в голову
Это тоже способ, конечно. Но вот тогда как раз и есть хороший шанс получить "писать можно всю жизнь".

> все равно всего сразу не предусмотрите
Если писать без теории, то да. А если по теории, то нет.

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

> и не заметите как получите что-то типа бейсика
> похоже БГ так его и написал.
Эт вряд ли.
(с) тов. Сухов.

> GanibalLector ©   (09.10.04 02:17) [8]
Мало того, что пиво из рюмки, так ведь еще и пили эту рюмку аж целых 20 минут...
:о)

> S0N1K
Сейчас попробую накатать простенький пример, выложу здесь.


 
GanibalLector ©   (2004-10-09 11:35) [11]

2 Юрий Зотов ©
Вы даже меня заинтеровали с   Бэкуса-Наура.
Сейчас попробую накатать простенький пример, выложу здесь.
Жду с нетерпением.


 
programania ©   (2004-10-09 14:51) [12]

>Юрий Зотов ©   (09.10.04 09:12) [10]
Недели достаточно.
Неделя без программирования невыносима.

> Лучше пишите сразу первое что придет в голову
>Это тоже способ, конечно. Но вот тогда как раз и есть хороший шанс получить "писать можно всю жизнь".
Это способ получить результат максимально быстро: уже через час.
А хорошую программу действительно можно писать всю жизнь и тогда она живет как человек.

> все равно всего сразу не предусмотрите
>Если писать без теории, то да. А если по теории, то нет.
>Потому что при таком подходе все переделывать действительно придется, и не один раз.
Похоже никогда не писали сложных программ и тем более не
сопровождали их годами, переделка неизбежна, лучше сразу об этом
позаботиться и заложить эту возможность в программу,
а не пытаться все предусмотреть,
все равно из того что предусмотрите большая часть окажется ненужной.
А теория годится только для одурманивания заказчика и студентов.
А здесь человеку нужен результат.
Кстати, все это очевидные вещи и не раз публиковались

> и не заметите как получите что-то типа бейсика
> похоже БГ так его и написал.
>Эт вряд ли.
Эт вряд ли.
Теорию у него никто бы не купил.
А бейсик был нужен любой и немедленно.


 
Юрий Зотов ©   (2004-10-09 23:50) [13]

> S0N1K

Привожу обещанный пример. Интерпретатор умеет выполнять следующие команды:

1. создать имя_класса координата_X координата_Y
где имя_класса - это кнопка, метка, панель или редактор (пишется по-русски).
Созданному объекту назначается имя, состоящее из имени класса и порядкового номера. Объект появляется на форме в точке с заданными координатами. Его имя рисуется на нем самом.

2. переместить имя_объекта смещение_X смещение_Y
где имя_объекта - это имя любого из ранее созданных объектов.
Смещения задают точку перемещения относительно текущей и могут быть отрицательными.

3. удалить имя_объекта
где имя_объекта - это имя любого из ранее созданных объектов.

Код написан так, что набор команд расширяется без переделки алгоритма (вот для чего, в частности, нужна теория - но не только для этого). Все синтаксические и логические ошибки диагностируются. Код тестировался, но мало, поэтому ошибки не исключены.


unit Unit1;

interface

uses
 Windows, SysUtils, Classes, Controls, StdCtrls, ExtCtrls, Forms;

type
 TCmdInterpreterForm = class(TForm)
   CmdEdit: TEdit;
   ExecButton: TButton;
   procedure FormCreate(Sender: TObject);
   procedure ExecButtonClick(Sender: TObject);
   procedure FormDestroy(Sender: TObject);
 end;

var
 CmdInterpreterForm: TCmdInterpreterForm;

implementation

{$R *.dfm}

{**************************************************************}
{                                                              }
{ <statement> ::= <command> <target> <param_list>              }
{                                                              }
{ <command> ::= <identifier>                                   }
{ <target> ::= <class_name> | <object_name>                    }
{ <param_list> ::= <parameter> | <parameter> <param_list>      }
{                                                              }
{ <identifier> ::= <letter> | <letter> <identifier>            }
{ <class_name> ::= <identifier>                                }
{ <object_name> ::= <class_name> <unsigned>                    }
{ <parameter> := <empty> | <sign> <unsigned>                   }
{                                                              }
{ <letter> ::= A...y                                           }
{ <unsigned> := <digit> | <digit> <unsigned>                   }
{ <empty> ::=                                                  }
{ <sign> ::= <empty> | + | -                                   }
{                                                              }
{ <digit> ::= 0...9                                            }
{                                                              }
{**************************************************************}
{                                                              }
{ 1. <object_name> проверяется по таблице объектов ObjectTable }
{ 2. <class_name> проверяется по таблице классов ClassTable    }
{ 3. <command> проверяется по таблице команд CommandTable      }
{ 4. Алфавит нечувствителен к регистру                         }
{                                                              }
{**************************************************************}

type
 TToken = (tkNone, tkClassName, tkObjectName, tkMove, tkCreate, tkDelete, tkParam, tkEoF);

const
 Letters = ["А".."я"];
 Digits = ["0".."9"];
 MinusChar = "-";
 Signs = ["+", MinusChar];
 SpaceChar = " ";
 EofChar = #0;
 Alphabet = Letters + Digits + Signs + [SpaceChar];

 ClassCount = 4;
 ClassTable: packed array[0..(ClassCount - 1)] of string =
   ("КНОПКА", "МЕТКА", "ПАНЕЛЬ", "РЕДАКТОР"); // upper case, sorted
 DelphiClassTable: packed array[0..(ClassCount - 1)] of TControlClass =
   (TButton, TLabel, TPanel, TEdit);

 CommandCount = 3;
 CommandTable: packed array[0..(CommandCount - 1)] of string =
   ("ПЕРЕМЕСТИТЬ", "СОЗДАТЬ", "УДАЛИТЬ"); // upper case, sorted
 CommandTokenTable: packed array[0..(CommandCount - 1)] of TToken =
   (tkMove, tkCreate, tkDelete);
 ValidCommandTable: packed array[tkClassName..tkObjectName, tkMove..tkDelete] of boolean =
   ((False, True, False), (True, False, True));

type
 EStatementSyntaxError = class(Exception);
 TIntegerArray = packed array of Int64;
 TStringArray = packed array of string;
 TFriendControl = class(TControl);

 PObjectRecord = ^TObjectRecord;
 TObjectRecord = packed record
   ClassID: integer;   // индекс класса в ClassTable
   ObjectID: integer;  // числовой идентификатор объекта
   ObjectRef: TControl // ссылка на сам объект
 end;
 TObjectArray = packed array of PObjectRecord;

 TObjectTable = class(TObject)
 private
   FObjectArray: TObjectArray;
   function GetCount: integer;
   function GetItem(Index: integer): PObjectRecord;
 protected
   procedure CheckIndex(Index: integer);
   function GetObjectName(const AClassName: string; AObjectID: integer): string;
   function FindObject(const AClassName: string; AObjectID: integer): integer;
   procedure DeleteObject(Index: integer); overload;
   procedure Clear;
   property Count: integer read GetCount;
   property Items[Index: integer]: PObjectRecord read GetItem;
 public
   destructor Destroy; override;
   procedure CreateObject(const AClassName: string; ALeft, ATop: integer);
   function GetObject(const AClassName: string; AObjectID: integer): TControl;
   procedure DeleteObject(const AClassName: string; AObjectID: integer); overload;
 end;

var
 ObjectTable: TObjectTable;

procedure InvalidParamCount(ValidCount: integer);
begin
 raise EStatementSyntaxError.CreateFmt("Количество параметров должно быть равно %d", [ValidCount])
end;

procedure MoveObjectProc(const StrParam: string; const IntParams: TIntegerArray);
begin
 if Length(IntParams) <> 3 then
   InvalidParamCount(2);
 with ObjectTable.GetObject(StrParam, IntParams[0]) do
   SetBounds(Left + IntParams[1], Top + IntParams[2], Width, Height)
end;

procedure CreateObjectProc(const StrParam: string; const IntParams: TIntegerArray);
begin
 if Length(IntParams) <> 2 then
   InvalidParamCount(2);
 ObjectTable.CreateObject(StrParam, IntParams[0], IntParams[1])
end;

procedure DeleteObjectProc(const StrParam: string; const IntParams: TIntegerArray);
begin
 if Length(IntParams) <> 1 then
   InvalidParamCount(0);
 ObjectTable.DeleteObject(StrParam, IntParams[0])
end;


См. продолжение 1.


 
Юрий Зотов ©   (2004-10-09 23:52) [14]

Продолжение 1.


type
 TCommandProc = procedure(const StrParam: string; const IntParams: TIntegerArray);
var
 CommandProcTable: array[tkMove..tkDelete] of pointer =
   (@MoveObjectProc, @CreateObjectProc, @DeleteObjectProc);

function FindString(const S: string; Table: TStringArray; Count: integer): integer;
var
 L, H, i, C: integer;
begin
 Result := -1;
 L := 0;
 H := Count - 1;
 while L <= H do
 begin
   i := (L + H) div 2;
   C := AnsiCompareText(Table[i], S);
   if C < 0 then
     L := i + 1
   else
     if C = 0 then
     begin
       Result := i;
       Exit
     end
     else
       H := i - 1
 end
end;

function FindClassByName(const AClassName: string): integer;
begin
 Result := FindString(AClassName, @ClassTable, ClassCount);
 if Result < 0 then
   raise EStatementSyntaxError.CreateFmt("Неизвестный класс "%s"", [AClassName])
end;

function FindCommand(const ACommand: string): integer;
begin
 Result := FindString(ACommand, @CommandTable, CommandCount);
 if Result < 0 then
   raise EStatementSyntaxError.CreateFmt("Неизвестная команда "%s"", [ACommand])
end;

procedure ExecuteStatement(Edit: Tedit);
const
 sInvalidChar = "Недопустимый символ "%s"";
var
 Statement: string;
 CharPos: integer;
 Ch: char;
 Token: TToken;
 StrValue, TargetValue: string;
 CmdToken, TargetToken: TToken;
 IntValues: TIntegerArray;

 procedure NextChar(SkipSpaces: boolean = True);
 begin
   Inc(CharPos);
   if SkipSpaces then
     while (CharPos <= Length(Statement)) and (Statement[CharPos] = SpaceChar) do
       Inc(CharPos);
   if CharPos <= Length(Statement) then
   begin
     Ch := Statement[CharPos];
     if not (Ch in Alphabet) then
       if Ch < SpaceChar then
         raise EStatementSyntaxError.CreateFmt(sInvalidChar, ["#" + IntToStr(Byte(Ch))])
       else
         raise EStatementSyntaxError.CreateFmt(sInvalidChar, [Ch])
   end
   else
     Ch := EofChar
 end;

 function GetIdent: string;
 begin
   Result := "";
   while Ch in Letters do
   begin
     Result := Result + Ch;
     NextChar(False)
   end
 end;

 function GetUnsigned: Int64;
 begin
   Result := 0;
   while Ch in Digits do
   begin
     Result := Result * 10 + Byte(Ch) - Byte("0");
     NextChar(False)
   end
 end;

 procedure AddIntValue(const Value: Int64);
 begin
   SetLength(IntValues, Length(IntValues) + 1);
   IntValues[High(IntValues)] := Value
 end;

 procedure NextToken;
 var
   Negative: boolean;
 begin
   NextChar;
   if Ch <> EofChar then
   begin
     if Ch in Letters then
     begin
       StrValue := GetIdent;
       if Ch in Digits then
       begin
         AddIntValue(GetUnsigned);
         TargetValue := StrValue;
         TargetToken := tkObjectName;
         Token := TargetToken
       end
       else
         if Token = tkNone then
         begin
           CmdToken := CommandTokenTable[FindCommand(StrValue)];
           Token := CmdToken
         end
         else
           begin
             FindClassByName(StrValue);
             TargetValue := StrValue;
             TargetToken := tkClassName;
             Token := TargetToken
           end
     end
     else
       if Ch in Signs + Digits then
       begin
         if Ch in Signs then
         begin
           Negative := Ch = MinusChar;
           NextChar
         end
         else
           Negative := False;
         if Ch in Digits then
           if Negative then
             AddIntValue(-GetUnsigned)
           else
             AddIntValue(GetUnsigned)
         else
           raise EStatementSyntaxError.CreateFmt(sInvalidChar, [Ch]);
         Token := tkParam
       end
   end
   else
     Token := tkEoF
 end;

 procedure CheckCommand;
 begin
   if not ValidCommandTable[TargetToken, CmdToken] then
     raise EStatementSyntaxError.Create("Недопустимое сочетание объекта и команды")
 end;

 procedure CallCommandProc;
 begin
   TCommandProc(CommandProcTable[CmdToken])(TargetValue, IntValues)
 end;

begin
 Statement := Edit.Text;
 CharPos := 0;
 Token := tkNone;
 IntValues := nil;
 try
   try
     NextToken;
     if not (Token in [tkMove..tkDelete]) then
       raise EStatementSyntaxError.Create("Пропущена команда");
     NextToken;
     if not (Token in [tkClassName, tkObjectName]) then
       raise EStatementSyntaxError.Create("Пропущено имя класса или объекта");
     CheckCommand;
     repeat
       NextToken
     until Token <> tkParam;
     if Token <> tkEoF then
       raise EStatementSyntaxError.Create("Нераспознанная синтаксическая конструкция");
     CallCommandProc
   except
     with Edit do
     begin
       if Visible and Enabled then
         SetFocus;
       SelStart := CharPos - 1;
       SelLength := 1
     end;
     raise
   end
 finally
   IntValues := nil
 end
end;


См. продолжение 2.


 
Юрий Зотов ©   (2004-10-09 23:55) [15]

Продолжение 2.


{ TObjectTable }

procedure TObjectTable.CheckIndex(Index: integer);
begin
 if (Index < 0) or (Index >= Count) then
   raise EListError.CreateFmt("Индекс элемента списка должен лежать в диапазоне 0..%d", [Count - 1])
end;

procedure TObjectTable.Clear;
var
 i: integer;
begin
 for i := Count - 1 downto 0 do
   DeleteObject(i)
end;

procedure TObjectTable.CreateObject(const AClassName: string; ALeft, ATop: integer);
var
 AClassID, NewObjectID, i: integer;
 S: string;
 DC: HDC;
 R: TRect;
begin
 AClassId := FindClassByName(AClassName);
 NewObjectID := 0;
 for i := 0 to Count - 1 do
   with Items[i]^ do
     if (ClassID = AClassID) and (ObjectID > NewObjectID) then
       NewObjectID := ObjectID;
 Inc(NewObjectID);
 SetLength(FObjectArray, Count + 1);
 FObjectArray[Count - 1] := nil;
 try
   New(FObjectArray[Count - 1]);
   with FObjectArray[Count - 1]^ do
   begin
     FillChar(ObjectRef, SizeOf(ObjectRef), 0);
     ClassID := AClassID;
     ObjectID := NewObjectID;
     ObjectRef := DelphiClassTable[ClassID].Create(nil);
     with TFriendControl(ObjectRef) do
     begin
       Parent := Application.MainForm;
       S := GetObjectName(AClassName, ObjectID);
       R := ClientRect;
       DC := GetDC(GetDesktopWindow);
       try
         R.Bottom := DrawText(DC, PChar(S), Length(S), R, DT_LEFT or DT_SINGLELINE or DT_CALCRECT)
       finally
         ReleaseDC(GetDesktopWindow, DC)
       end;
       SetBounds(ALeft, ATop, R.Right + 16, R.Bottom + 8);
       Text := S
     end
   end
 except
   DeleteObject(Count - 1);
   raise
 end
end;

procedure TObjectTable.DeleteObject(Index: integer);
begin
 CheckIndex(Index);
 if FObjectArray[Index] <> nil then
 begin
   with FObjectArray[Index]^ do
     if ObjectRef <> nil then
       ObjectRef.Free;
   Dispose(FObjectArray[Index])
 end;
 if Index < Count - 1 then
   Move(FObjectArray[Index + 1], FObjectArray[Index],
     (Count - Index - 1) * SizeOf(PObjectRecord));
 SetLength(FObjectArray, Count - 1)
end;

procedure TObjectTable.DeleteObject(const AClassName: string; AObjectID: integer);
begin
 DeleteObject(FindObject(AClassName, AObjectID))
end;

destructor TObjectTable.Destroy;
begin
 Clear;
 inherited
end;

function TObjectTable.FindObject(const AClassName: string; AObjectID: integer): integer;
var
 AClassID, i: integer;
begin
 AClassID := FindClassByName(AClassName);
 for i := 0 to Count - 1 do
   with Items[i]^ do
    if (AClassID = ClassID) and (AObjectID = ObjectID) then
    begin
      Result := i;
      Exit
    end;
 raise EStatementSyntaxError.CreateFmt("Неизвестный объект "%s"", [GetObjectName(AClassName, AObjectID)])
end;

function TObjectTable.GetCount: integer;
begin
 Result := Length(FObjectArray)
end;

function TObjectTable.GetItem(Index: integer): PObjectRecord;
begin
 CheckIndex(Index);
 Result := FObjectArray[Index]
end;

function TObjectTable.GetObject(const AClassName: string; AObjectID: integer): TControl;
begin
 Result := Items[FindObject(AClassName, AObjectID)]^.ObjectRef
end;

function TObjectTable.GetObjectName(const AClassName: string; AObjectID: integer): string;
begin
 Result := AClassName + IntToStr(AObjectID)
end;

{ TCmdInterpreterForm }

procedure TCmdInterpreterForm.FormCreate(Sender: TObject);
begin
 ObjectTable := TObjectTable.Create
end;

procedure TCmdInterpreterForm.ExecButtonClick(Sender: TObject);
begin
 ExecuteStatement(CmdEdit)
end;

procedure TCmdInterpreterForm.FormDestroy(Sender: TObject);
begin
 ObjectTable.Free
end;

end.


См. окончание.


 
Юрий Зотов ©   (2004-10-09 23:56) [16]

Окончание (файл DFM).


object CmdInterpreterForm: TCmdInterpreterForm
 Left = 333
 Top = 188
 Width = 719
 Height = 464
 Caption = "Интерпретатор команд"
 Color = clBtnFace
 Font.Charset = DEFAULT_CHARSET
 Font.Color = clWindowText
 Font.Height = -13
 Font.Name = "MS Sans Serif"
 Font.Style = []
 OldCreateOrder = False
 Position = poScreenCenter
 OnCreate = FormCreate
 OnDestroy = FormDestroy
 DesignSize = (
   711
   435)
 PixelsPerInch = 120
 TextHeight = 16
 object CmdEdit: TEdit
   Left = 8
   Top = 4
   Width = 587
   Height = 24
   Anchors = [akLeft, akTop, akRight]
   TabOrder = 0
 end
 object ExecButton: TButton
   Left = 605
   Top = 4
   Width = 100
   Height = 25
   Anchors = [akTop, akRight]
   Caption = "Выполнить"
   Default = True
   TabOrder = 1
   OnClick = ExecButtonClick
 end
end


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

> programania ©   (09.10.04 14:51) [12]

> Неделя без программирования невыносима.

Если под программированием Вы подразумеваете кодинг, а изучение программирования к программированию не относите - то да, неделя будет без программирования. А если нет - то нет.

> Это способ получить результат максимально быстро:
> уже через час.


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

А то какие-то уж очень голословные заявления получаются.

> Похоже никогда не писали сложных программ и тем более не
> сопровождали их годами


Гы. Три раза. Миллион строк - это большая программа? Живет 6 лет. Мой кусок в ней (тоже немаленький) живет около 5 лет. И этот кусок поддержки практически не требует - Вам это о чем-нибудь говорит?

> переделка неизбежна, лучше сразу об этом позаботиться и
> заложить эту возможность в программу, а не пытаться все
> предусмотреть,


Если Вы пишете (точнее, проектируете) так, что переделка неизбежна, то мне Вас жаль (кстати, это и есть результат упора в сторону кодинга, а не программирования). Не на переделку, а на расширение надо ориентироваться, без всяких переделок. И вот это как раз и есть закладывание в программу возможности "все предусмотреть". Именно поэтому тот самый мой кусок и не требует почти никакой поддержки - все возможности расширения в него были заложены заранее, так что теперь эти расширения вводятся быстро и просто. И так я делаю ВСЕГДА - что и Вам советую. Экономит массу времени и труда.

> А теория годится только для одурманивания заказчика и
> студентов.


Гы. Еще четыре раза. Напишите интерпретатор. Желательно не такой игрушечный, о котором тут говорится, а серьезный - например, с Паскаля. Вот тогда поговорим.

> А здесь человеку нужен результат.

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

> Кстати, все это очевидные вещи и не раз публиковались

Очевидные для кого - для Вас? Для меня и очень многих других - неочевидные. А что касается публикаций, то ОЧЕНЬ много раз публиковались как раз БНФ, теория языков, парсинга и интерпретации/компиляции.

> Теорию у него никто бы не купил.

А он ее и не создавал. Давным-давно существует готовая.

> А бейсик был нужен любой и немедленно.

Еще раз - не любой, а нормально работающий. ЛЮБОЙ - на фиг никому не нужен.

P.S.
Так я жду интерпретатор. Рабочий и написанный за час.


 
programania ©   (2004-10-10 03:40) [18]

>Юрий Зотов

>Если под программированием Вы подразумеваете кодинг, а изучение программирования к программированию не относите - то да, неделя будет без программирования. А если нет - то нет.
Под программированием я понимаю получение полезной программы.
Под изучением программирования без получения полезной программы
я понимаю лишь оправдание пребывания на работе

>Гы. Три раза. Миллион строк - это большая программа? Живет 6 лет.
>Мой кусок в ней (тоже немаленький) живет около 5 лет.
>И этот кусок поддержки практически не требует - Вам это о чем-нибудь говорит?
Мне это говорит о том что программой никто не пользуется даже автор
или он недоступен пользователю.

>так что теперь эти расширения вводятся быстро и просто.
похоже спихнули на кого-то свое творение.

Кстати, размер программы не связан с ее полезностью и
я не говорил о большой программе

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

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

>А что касается публикаций, то ОЧЕНЬ много раз публиковались как раз БНФ,
>теория языков, парсинга и интерпретации/компиляции.
При реальном программировании, а не изучении, не только человек делает программу
но и программа делает человека т.е. глядя на то что получается
автор видит что можно упростить, обьеденить, сделать универсальным и т.п.
и неизбежно придет к теория языков, парсинга и интерпретации, компиляции
если они действительно полезны, а может и к чему-то своему лучшему,
И такой опыт и знания не дадут никакие книги и теории.

>Еще раз - не любой, а нормально работающий. ЛЮБОЙ - на фиг никому не нужен.
Так это очевидно

>Так я жду интерпретатор. Рабочий и написанный за час.
Вот за 50 минут можете не верить, причем большая часть времени пошла не на интерпретатор
Сделаете быстрее, тогда критикуйте но скажите
какую программу проще расширить или переделать эту в 35 строк или вашу в 500
Кстати я так и не понял откуда ваш интерпретатор берет команды
А вот у меня из текстового файла test.txt
Запишите туда примерно следующее:

объект перемещение на 2 вверх;
объект перемещение на 4 влево
объект перемещение на 2 вниз
объект перемещение на 4 вправо


program Project1;
uses Graphics, forms, SysUtils, windows, Classes;
var
r,h,w,x,y,dx,dy,z:integer;b:graphics.tBitmap;t:textFile;s:string;ce:tCanvas;
Procedure ss(n:string; var dy:integer; m:integer);
begin //Сообщения о действиях
dy:=m*StrToInt(trim(copy(s,pos(" на ",s)+4,2)));
ce.textOut(100,100,"Перемещение "+n+" на "+intToStr(m*dy)+"       ")end;
begin
h:=screen.height; w:=screen.width;  x:=w div 2; y:=h div 2; r:=h div 10;
ce:=tCanvas.create; ce.Handle:=GetDC(0);
b:=Graphics.tBitMap.create;b.width:=w; b.height:=h;
b.canvas.copyRect(rect(0,0,w,h),ce,rect(0,0,w,h));
assignFile(t,"test.txt");
reset(t);
ce.font.size:=18;ce.font.color:=$FF; ce.font.style:=[fsBold];
ce.Pen.color:=$ff;   ce.Pen.width:=4;
ce.fillRect(rect(x,y,x+r,y+r));
while not eof(t) do begin
 readln(t,s);
 ce.Draw(0,0,b);
 dx:=0; dy:=0;
 if pos("вверх",s)>0  then ss("вверх",dy,-1)  else
 if pos("вниз",s)>0   then ss("вниз",dy,+1)   else
 if pos("влево",s)>0  then ss("влево",dx,+1)  else
 if pos("вправо",s)>0 then ss("вправо",dx,-1) else
 if trim(s)<>"" then ce.textOut(0,0,"Неверная команда "+s+"       ");
 inc(x,dx*r);
 inc(y,dy*r);
 ce.rectangle(x-r,y-r,x+r,y+r);
 z:=GetTickCount+2000; while GetTickCount<z do application.processmessages;
end;
closeFile(t);
ce.Draw(0,0,b);
end.


 
Юрий Зотов ©   (2004-10-10 15:41) [19]

> programania ©   (10.10.04 03:40) [18]

Похоже, ветка уйдет в "потрепаться". Ну да и ладно, свое дело она уже сделала, так что не страшно.

Ну что ж, приступим.

> Под программированием я понимаю получение полезной программы.

Сорри, демагогия. Просьба - пожалуйста, впредь постарайтесь избегать. Несерьезно.

> Под изучением программирования без получения полезной
> программы я понимаю лишь оправдание пребывания на работе


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

> Мне это говорит о том что программой никто не пользуется
> даже автор


Около 30 контор, десятки рабочих мест в каждой. Думаю, человек 1000 наберется. Ежедневно, в течение 6 лет. И это только по одному проекту, а он не один. Что касается автора (точнее, авторов), то вся наша контора нашей же программой и пользуется. Глупо было бы покупать чужой продукт, имея собственный.

1. Достаточно?
2. Можете назвать количество Ваших юзеров?

> или он недоступен пользователю.

Почти все из этих 30 контор заключили договор о поддержке. Есть официальная служба поддержки, ее адрес, прекрасно известен всем юзерам. Так что все доступно, без проблем.

1. Достаточно?
2. Можете привести объем Вашей поддержки?

>>так что теперь эти расширения вводятся быстро и просто.
> похоже спихнули на кого-то свое творение.


1. Если я его "спихнул", то кто же, по-Вашему, эти расширения вносит? Пушкин, что ли?

2. См. выше о поддержке. Как видите, ничего никуда не "спихнуто".

3. Лично я вношу те расширения, которые требуют досконального знания механизмов программы, а другие расширения вносят другие люди в команде (только это не называется "спихнул", потому что команда одна). Именно такая цель и ставилась с самого начала и именно под это все и было с самого начала заточено. Поскольку забивать гвозди - это необходимая, большая и важная работа, но забивать их следует молотком, а не микроскопом.

4. Выбирайте выражения, вежливый Вы мой. Все старожилы этого форума Вам с чистой совестью подтвердят, что если я тоже начну язвить в Ваш адрес, то мало Вам не покажется. Так что давайте взаимно обойдемся без этого.

> Кстати, размер программы не связан с ее полезностью и
> я не говорил о большой программе

Что касается полезности - см. кол-во юзеров выше (кстати, оно растет, сейчас в проработке находится еще несколько новых договоров). Значит, полезность все же есть. Что касается размера - Вы говорили о СЛОЖНОЙ программе (см. [12]: "Похоже никогда не писали сложных программ..."). Размер исходного кода программы отчасти коррелирует с ее сложностью, поэтому я его и указал. Но могу сказать и непосредственно о сложности - она примерно на уровне 1С (включая собственный язык и визуальные средства для создания юзерами своих форм - некий встроенный аналог Delphi). Кстати, многие из наших юзеров, опробовав наш продукт в Demo-версии, перешли с 1С на него и говорят, что 1С отдыхает. Я воздержусь от столь категоричных заявлений, но все же это независимое мнение пользователей - а оно кое-чего стоит.

1. Достаточно?
2. Можете назвать свой продукт аналогичной сложности?

>>Напишите интерпретатор Паскаля.
> ведь это же почти механическая работа.


А что, уже писали, раз так заявляете?

> Например, гораздо интереснее интерпретатор с русского.
> Это я готов обсуждать и делать бесконечно.


Желаю Вам удачи и долгих лет жизни. Поскольку они понадобятся.

Если эта тема Вам интересна, могу предложить маленькую подзадачку - напишите процедуру, которая, не используя никаких словарей, а только анализируя слова, переносила бы их по СТРОГИМ правилам русского языка (то есть - по слогам (а не просто по гласным), одну букву от корня и других частей слова не отрывать и т.д.). И добейтесь от нее правильной работы... ну, скажем, на 90% (поскольку меньше вряд ли будет полезно - Вы же сами говорите, что программа должна быть полезной).

>>а не слепленная кое-как глючная поделка.
> А это даст только тщательная и кропотливая отладка
> это большой монотонный труд и никакая теория тут не
> поможет.


Похоже, Вы не видите разницы между отладкой программы и отладкой ее алгоритма. А ведь отладка программы - это ее доведение до точного соответствия задуманному алгоритму, а отладка алгоритма - это уже переделка программы (даже если в коде была изменена только одна запятая). Другой алгоритм - это уже другая программа.

Так вот - если с самого начала был задуман неверный алгоритм (а ведь для более-менее сложных задач никто не может дать гарантии, что он верен), то программу можно "тщательно и кропотливо" отладить до абсолютной безглючности (то есть, она будет абсолютно точно реализовывать задуманный алгоритм) - но эта абсолютно безглючная программа будет работать... неверно! Поскольку абсолютно точно реализует неверный алгоритм. И никакой "большой монотонный труд" по отладке тут уже не поможет, поскольку программа и так уже абсолютно отлажена и становиться еще отлаженнее ей уже некуда.

И придется менять алгоритм. То есть, программу надо будет уже не отлаживать, а переделывать (или вообще переписывать заново). А ведь снова нет никакой гарантии, что и с новым алгоритмом не повторится та же самая история, и что не начнется бесконечная сказка под названием "У попа была собака". В итоге может получиться так, что на решение задачи будет потрачен действительно огромный труд, а вот каковы будут его результаты - это еще вопрос.

А вот теория как раз и гарантирует правильность алгоритма. На все 100%. И остается только его правильно реализовать. Так что, как видите, теория не просто помогает, а дает практически единственный надежный способ решения задачи. Причем в реально оцениваемые сроки, без использования рекурсивного метода "написал - переписал" (как Вы понимаете, сроки решения задачи таким методом предсказать невозможно).

> При реальном программировании, а не изучении, не только
> человек делает программу но и программа делает человека т.е.
> глядя на то что получается автор видит что можно упростить,
> обьеденить, сделать универсальным и т.п.


А давайте не будем рассказывать друг другу букварь, ладно?

> и неизбежно придет к теория языков, парсинга и
> интерпретации, компиляции


Придет, это точно. Но еще лучше, если он придет к ним, не угробив сначала кучу времени на бессмысленный труд.

> если они действительно полезны,

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

> а может и к чему-то своему лучшему,

Вы считаете, что можно изобрести алгебру, не зная арифметики?

И такой опыт и знания не дадут никакие книги и теории.

Опыт набивания шишек? Точно, такого опыта книги и теории не дадут. Потому что они рассказывают как раз о прямо противоположном - как НЕ набивать шишки.

===============

P.S.
По интерпретатору - позже. Сначала надо посмотреть и потестировать.


 
KSergey ©   (2004-10-10 16:05) [20]

> programania ©  

Уймись, дите неразумное. На кого батон крошишь?

PS
Эх, зря я это написал.. Юрий безусловно не нуждается в поддержке...

PPS
Юрий, можно стырить Ваш приведенный здесь код?


 
ЮрийК ©   (2004-10-10 17:29) [21]

А вот мне нужен бы разборщик кода (или синтаксический анализатор) с Delphi (object pascal). Это примерно как в Delphi меню нажимаем "Syntax check", а в ответ получаем - есть ошибки или нет. Но мне это нужно не только для проверки правильности кода, но и для некоторой обработки/анализа самого разбираемого кода.
Не знает ли кто, где подобное можно найти, желательно чтобы не слишком навороченное типа компилятора, компилятора мне как раз и не нужно? Наверняка что-то подобное уже делалось. Но сложно найти просто поиском, столько всего ненужного выдаётся.


 
ЮрийК ©   (2004-10-10 17:32) [22]

Ю. Зотову:
С помощью какой программы генерился код из набора БНФ правил?


 
Palladin ©   (2004-10-10 17:36) [23]

еще один серолицый...


 
VMcL ©   (2004-10-10 17:37) [24]

>>programania ©  (10.10.04 03:40) [18]

http://delphimaster.net/view/15-1090676641/
Особенное внимание, в частности, обратить на пост №681.

>>ЮрийК ©  (10.10.04 17:29) [21]

Посмотри JCF (Jedi Code Format) - экперт для форматирования исходного кода Object Pascal, он с исходниками, AFAIR.

P.S. Анкету обнови.


 
VMcL ©   (2004-10-10 17:38) [25]

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

:))


 
ЮрийК ©   (2004-10-10 17:47) [26]

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

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


 
VMcL ©   (2004-10-10 18:23) [27]

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

<offtopic>

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

</offtopic>


 
Defunct ©   (2004-10-10 19:18) [28]

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

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

Написан на 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.


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

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

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

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


 
Defunct ©   (2004-10-10 21:00) [30]

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

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

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

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

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

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


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

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

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

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


 
programania ©   (2004-10-11 01:38) [32]

>Юрий Зотов
Сожалею что ничего не знаю о вашей программе наверно 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
>Уймись, дите неразумное. На кого батон крошишь?
Пожалуста пишите по теме: про интерпретатор.


 
Defunct ©   (2004-10-11 01:51) [33]

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

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

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

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


 
Defunct ©   (2004-10-11 02:10) [34]

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

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

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

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

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


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

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 и заголовок с гордой надписью "Редактор текста". Обрадовал тот факт, что в заголовке присутствует кнопка "закрыть". Закрыл...

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


 
programania ©   (2004-10-11 03:07) [36]

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

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


 
Defunct ©   (2004-10-11 03:22) [37]

programania ©   (11.10.04 03:07) [36]

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


 
programania ©   (2004-10-11 03:36) [38]

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


 
Defunct ©   (2004-10-11 03:42) [39]

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


 
Defunct ©   (2004-10-11 03:44) [40]

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


 
programania ©   (2004-10-11 03:57) [41]

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


 
Defunct ©   (2004-10-11 04:06) [42]

[41]

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


 
Defunct ©   (2004-10-11 04:15) [43]

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

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

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


 
Defunct ©   (2004-10-11 05:07) [44]

programania ©   (11.10.04 03:57)

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


 
VMcL ©   (2004-10-11 07:32) [45]

Новая версия Avtoshem"ы?


 
Defunct ©   (2004-10-11 17:05) [46]

> Новая версия Avtoshem"ы?

Очень похоже, в исходниках, возможно, они вообще как две капли воды, жаль на сайте не нашел исходников.


 
programania ©   (2004-10-11 17:52) [47]

>Defunct ©   (11.10.04 04:15) [43]
>(в комплект поставки Delphi входит Install Shield Express)
С ним размер моих программ будет вдвое больше
а установка сложнее, лучше я сам напишу как в ENJOL.ZIP
Применение RAR вместо обычного ZIP вызвано
большим числом файлов. Rar их сжимает в непрерывный архив
840kb а ZIP в 1370kb, а так как Rar меньше распространен то сделан Self архив.
Кстати, зря вы его ругаете:
выглядит он как настоящий инсталятор и в нем можно
еще сделать ярлык, показать лицензию и многое др.

>Опишите хотя бы чего ждать от программы?
Появления Kadr.jpg

>допускаете ошибки на сайте поддержки,
Пожалуста укажите ошибки на сайте: я исправлю

>случайно нажал кнопку "=" меню съехало куда-то на бок
"=" на самом деле означает "+" и вызывает увеличение
шрифта текста меню, а "-" уменьшение
однако я про них уже забыл и они работали неправильно
спасибо что напомнили теперь работают.
Как вы запускаете ENLIS.EXE? если ярлыком то нужно
указать "Рабочая папка" как у EXE, но проще из Commandera
Сейчас это исправлено и все равно как

>Интерфейс крайне непонятен
Напишите что может быть непонятно в 2 пунктах меню.
Кстати, может лучше на mail@programania.com

Спасибо за замечания:
вроде мелочи и исправляются быстро но я бы сам об этом не узнал,
так как использовал по другому
Если у вас есть программа, могу тоже покритиковать.


 
GanibalLector ©   (2004-10-11 19:25) [48]

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

А если она сложна???Что тогда???Существуют ли какие-нибудь программые(да хоть какие-нибудь) средства для создания(ну или для проверки) формул???

Дальше больше...Я тоже нарыл в Инете материал про БНФ,однако примеров,подобных вашему нет.Интересует в часности это:

{**************************************************************}
{                                                              }
{ <statement> ::= <command> <target> <param_list>              }
{                                                              }
{ <command> ::= <identifier>                                   }
{ <target> ::= <class_name> | <object_name>                    }
{ <param_list> ::= <parameter> | <parameter> <param_list>      }
{                                                              }
{ <identifier> ::= <letter> | <letter> <identifier>            }
{ <class_name> ::= <identifier>                                }
{ <object_name> ::= <class_name> <unsigned>                    }
{ <parameter> := <empty> | <sign> <unsigned>                   }
{                                                              }
{ <letter> ::= A...y                                           }
{ <unsigned> := <digit> | <digit> <unsigned>                   }
{ <empty> ::=                                                  }
{ <sign> ::= <empty> | + | -                                   }
{                                                              }
{ <digit> ::= 0...9                                            }
{                                                              }
{**************************************************************}
{                                                              }
{ 1. <object_name> проверяется по таблице объектов ObjectTable }
{ 2. <class_name> проверяется по таблице классов ClassTable    }
{ 3. <command> проверяется по таблице команд CommandTable      }
{ 4. Алфавит нечувствителен к регистру                         }
{                                                              }
{**************************************************************}

Мне тут все ясно,но хотелось бы посмотреть на реальные примеры.Интересно знать на скольких они страницах будут(т.е.большие ли они).Кстати,в том,что я нашел имеется операторы ветвления,цикла и т.д.Вот бы на них посмотреть!!!

З.Ы. И последнее,скажите,может есть какие книги по данной тематике???

З.З.Ы. И еще,а если предположим,после интерпритации и выполнения существует некий результат.И в зависимости от значения этого результата необходимо опять сформировать новое "предложение" для дальнейшей интерпритации.Как в этом случае быть???


 
OSokin ©   (2004-10-11 20:09) [49]

Блин, такой легкий вопрос обсуждается на самом серьезном уровне!
Я такое на турбо паскале делал. Работало.


 
Defunct ©   (2004-10-11 20:13) [50]

> programania
> С ним размер моих программ будет вдвое больше

Зато сервис выше, программу можно будет хоть нормально анинсталлить. Тем более никто вас не заставляет добавлять в инсталляшку MSI engine, делайте без него.  

> Применение RAR вместо обычного ZIP вызвано большим числом файлов.

Это называется на простом народном языке - "галимая отмазка", Rar есть у всех а вот sfx никому не нужен.


> Rar их сжимает в непрерывный архив
> 840kb а ZIP в 1370kb

Если программа заслуживает внимания, тогда пользователям не важно сколько занимает инсталляшка 800kb или 10Mb.

> Кстати, зря вы его ругаете:
> выглядит он как настоящий инсталятор и в нем можно
> еще сделать ярлык, показать лицензию и многое др.

Выглядит все это как обычный sfx, причем MS-Guard мне сразу напомнил об опасности троянов и прочей трояноваятельной продукции.

>> Опишите хотя бы чего ждать от программы?
> Появления Kadr.jpg
Знаете, такую картинку я бы мог посмотреть в ACDC или IE, зачем для этого писать какую-то еще дополнительную программу?


>> допускаете ошибки на сайте поддержки,
> Пожалуста укажите ошибки на сайте: я исправлю
Кое-что я уже привел в [35], но если вы считаете, что там все гладко тогда это ваше авторское право.

>> случайно нажал кнопку "=" меню съехало куда-то на бок
> "=" на самом деле означает "+" и вызывает увеличение
> шрифта текста меню, а "-" уменьшение
> однако я про них уже забыл и они работали неправильно
> спасибо что напомнили теперь работают.
Подозреваю, таких "уже забыл" в программе гораздо больше.

> Как вы запускаете ENLIS.EXE?
Двойным кликом в проводнике.

>> Интерфейс крайне непонятен
> Напишите что может быть непонятно в 2 пунктах меню.
> Кстати, может лучше на mail@programania.com
Именно эти 2 пункта.
Понимаете, я не понимаю как работать с программным продуктом, у которого присутствует только 2 доступных действия "Помощь F1" и "Выход". С первого взгляда, и с последующий тоже, такое впечатление, что ваша программа - розыгрышь.

> Спасибо за замечания:
> вроде мелочи и исправляются быстро,
> но я бы сам об этом не узнал,
На здоровье. Право же не стоит благодарностей, я только взглянул на вашу программу (только запустил и вышел), в деталях ничего не смотрел поскольку так и не понял назначения вашей программы.

> Если у вас есть программа, могу тоже покритиковать.
Критикуйте [44]. Буду премного благодарен, хотя наврятли найду время им заниматься.


 
Юрий Зотов ©   (2004-10-11 20:58) [51]

> GanibalLector ©   (11.10.04 19:25) [48]

> Существуют ли какие-нибудь программые(да хоть какие-нибудь)
> средства для создания(ну или для проверки) формул???

Для проверки БНФ - не знаю. Обычно для этого строится таблица начальных символов и проверка делается по ней, но есть ли программные средства, выполняющие такую работу - не знаю.

А для генерации компилятора по готовому набору БНФ средства есть - например, ищите Lex и Yacc. В Интернете ссылок на них полно.

> хотелось бы посмотреть на реальные примеры. Интересно знать на > скольких они страницах будут(т.е.большие ли они). Кстати,в
> том,что я нашел имеется операторы ветвления,цикла и т.д. Вот
> бы на них посмотреть!!!

Большие или небольшие - это, естественно, зависит от сложности самого входного языка. А реальный пример есть в справке Delphi в раздел Object Pascal Grammar (вкладка Contents, а там открываем Delphi Language Guide - Object Pascal Grammar - Formal Grammar).

> есть какие книги по данной тематике???

Конечно, и немало. Например, знаменитая "книга дракона" (авторы - - Ахо, Сети, Ульман). В интернете найдете наверняка.

> И еще,а если предположим,после интерпритации и выполнения
> существует некий результат.И в зависимости от значения этого
> результата необходимо опять сформировать новое "предложение"
> для дальнейшей интерпритации.Как в этом случае быть???

То есть, самомодифицирующийся язык? Видимо, нужно хранить набор БНФ где-то в TStringList (в файле и т.п.) и обрабатывать его "на лету" - тогда перед обработкой можно менять его как угодно. Примерно это и делают Lex & Yacc.


 
Юрий Зотов ©   (2004-10-12 12:50) [52]

> programania ©   (10.10.04 03:40) [18]

Ну вот мы и добрались до Вашей программы.

> Вот за 50 минут можете не верить

Почему не верю? Верю. Ваш код меня в этом вполне убеждает. 50 минут на ТАКУЮ программу - это даже слишком много.

> Сделаете быстрее, тогда критикуйте

Знаете, я изо всех сил стараюсь относиться к Вашим постингам серьезно (хотя это нелегко, поверьте). Поэтому сделал, как Вы и хотели - написал свою программу, чтобы иметь полное право критиковать. Делает она то же самое, что и Ваша (за исключением того, что не путает "право" и "лево", как Ваша). Вот эта детская игрушка (назвать ее иначе просто нельзя), набросанная где-то минут за 15-20:


unit MyUnit1;

interface

uses
 Windows, SysUtils, Classes, Controls, Forms, ExtCtrls;

type
 TForm1 = class(TForm)
   Panel1: TPanel;
   procedure FormDblClick(Sender: TObject);
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormDblClick(Sender: TObject);
const
 Cmds: array[0..3] of string = ("ВВЕРХ", "ВНИЗ", "ВЛЕВО", "ВПРАВО");
 Dirs: array[0..3] of TPoint = ((X: 0; Y: -1), (X: 0; Y: 1), (X: -1; Y: 0), (X: 1; Y: 0));
 Err = "Неверная команда "%s" в строке %d";
var
 S: string;
 i, j, P: integer;
 R: TRect;
 T: DWORD absolute P;
begin
 with TStringList.Create do
 try
   LoadFromFile("MyTest.txt");
   R := Panel1.BoundsRect;
   for i := 0 to Count - 1 do
   begin
     Caption := Strings[i];
     S := AnsiUpperCase(Caption);
     j := 0;
     while j <= 3 do
     begin
       P := AnsiPos(Cmds[j], S);
       if P > 0 then
       begin
         System.Delete(S, P, Length(Cmds[j]));
         if not TryStrToInt(Trim(S), P) then
           raise Exception.CreateFmt(Err, [Caption, i + 1]);
         OffsetRect(R, P * Dirs[j].X, P * Dirs[j].Y);
         Panel1.BoundsRect := R;
         T := GetTickCount + 3000;
         while GetTickCount < T do
           Application.ProcessMessages;
         Break
       end;
       Inc(j)
     end;
     if j > 3 then
       raise Exception.CreateFmt(Err, [Caption, i + 1])
   end
 finally
   Free
 end;
 Caption := "Выполнено"
end;

end.


А вот образец входного файла MyTest.txt к этой программе (слова "объект перемещение на" абсолютно ни на что не влияют и поэтому исключены, как ненужный мусор):

20 вверх
40 влево
20 вниз
40 вправо


Так что - вот теперь и рассмотрим Ваше произведение.

> но скажите какую программу проще расширить или переделать
> эту в 35 строк или вашу в 500


Переделать проще Вашу. Потому что моя переделок не потребует. А расширить проще мою. Потому что моя как раз под расширения и заточена, а вот расширить Вашу - это целая проблема. Она заточена как раз под переделку, а не под расширение.

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

И это все. Не меняется ни алгоритм, ни старый код. В Вашем же варианте добавление нового объекта или новой команды приведет к полной переделке всего алгоритма и, соответсвенно, всей программы.

Поэтому переделать проще Вашу, а расширить - мою. Несмотря на количество строк. Кстати, насчет 35 строк - это Вы погорячились. Программу на Паскале можно написать и в одну строку, но если отформатировать Ваш код так, как это принято делать в приличном обществе, то он занимает 72 строки (мой аналог - 67, так что даже и в этом Вы, извините, не преуспели).

Если хотите убедиться, чью программу легче расширять, давайте сделаем так, как сказал Defunct в [34] - дополним каждый свою программу так, чтобы она включала предложенный им набор объектов и команд:
объекты - <круг> <квадрат> <текстовое поле>
команды - <создать> <переместить> <скрыть> <показать> <удалить> <изменить радиус> <изменить ширину> <изменить текст>


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

А заодно все присутствующие убедятся и в том, кто же из нас имеет опыт разработки сложных программ с заранее предусмотренной поддержкой, а кто такого опыта все же не имеет. Хотя почему-то о нем говорит.

Извините, скажу прямо - люди, действительно имеющие опыт разработки, отладки и поддержки действительно сложных программ в Вашем стиле (cм. [18]) не пишут. Они пишут совсем по-другому. А в Вашем стиле пишут, образно говоря, детишки из школьного кружка программирования. И эти мои слова Вам с чистой совестью подтвердят все, кто имеет хотя бы понятие о том, что такое разработка и сопровождение действительно сложных проектов. Так что - еще раз извините, но рано Вам спорить и, тем более, насчет сложных проектов пальцы гнуть.

> Кстати я так и не понял откуда ваш интерпретатор
> берет команды


Файл DFM я привел? Привел. Что мы в нем видим? Форму, Edit и кнопку. Вы можете ввести текст в форму? Видимо, нет. А в кнопку? Видимо, тоже нет. Значит, остается только Edit. Поэтому, если Вы так и не поняли, куда вводятся команды, то это проблемы уж точно не мои.

P.S.
Вот что я имею сообщить по поводу Вашего кода. Ну как - принимаете предложение расширить программу до предложенного в [34] набора объектов и команд?

P.P.S.
На [32] отвечу позже.


 
Romkin ©   (2004-10-12 14:04) [53]

А может, попроще? :))
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnanchor/html/scriptinga.asp


 
П7   (2004-10-12 17:12) [54]

Ап
С удовольствием наблюдаю за этой веткой. Хотелось бы продолжения. Продолжнения кода, а не бесплодных попыток Юрия Зотова образумить бедного студента, который видно давно уже пожалел, что начал спор, но отступиться уже не может. Это видно по его постам, т.к. ни один человек не может быть таким твердолобым, отметая даже то, что знают все, если это выразил опонент. (:
Лучше кода побольше!!! (: А Кенов всегда и везде хватает... (:
Спасибо.


 
ЮрийК ©   (2004-10-12 18:28) [55]

"А реальный пример есть в справке Delphi в раздел Object Pascal Grammar (вкладка Contents, а там открываем Delphi Language Guide - Object Pascal Grammar - Formal Grammar)."

Там вроде бы не совсем БНФ. Или несколько видоизменённый БНФ, либо аналог БНФ.

"From the Delphi 6.02 Help File

Goal -> (Program | Package  | Library  | Unit)

Program -> [PROGRAM Ident ["(" IdentList ")"] ";"]
    ProgramBlock "."

Unit -> UNIT Ident ";"
   InterfaceSection
   ImplementationSection
   InitSection "."

Package -> PACKAGE Ident ";"
    [RequiresClause]
    [ContainsClause]
    END "."

Library -> LIBRARY Ident ";"
    ProgramBlock "."

ProgramBlock -> [UsesClause]
     Block
"
Какая же прога будет генерить код по такому виду записей грамматики?


 
ЮрийК ©   (2004-10-12 18:32) [56]

Сравните приведённые выше записи с этими, какие из них соответствуют правилам записи БНФ?

"Unit =
       "UNIT"
        ( Ident
       
       | BadNames  )
        [ Directive  ]
       ";"
       InterfaceSection
       ImplementationSection
       .
InterfaceSection =
       "INTERFACE"
        [ UsesClause  ]
        { InterfaceDecl  }
"


 
Юрий Зотов ©   (2004-10-12 22:00) [57]

> programania ©   (11.10.04 01:38) [32]

> Сожалею что ничего не знаю о вашей программе

Немудрено - мало кто из частных лиц использует ERP-системы. А кому надо - те знают. Во всяком случае, в различные обзоры ERP-рынка мы попадали не раз, включая и буржуйские.

> наверно 1с ее совсем задавила.

Читайте внимательнее, плз. Я писал об этом.

> Кстати я наверно состряпал что-то похожее:
> programania.com/enlis.htm  800kb


Ну что тут сказать? Раве что смайлик поставить? Особенно, учитывая постинги Defunct"а, скачавшего и опробовавшего Вашу программу.

> Интересно на вашу программу взглянуть, но судя по всему
> она не для модема.


Дистрибутив - около 70 Мб. Скриншот могу прислать. Думаю, даже по нему Вы уже довольно многое поймете.

>> И этот кусок поддержки практически не требует
> Как оказалось требует и поддерживается


Снова - читайте внимательнее, плз. Практически не требует. Это означает, что поддержка данного куска занимает мизерный труд и мизерное время - как раз потому, что он изначально под поддержку и проектировался. Я об этом уже писал.

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

Ну так назовите тех, кого поддерживаете. Сколько их? Если честно?

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


Вы уверены? По Вашему коду (см. [18]) этого не скажешь.

>> А что, уже писали, раз так заявляете?
> Написал: ...

Извините речь шла об интерпретаторе Паскаля. Вы сказали, что это почти механическая работа (см. [18]). Теперь выясняется, что его Вы все же не писали. Откуда же тогда такие утверждения? Даже с использованием теории это не такая уж и механическая работа, а уж без нее - так просто полный простор для творчества. Бесконечного.

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


Благодарю за разъяснения. :о)

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

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


Ну снова - что тут сказать? Разве что еще один смайлик поставить? :о)

> почитайте что людям надо: решение конкретных проблем с
> программой.


ОК, читаю: "надо сделать интерпритатор". Конкретной проблемы не обозначено.

> никто о теориях и не упоминает.

ОК, читаю дальше: "подскажите с какой стороны подступиться к решению". Кто сказал, что подступаться со стороны БНФ - это неверно? Это как раз самый верный путь и есть.

> если SON1K будет изучать БНФ и пр. точно ничего не сделает

Очень многие делали. А выше - так вообще готовый пример. Почему же SON1K не сможет?

> А поковыряв мою программу есть шанс.

Есть. Есть шанс, что человек поймет, как НЕ надо делать. И как НЕ надо писать код. Потому что называть интерпретатором ту игрушку, что Вы написали - это просто смешно. А смотреть на Ваш стиль кодирования - просто грустно.

> Калькулятор я написал еще в DOS
> и даже несколько раз переделал.


При Вашем подходе - немудрено. Как раз об этом я и твержу.

> Возможно не все замысловатые выражения
> он вычисляет...


Вот именно. А самое печальное то, что, задавая ему какое-либо выражение, никогда нельзя быть уверенным в том, что вот именно его он вычислит правильно. То есть - пользоваться такой программой реально нельзя (разве что для подсчета куличиков в песочнице, но только не для ответственных вещей).


 
Юрий Зотов ©   (2004-10-12 22:04) [58]

> ЮрийК

Конечно, это не совсем БНФ. Использована сокращенная форма - квадратные скобки означают необязательную конструкцию и т.д.


 
GanibalLector ©   (2004-10-13 02:32) [59]

2 Юрий Зотов ©
Спасибо за разьяснения.И еще,не подскажите где бы найти примеры самых  форм БНФ ???
Ну,т.е. то,что в  [13] и [48].Может подкините еще парочку,но посложней(и желательно с циклами или с условиями).


 
programania ©   (2004-10-13 11:29) [60]

>Юрий Зотов
К сожалению ваша программа при трансляции
не нашла TryStrToInt наверно от того что у меня D5
буду искать D8 как у вас.

Вот добавил как понял указанные команды и обьекты
Как и ожидал: около часа тупой долбежки по клавишам.
и еще более тупой отладки.
Такие глупые и бесполезные программы для меня мучительны.
Не буду больше их делать.
Однако этот разговор вдохновил меня на написание
простого и ограниченного интерпертатора Pascalя
для перепутывания строк в программе чтоб она нормально
работала но никто не мог понять как, даже по исходнику
но это не час а на неделю. Вот это для меня интересно,
это и буду теперь делать.

А вам предлагаю смотреть на вещи шире ведь любая теория
лишь частный случай более общей, например
интерпретатор находит в тексте знакомые слова а незнакомые
считает параметрами и использует их при выполнении,
но ведь зрение и слух делают то же самое, только
сравнение не точное. Может и в интерпритаторе допускать
отличия части слов и запоминать их чтоб при правильном
результате уже точно сравнивать такие команды и т.д.
Что вы будете делать для этого расширять или переделывать?
А если альтернативное выполнение одной из команд
в зависимости от применения многих запомненных отличий.
А построить дерево с альтернативами для входа и выхода
А связать альтернативы а потом еще все это перестраивать
при поступлении новых команд,
и ведь это не теория, это жизнь.

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

>но если отформатировать Ваш код так, как это принято делать
Нельзя так тупо подходить к оформлению кода.
Это процесс гораздо более творческий и похож на живопись.
оформление должно помогать понимать, дать возможность
обозреть программу. Для этого вспомогательные части нужно сжимать
если можно до 1 строки, а важные выделять, возможно даже в процедуры
A пример сжат для форума, обычно пишу более свободно.

>а кто такого опыта все же не имеет. Хотя почему-то о нем говорит.
Ваши программы я со своим модемом вряд ли когда увижу
а мои пожалуста 3*800kb programania.com/ENJOL.ZIP ENLIS.ZIP KADR.EXE
не хотите смотреть, тогда знайте что одна и таже ENLIS.exe
приводит в действие >10 АРМом с сотнями входных и выходных форм
и при этом никаких изменений в программе вообще не надо делать.
Напишите какие интерпритаторы вы сделали, причем лично
без "команды", как я написал в [32]
Или способны только на такое:

>насчет сложных проектов пальцы гнуть.
>детишки из школьного кружка программирования.
>образумить бедного студента,
>ни один человек не может быть таким твердолобым,
>Уймись, дите неразумное. На кого батон крошишь?

До такого я никогда не унижусь.
Для меня это лишь бессилие сказать по теме.

>Скриншот могу прислать
Если он сильно отличается от Delphi и <200k дайте ссылку.
>Так что в рамках тех самых 80-90% задача все же решаемая.
Согласен. О 100% я как раз и не говорил
Кстати, вот фирма Промт долго пыталась сделать перевод
по строгим правилам, а недавно прочел в газете что
она бросила это безнадежное дело и решила просто хранить
готовые фрагменты в базе переводов. Так может и для переносчика
просто выделить все переносы из какой-нибудь "библиотеки в кармане"
и использовать сразу готовые и правил никаких не надо.
>Почему бы и Вам не попробовать, раз эта тема Вам интересна?
Пробовал, пробую и буду пробовать.
>Откуда же тогда такие утверждения?
На основании личного опыта написания других интерпритаторов.
Это все обработка текстов: приемы одного подходят другому.
Кстати, свести сложную обработку к механической работе это искусство.
>Ну так назовите тех, кого поддерживаете. Сколько их? Если честно?
Примерно 15 человек разработчиков и пользователей лично регулярно.
А уже они поддерживают других. Но при чем тут все это?

>Defunct ©
>При первом запуске появилась табличка:
>M: не найден, содаю D:\.....\...\
А вы из архива то ENLIS.ZIP распаковали?
как указано в пункте "устанавка" в enlis.htm

Вот контрольный пример к программе
Его нужно записать в текстовый файл test.txt

объект перемещение на 2 вверх;
объект перемещение на 4 влево
<текстовое поле>
<удалить>
<создать>
<изменить текст> на другой тест
объект перемещение на 2 вниз
<круг>
<изменить радиус> на 100
объект перемещение на 4 вправо
стой


А вот сама глупая программа

program Project1;
uses Graphics, forms, SysUtils, windows, Classes;
var
i,pNA,r,d,h,w,x,y,dx,dy,z:integer;b:graphics.tBitmap;t:textFile;
s,txt:string;ce:tCanvas; stop,error,est,hide:boolean;wo:char;

FUNCTION C(s:string):string; var i:integer; begin
result:="0";
for i:=1 to length(s) do if s[i]in["0".."9"]then result:=result+s[i] else break;
end;
PROCEDURE SS(n:string; var dy:integer; m:integer);
begin
dy:=m*pNA;ce.textOut(100,20,"Перемещение "+n+" на "+intToStr(m*dy)+"       ")end;
PROCEDURE ssp;
begin ce.textOut(100,20,"Выполнила команду "+s+"       ")end;
FUNCTION e(ps:string):boolean;begin e:=pos(ps,s)>0 end;

BEGIN
h:=screen.height; w:=screen.width;  x:=w div 2; y:=h div 2; r:=h div 10; d:=r;
ce:=tCanvas.create; ce.Handle:=GetDC(0);
b:=Graphics.tBitMap.create;b.width:=w; b.height:=h;
b.canvas.copyRect(rect(0,0,w,h),ce,rect(0,0,w,h));
assignFile(t,"test.txt"); reset(t);
ce.font.size:=18;ce.font.color:=$FF; ce.font.style:=[fsBold];
ce.Pen.color:=$ff;   ce.Pen.width:=4;
wo:="k"; est:=true;  stop:=false; txt:="Текст для начала";

while not eof(t)and not stop do begin
readln(t,s);
ce.Draw(0,0,b);
dx:=0; dy:=0; error:=false;
i:=pos(" на ",s);if i>0 then pNA:=StrToInt(c(trim(copy(s,i+4,255))));
if e("переместить")or e("перемещение")  then begin
  if e("вверх")  then ss("вверх",dy,-1)  else
  if e("вниз")   then ss("вниз",dy,+1)   else
  if e("влево")  then ss("влево",dx,-1)  else
  if e("вправо") then ss("вправо",dx,+1) else error:=true;
  if not error   then begin inc(x,dx*r); inc(y,dy*r) end;
end
else begin
//Вот сюда добавлять новое
  if e("<круг>") then  wo:="o"      else
  if e("<квадрат>") then  wo:="k"   else
  if e("<текстовое поле>") then  wo:="t" else
  if e("<удалить>") then est:=false else
  if e("<создать>") then est:=true  else
  if e("<скрыть>")  then hide:=true else
  if e("<показать>")then hide:=false else
  if e("<изменить радиус>")then r:=pNA else
  if e("<изменить ширину>")then r:=pNA else
  if e("<изменить текст>") then txt:=trim(copy(s,pos(" на ",s)+4,255))else
  if e("стой")or e("пошла вон")or e("стой сволочь")then stop:=true else error:=true;
  ssp;
end;
if error and (trim(s)<>"") then ce.textOut(0,0,"Неверная команда "+s+"       ")
else  begin
  if est and not hide then
  case wo of
//сюда добавлять что делать
    "k": ce.rectangle(x-r,y-r,x+r,y+r);
    "o": ce.RoundRect(x-r, y-r, x+r, y+r, r, r);//не нашел я круга
    "t": ce.textOut(x,y,txt);
  end;
  z:=GetTickCount+2000; while GetTickCount<z do application.processmessages;
end;
end;
closeFile(t);
ce.Draw(0,0,b);
end.


 
Defunct ©   (2004-10-13 12:22) [61]

> А вы из архива то ENLIS.ZIP распаковали?
> как указано в пункте "устанавка" в enlis.htm

Да, разумеется. Прочитал ваши инструкции и сделал как там написано, но увы результат я описал [35, 37]. Получить что-то большее чем описано в [37] не удалось.


 
П7   (2004-10-13 12:50) [62]


> Для меня это лишь бессилие сказать по теме.

Да это именно бессилие сказать по теме. Ибо я не хочу говорить что-либо о том, в чём не совсем разбираюсь. Я лучше послушаю. А вот ты пытаешься высказываться. А зря. Код у тебя отвратительный.
И я не вижу ничего унизительного в том, что мне нечего всказать по теме - я учусь, пытаюсь узнать больше и призываю не тратить время на глупую болтовню и приперательства. А вместо этого дать народу знания... (:


 
DiamondShark ©   (2004-10-13 13:14) [63]

Весело тут у вас ;)


 
ЮрийК ©   (2004-10-13 19:22) [64]

Тем, кто интересуется Delphi Grammar :
http://groups.yahoo.com/group/DelphiGrammar/


 
GanibalLector ©   (2004-10-13 19:27) [65]

>Тем, кто интересуется Delphi Grammar
Дык,я интересуюсь!Но там http://groups.yahoo.com/group/DelphiGrammar/ вообще ПУСТО,млин.


 
ЮрийК ©   (2004-10-13 19:58) [66]

Попробуй через поиск найти что нужно на :
http://groups.yahoo.com/

Там нужно записаться в группу, неужели где ты был, нет соответствующего линка?


 
ЮрийК ©   (2004-10-13 20:09) [67]

Ещё, наверное нужно завести и-мэйл бокс на Яху, тогда будет и доступно, а не пусто.


 
Юрий Зотов ©   (2004-10-13 21:47) [68]

> programania ©   (13.10.04 11:29) [60]

>программа при трансляции не нашла TryStrToInt наверно от
> того что у меня D5, буду искать D8 как у вас.

Можно вставить заменитель:
function TryStrToInt(const S: string; out Value: Integer): Boolean;
var
 E: Integer;
begin
 Val(S, Value, E);
 Result := E = 0;
end;


> Как и ожидал: около часа тупой долбежки по клавишам.
Неважно - час или минута. Важно, сохранились ли старые алгоритм и код, или они были изменены. В первом случае имеем расширение, во втором - переделку.

> А вам предлагаю смотреть на вещи шире
Вы показывате узкозаточенную программу и предлагаете мне смотреть на вещи шире? LOL.

> интерпретатор находит в тексте знакомые слова а незнакомые
> считает параметрами и использует их при выполнении

Сорри, но это Вы велосипед изобрели (и как раз от незнания теории). Незнакомые слова интерпретатор считает идентификаторами и в зависимости от своего текущего состояния и самого идентификатора либо отвергает его, либо заносит в таблицу, либо использует при выполнении программы. Известно это уже примерно полвека и проверено на огромном числе интерпретаторов и компиляторов. Работает.

> Что вы будете делать для этого расширять или переделывать?
Ни то, ни другое. Для этого вообще ничего не надо делать, потому что это должно быть сделано СРАЗУ (см. предыдущий абзац).

> А если альтернативное выполнение одной из команд
> в зависимости от применения многих запомненных отличий.
> А построить дерево... с альтернативами для входа и выхода
> А связать альтернативы а потом еще все это перестраивать
> при поступлении новых команд, и ведь это не теория, это жизнь.

Вот это как раз и есть самая натуральная теория синтаксического разбора. Поступление нового идентификатора создает новую альтернативу. При анализе кода строится именно дерево. Какие в нем будут входы, узлы и пр. - это зависит и от самого кода, и от текущих альтернатив, и от текущего состояния. То есть, строится оно именно гибко. Так что - сорри, но Вы снова изобрели велосипед и снова от незнания теории.

> добавление почти одинаковых строк: это переделка
> или расширение

Еще раз (пятый?): если меняется АЛГОРИТМ - это переделка. Если добавляется НОВЫЙ код, без смены алгоритма - это расширение.

> Нельзя так тупо подходить к оформлению кода.
> ...оформление должно помогать понимать, дать возможность
> обозреть программу.

Вот именно. Только обозреть Ваш код в [18] более чем непросто. Обозреваемым он становится как раз после "тупого" оформления. Как ни странно.

> Для этого вспомогательные части нужно сжимать
> если можно до 1 строки

Такая мысль обычно проистекает от малого опыта работы с отладчиком в действительно сложном коде.

> а важные выделять, возможно даже в процедуры
Сенкс за просвещение. :о)
Но знаете - это ведь снова теория. Как насчет нисходящего и восходящего проектирования, например?

> A пример сжат для форума...
Непонятно - зачем для форума "сжимать" код? Экономии - мизер, но код становится совершенно нечитаемым.

> Ваши программы я со своим модемом вряд ли когда увижу
Вероятно, да. Частному лицу оно и не надо, а организации обычно имеют выделенку.

> а мои пожалуста... одна и таже ENLIS.exe
> приводит в действие >10 АРМом с сотнями входных и выходных
> форм и при этом никаких изменений в программе вообще не надо
> делать.

Судя по сообщениям Defunct"а, Enlis гораздо ближе к всенародно известной автошеме, чем к тому шедевру, о котором Вы говорите. Кстати, автошема подается ее автором тоже как шедевр, да вот одна лишь беда - не работает. Похоже, и с Enlis та же проблема.

Знаете, если бы подобное написали о моей программе, я срочно бросился бы ее переделывать, а до того постеснялся бы даже упоминать о ней. Чтобы еще больше не позориться.

> Напишите какие интерпритаторы вы сделали, причем лично
> без "команды", как я написал в [32]

Пожалуйста. Лично я, без всякой команды, своей головой и своими руками, с нуля и до полной отладки написал:
1. Интерпретатор подмножества Паскаля.
2. Калькулятор (т.е., интерпретатор арифметических выражений любой сложности). С функциями.
3. Интерпретатор одного специального и довольно объемного языка (язык описания строительных смет - ИБП, насколько помню).
4. Интерпретатор своего собственного языка (сначала, естественно, построив сам язык). Превращает входной текст в выходной текст на практически любом другом языке (Си, Паскаль, SQL и пр., и пр.) - т.е., работает по гибким правилам.

> Или способны только на такое:
>>1. насчет сложных проектов пальцы гнуть.
>>2. детишки из школьного кружка программирования.
>>3. образумить бедного студента,
>>4. ни один человек не может быть таким твердолобым,
>>5. Уймись, дите неразумное. На кого батон крошишь?

П.п. 1 и 2 - мои. Но что Вы в них нашли обидного или неверного? Разве не Вы в [12] начали гнуть пальцы по поводу сложных проектов и их сопровождения? Вы. А разве не Вы привели в [18] примитивный код, который ну никак не вяжется с опытом разработки, отладки и сопровождения сложных проектов? Тоже Вы. Так на кого же обижаться-то нужно? Может, на себя самого?

П.п. 3-5 - не мои. Попрошу чужих слов мне не приписывать.

> До такого я никогда не унижусь.
А вот лукавить - не надо. Вы же сами язвить и начали. Цитаты привести, или сами знаете?

> Для меня это лишь бессилие сказать по теме.
Я с Вами говорю строго по теме. Более ни за кого не отвечаю. Поэтому не понимаю, почему свои претензии Вы адресуете именно мне и не принимаю их.

>> Скриншот могу прислать
> Если он сильно отличается от Delphi и <200k дайте ссылку.


Он вообще почти от нее не отличается. И почти так же работает. И даже из скриншота это видно - вот почему я говорил, что даже из него Вы кое-что поймете.

Объем - где-то 30 Кб. Ссылку не дам, могу прислать по мылу.

>>Так что в рамках тех самых 80-90% задача все же решаемая.
> Согласен. О 100% я как раз и не говорил

Третий раз прошу - читайте внимательнее. О 100% никто вообще не говорил, с самого начала.

> Так может и для переносчика просто выделить все
> переносы из какой-нибудь "библиотеки в кармане" и использовать
> сразу готовые

Сорри, но это очередной велосипед. Неинтересно.

>>Почему бы и Вам не попробовать, раз эта тема Вам интересна?
> Пробовал, пробую и буду пробовать.

В [32] Вы написали прямо противоположное: "я и пытаться не буду". Вы уж как-нибудь определитесь, плз - либо одно, либо другое. А то какое-то пустое словоблудие получается.

> свести сложную обработку к механической работе это искусство.
Это знание теории. Когда точно знаешь, что и как надо сделать, то остается только сделать.

> Примерно 15 человек... Но при чем тут все это?
При том, что 1000/15 = 67. Так что не Вам учить меня поддержке. А судя по Вашему коду - и разработке тоже. Скорее, наоборот.

=======================================

P.S.
По поводу нового варианта программы - позже. Сначала напишу и выложу свой. Вот тогда и сравним.


 
TRyaSS ©   (2004-10-13 22:56) [69]

...ветка постепенно переходила в абсурд...
дочитал не до конца,терпения не хватило.
Поэтому если кого то задели мои слова,прошу прощения.


 
П7   (2004-10-13 23:01) [70]


> Я с Вами говорю строго по теме. Более ни за кого не отвечаю.
> Поэтому не понимаю, почему свои претензии Вы адресуете именно
> мне и не принимаю их.

Ну вот, похоже я всех запутал. Или сам запутался... (:

А вот код, это интересно... (:


 
GanibalLector ©   (2004-10-14 00:43) [71]

2  Юрий Зотов ©
Ответьте пожалуйста на [59]


 
Defunct ©   (2004-10-14 01:39) [72]

> GanibalLector ©   (14.10.04 00:43) [71]

Yandex.ru

строка поиска: БНФ формы
Результат поиска: страниц — 392, сайтов — не менее 158


 
GanibalLector ©   (2004-10-14 01:54) [73]

2 Defunct ©   (14.10.04 01:39) [72]
Дык,были мы и там(и в google и прочих),но реальных примеров нет(вернее я их не нашел).Открыл ~ около 50 сайтов,эффект=0.


 
Defunct ©   (2004-10-14 04:28) [74]

GanibalLector ©   (14.10.04 01:54) [73]

Открыл первую попавшуюся ссылку и сразу на первой же странице пример:

http://mexmatkz.narod.ru/rus/lec.tyap.index.htm

Запишем БНФ формы для языка чисел.

<число>::=<число без знака>|+<число без знака>|-<число без знака>
<число без знака>::=<десятичное число>|<порядок>|<десятичное число><порядок>
<десятичное число>::=<число без знака>|<правильная дробь>|<целое без знака><правильная дробь>
<порядок>::=e<целое>
<правильная дробь>::=.<целое без знака>
<целое>::=<целое без знака>|+<целое без знака>|-<целое без знака>
<целое без знака>::=<цифра>|+<целое без знака>|-<целое без знака>
Левая часть определяется через правую, содержащую левую. Это называется "рекурсивное определение"
<цифра>::={0|1|2|3|4|5|6|7|8|9}


 
Babay ©   (2004-10-14 05:20) [75]

To Юрий Зотов ©
>>Немудрено - мало кто из частных лиц использует ERP-системы. А кому надо - те знают. - это точно.

>>Во всяком случае, в различные обзоры ERP-рынка мы попадали не раз, включая и буржуйские. - А немогли бы Вы дать ссылочки очень охота прочитать про наши (в смыле российские) ERP системы. Интереисуюсь не просто так, а потому что живу практически с этого :-) (я инженер по автоматизации).


 
VMcL ©   (2004-10-14 07:56) [76]

>>П7   (13.10.04 12:50) [62]

>Да это именно бессилие сказать по теме. Ибо я не хочу говорить что-либо о том, в чём не совсем разбираюсь. Я лучше послушаю.

"И это правильно." © М. Горбачёв.


 
programania ©   (2004-10-14 19:24) [77]

>Юрий Зотов
О примере:
у меня чтоб добавить новую команду нужно добавить
строку IF по ключевому слову и делать там
что угодно совершенно независимо от обработки других команд.
у вас все команды и их обработка сделаны по одному типу Cmds Dirs
поэтому при изменении одной или добавлении новых конструкций
придется затрагивать и старые и значит заново все отлаживать.
Еще, сами ключевые слова, действия и их обработка
разбросаны по программе, а это не так наглядно.
Поясняю:
Главное при изменении программы не навредить.
Представьте что вашу программу собрался изменить незнакомый человек.
В моей он сразу найдет ключевое слово по ctrl+F
и изменит в одном месте только что относится к этой команде,
а вашу программу я вообще побоялся бы трогать.
Совет всем:
Делите программу на независимые куски: не пожалеете.

>потому что это должно быть сделано СРАЗУ
Никто не может предвидеть будущее.
А значит при необходимости непредвиденных измененй
вашу программу придется выкинуть.

>малого опыта работы с отладчиком в действительно сложном коде.
Когда я работаю с отладчиком то могу исковырять код до неузнаваемости.
Как вы отлаживаетесь не меняя кода?
Совет:
Не бойтесь переделывать и содержание и форму.
Нет ничего застывшего. Все в вашей власти.

>зачем для форума "сжимать" код?
Не у всех же бесплатная выделенка.

>Судя по сообщениям Defunct"а,
О программе лучше самому судить
а Defunct похоже ее и не видел в нормальном виде

>я срочно бросился бы ее переделывать
Я это и сделал: исправил замечания о чем сообщил
и проверил во всех доступных местах скачивание и
запуск всеми мыслимыми способами.
Что еще сделать? тут же сделаю.

>Цитаты привести, или сами знаете?
Я не пишу плохо о людях, только об их делах.
А резкие формулировки применяю чтоб
было интересней всем читать.
Извините еще раз.

>При том, что 1000/15 = 67.
К чему эти подсчеты? Я же говорю о средстве разработки
и могу вообще поддерживать 1 разработчика, а он 100.
А спросите у разработчика 1С сколько пользователей
он поддерживает? да он их вообще не видел.
А мне сейчас в 19.10 форму новой ведомости принесли

>TRyaSS
>ветка постепенно переходила в абсурд...
Я согласен и чтоб быть полезным и интересным
приведу пример работы интерпритатора Pascalя
сделанного на днях для запутывания кода
Вот исходный бессмысленный код для запутывания:

procedure test;
var
rrr:integer;
i:integer;
s:string;
begin
{Коментарий}
for i:=1 to 2 do begin //Другой коментарий
inc(rrr);
end;
form1.timer1.enabled:=false;
rrr:=2;
if rrr>0 then begin
assignFile(tf,"test.pas");
end;
reset(tf);
closeFile(tf)
end;

А вот что после запутывания:

procedure test; var rrr:integer; i:integer;
s:string;
label l1,l2,l3,l4,l5,l6,l7,l8,l9,l10,l11,l12,l13,
l14,l15,l16,l17,l18,l19,l20,l21,l22,l23,l24,
l25,l26,l27,l28,l29,l30,l31,l32,l33,l34,l35,
l36,l37,l38,l39,l40,l41,l42,l43,l44,l45,l46,
l47,l48,l49,l50,l51,l52;
procedure p_; begin application.processmessages end;
begin goto l39;l40:  goto l34;l35:  l1:if i<=2 then begin goto l44;
l45:;goto l52;l48:goto l19;l20:;goto l32;
l28:goto l24;l25:;goto l31;l32:;goto l51;
l52:  goto l18;l19:closefile(tf);goto l20;
l21:;goto l37;l33:goto l14;l15:;goto l36;
l37:  goto l23;l24:goto l1;goto l17;l13:inc(rrr);
goto l16;l17:;goto l25;l26:  goto l28;l29:assignfile(tf, "test.pas" );
goto l12;l8:i:=1;goto l11;l12:;goto l30;l31:;
goto l42;l38:goto l29;l30:;goto l41;l42:;
goto l47;l43:reset(tf);goto l46;l47:  goto l33;
l34:goto l8;l9:end  else goto l2;goto l10;
l11:;goto l35;l36:  if rrr>0 then begin goto l38;
l39:goto l3;l4:inc(i);goto l5;l6:;goto l22;
l18:goto l9;l10:;goto l21;l22:;goto l40;l41:  end;
goto l49;l50: goto l48;l49:goto l43;l44:goto l13;
l14:l2: form1.timer1.enabled:=false;goto l7;
l3:rrr:=0;goto l6;l7:;goto l15;l16:;goto l27;
l23:goto l4;l5:;goto l26;l27:;goto l45;l46:;
goto l50;l51:  end;

Даже отладчик запутывается и не проходит его весь пока
не выделить операторы по строкам.
А можно ли его распутать программой?


 
Defunct ©   (2004-10-14 20:59) [78]

> programania
> О программе лучше самому судить


Вот потому я и решил на нее посмотреть сам, а не свято верить вашему описанию.

> а Defunct похоже ее и не видел в нормальном виде

Вы не удосужились довести ее до нормального вида, даже с учетом замечаний [40] и [43]. На вопрос, для чего предназначена  ваша программа, вы не ответили. [50] вы полностью проигнорировали.

Еще раз повторю [43]:
Опишите хотя бы чего ждать от программы?
Скриншот выложите.


 
VMcL ©   (2004-10-14 21:07) [79]

>>programania ©  (14.10.04 19:24) [77]

>>зачем для форума "сжимать" код?
>Не у всех же бесплатная выделенка.


Маразм крепчал.

>спросите у разработчика 1С сколько пользователей
он поддерживает? да он их вообще не видел.


Ещё больше крепчал (это я как экс-1С-программист пишу).


 
Defunct ©   (2004-10-14 21:24) [80]

> Я согласен и чтоб быть полезным и интересным
> приведу пример работы интерпритатора Pascalя
> сделанного на днях для запутывания кода
> Вот исходный бессмысленный код для запутывания:

К чему это относилось совсем не понятно.

Ваш код (до запутывания) - полный абсурд:

procedure test;
var
rrr:integer;          <-- лишнее, потому что не несет смысловой нагрузки
i:integer;            <-- лишнее, т.к. можно обойтись без цикла
s:string;             <-- лишнее, т.к. нигде не используется
begin
{Коментарий}
for i:=1 to 2 do begin <--- лишнее потому что в цикле ничего не делается
inc(rrr);              <--- лишнее потому что rrr устанавливается в 2 после цикла
end;
form1.timer1.enabled:=false;
rrr:=2;                <--- лишнее потому что потом идет проверка на > 0
if rrr>0 then begin    <--- лишнее потому что rrr всегда больше нуля
assignFile(tf,"test.pas"); <-- лишнее потому что из файла ничего не читается
end;
reset(tf);                <-- ошибка, потому что файловая переменная может быть не назначена
closeFile(tf)             <-- ошибка, потому что файл может быть не открыт
end;


Если убрать все лишнее получится:

procedure test;
begin
 Form1.Timer1.Enabled:=false;
end;


Ну и что же этот код делает, причем тут интерпретатор паскаля?

Если вы действительно хотите кого-то запутать, тогда надо применять перекресные ссылки (crosslinked code). Вот пример (уже приводил его однажды):

Db 0B8H
SubEnable:
Db 2dH
Db 3eH

Db 0EBH
Db 0FCH


Здесь AH=52h и ни один анализатор кода (без интерпретации) не сможет установить вызов вирусоопасной функции получения списка списков.


 
Defunct ©   (2004-10-14 21:39) [81]

> приведу пример работы интерпритатора Pascalя
> А вот что после запутывания:

Вдогонку, то что вы пытались преподать всем как интерпретатор Паскаля, теории известно и называется "Генератор полиморфного кода". Широко применяется в вирусологии и в теории защиты информации.

Определение:
Генератор полиморфного кода - программа способная создавать штаммы, выполняющие одно и то же действие, которые не совпадают ни по размеру коду и ни в одином байте кода.


 
programania ©   (2004-10-16 03:24) [82]

>Defunct
Ваш код (до запутывания) - полный абсурд:
Сожалею что вы стали анализировать бессмысленный код
о чем было ясно написано:
Вот исходный бессмысленный код для запутывания:
>причем тут интерпретатор паскаля
Чтобы сделать такой выходной код нужно выделить из текста паскаля
операторы, коментарии, константы, элементы оператора FOR,
begin, end, а разбор входного текста на составные части
это и есть начальная стадия интерпретатора.
"Генератор полиморфного кода" здесь не причем.
код изменяется каждый раз одинаково,
цель не вирус а создание исходного кода,
который нормально работает, но который невозможно
понять или восстановить, например,
для защиты от взлома или незаконного использования.
Было интересно узнать удалось ли это сделать или
надо путать сильнее.

>Опишите хотя бы чего ждать от программы?
О своих программах я могу писать без конца, но боюсь всем надоем
поэтому извините что не на все отвечаю.
После download и распаковки programania.com/ENLIS.ZIP
Нужно ждать появления файлов:
Enlis.exe от 11.10.04, z.men от 15.10.03, oan.ini от 15.10.03
и нескольких других не обязательных.
После запуска Enlis.exe любым способом
следует ждать появления меню из 3 пунктов: "Возможности","Настройка","Выход"
c подменю без всяких сообщений.
От меню нужно ждать вызова описания возможностей в htm, настройки вида
и запуск редактора табличных файлов.
От редактора следует ждать стандартного меню и панели с кнопками
При выборе создать и вводе любого имени следует ждать
появления типовой формы документа, который можно заполнять
и испытывать все возможности.
Или распаковать KADR.EXE с заменой, чтоб сразу их увидеть
после запуска той же самой Enlis.exe
Для чего программа написано в enlis.htm, а если коротко
то для создания АРМов бухгалтерских и т.п.

>Rar есть у всех а вот sfx никому не нужен.
За всех лучше не говорить: я не раз скачивал
rar и не мог распаковать потому что у меня старый rar
или вы думаете кто-то ради вашей программы будет
искать rar? Поэтому self надежней.

>Если программа заслуживает внимания, тогда пользователям не важно сколько занимает инсталляшка 800kb или 10Mb.
Чтобы узнать программу лучше всего ее скачать.
Или вы думаете что все уже знают ваши программы.

>Зато сервис выше, программу можно будет хоть нормально анинсталлить.
Это средство разработки, не для дилетантов и не требует установки,
специалисту смешно предлагать весь этот "сервис",
а чтобы хоть нормально анинсталлить достаточно все удалить.
Для дилетантов есть ENJOL.ZIP с установкой как принято.

>VMcL
>Ещё больше крепчал (это я как экс-1С-программист пишу).
А я писал о разработчиках 1C т.е. того языка
на котором вы программировали 1C.


 
VMcL ©   (2004-10-16 14:08) [83]

>>programania ©  (16.10.04 03:24) [82]

>А я писал о разработчиках 1C т.е. того языка
на котором вы программировали 1C.


Откуда дровишки? ОГГ?


 
Юрий Зотов ©   (2004-10-16 17:47) [84]

> programania [60]

Итак, расширяем мою программу так, чтобы она содержала:
объекты - <круг> <квадрат> <текстовое поле>
команды - <создать> <переместить> <скрыть> <показать> <удалить> <изменить радиус> <изменить ширину> <изменить текст>

Сразу скажу, что на этом примере я намерен продемонстрировать, что программа именно расширяемая - то есть, что новые объекты и команды вводятся в нее без изменения алгоритма и УЖЕ существующего кода, а ТОЛЬКО добавлением нового.

Поскольку объект <текстовое поле> в программе уже есть (это РЕДАКТОР), добавляем объекты ПРЯМОУГОЛЬНИК (это КВАДРАТ в общем виде) и ЭЛЛИПС (это КРУГ в общем виде). Сначала вводим в проект еще один модуль, в котором определяем сами эти объекты (чтобы было что добавлять):

unit Unit2;

interface

uses
 Windows, Messages, Classes, Controls, ExtCtrls;

type
 TRectangle = class(TShape)
 private
   procedure CMTextChanged(var Message: TMessage); message CM_TEXTCHANGED;
 protected
   procedure Paint; override;
 end;

 TEllipse = class(TRectangle)
 public
   constructor Create(AOwner: TComponent); override;
 published
   property Shape default stEllipse;
 end;

implementation

{ TRectangle }

procedure TRectangle.CMTextChanged(var Message: TMessage);
begin
 inherited;
 Invalidate
end;

procedure TRectangle.Paint;
const
 Flags = DT_CENTER or DT_VCENTER or DT_SINGLELINE or DT_EXPANDTABS or DT_END_ELLIPSIS;
var
 R: TRect;
begin
 inherited;
 with Canvas do
 begin
   R := ClientRect;
   DrawText(Handle, PChar(Caption), Length(Caption), R, Flags)
 end
end;

{ TEllipse }

constructor TEllipse.Create(AOwner: TComponent);
begin
 inherited;
 Shape := stEllipse
end;

end.

Теперь вводим эти новые объекты в саму программу. Для этого их нужно только внести в таблицы классов:

ClassCount = 6;
ClassTable: packed array[0..(ClassCount - 1)] of string =
 ("КНОПКА", "МЕТКА", "ПАНЕЛЬ", "ПРЯМОУГОЛЬНИК", "РЕДАКТОР", "ЭЛЛИПС"); // upper case, sorted
DelphiClassTable: packed array[0..(ClassCount - 1)] of TControlClass =
 (TButton, TLabel, TPanel, TRectangle, TEdit, TEllipse);

Это все. Можно запустить программу и убедиться, что ее старые команды "создать", "переместить" и "удалить" УЖЕ работают с новыми объектами. Как видите, в СТАРОМ коде программы абсолютно ничего не изменилось - был ДОБАВЛЕН код новых объектов, а сами новые объекты были ТОЛЬКО внесены в таблицы.

Теперь вводим новые команды СКРЫТЬ, ПОКАЗАТЬ, РАЗМЕР (это <изменить радиус> и <изменить ширину> в общем виде) и ТЕКСТ (остальные команды в программе уже есть). Это делается в 2 шага.

Шаг 1. Вносим новые команды в тип TToken и в таблицы команд:

type
 TToken = (tkNone, tkClassName, tkObjectName,
   tkMove, tkShow, tkSize, tkHide, tkCreate, tkText, tkDelete, tkParam, tkEoF);

CommandCount = 7;
CommandTable: packed array[0..(CommandCount - 1)] of string =
 ("ПЕРЕМЕСТИТЬ", "ПОКАЗАТЬ", "РАЗМЕР", "СКРЫТЬ", "СОЗДАТЬ", "ТЕКСТ", "УДАЛИТЬ"); // upper case, sorted
CommandTokenTable: packed array[0..(CommandCount - 1)] of TToken =
 (tkMove, tkShow, tkSize, tkHide, tkCreate, tkText, tkDelete);
ValidCommandTable: packed array[tkClassName..tkObjectName, tkMove..tkDelete] of boolean =
   ((False, False, False, False, True, False, False), (True, True, True, True, False, True, True));

Шаг 2. Для каждой новой команды пишем обрабатывающую ее процедуру и вносим ее в таблицу процедур:

procedure ShowObjectProc(const StrParam: string; const IntParams: TIntegerArray);
begin
 if Length(IntParams) <> 1 then
   InvalidParamCount(0);
 ObjectTable.GetObject(StrParam, IntParams[0]).Visible := True
end;

procedure SizeObjectProc(const StrParam: string; const IntParams: TIntegerArray);
begin
 if Length(IntParams) <> 3 then
   InvalidParamCount(2);
 if (IntParams[1] < 0) or (IntParams[2] < 0) then
   raise EStatementSyntaxError.Create("Размер объекта не может быть отрицательным");
 with ObjectTable.GetObject(StrParam, IntParams[0]) do
   SetBounds(Left, Top, IntParams[1], IntParams[2])
end;

procedure HideObjectProc(const StrParam: string; const IntParams: TIntegerArray);
begin
 if Length(IntParams) <> 1 then
   InvalidParamCount(0);
 ObjectTable.GetObject(StrParam, IntParams[0]).Visible := False
end;

procedure TextObjectProc(const StrParam: string; const IntParams: TIntegerArray);
var
 i: integer;
begin
 if Length(IntParams) <> 2 then
   InvalidParamCount(1);
 try
   i := ObjectTable.FindObject(StrParam, IntParams[1])
 except
   on E: EStatementSyntaxError do
     i := -1
   else
     raise
 end;
 if i >= 0 then
   raise EStatementSyntaxError.CreateFmt("Объект "%s%d" уже существует", [StrParam, IntParams[1]]);
 with ObjectTable, Items[FindObject(StrParam, IntParams[0])]^ do
 begin
   ObjectID := IntParams[1];
   TFriendControl(ObjectRef).Text := GetObjectName(StrParam, ObjectID)
 end
end;

var
 CommandProcTable: array[tkMove..tkDelete] of pointer =
   (@MoveObjectProc, @ShowObjectProc, @SizeObjectProc, @HideObjectProc,
    @CreateObjectProc, @TextObjectProc, @DeleteObjectProc);

Это все. Можно запустить программу и убедиться, что теперь ВСЕ ее команды (и старые, и новые) УЖЕ работают со ВСЕМИ ее объектами (и старыми, и новыми). Как видите, в СТАРОМ коде снова абсолютно ничего не изменилось - были ДОБАВЛЕНЫ процедуры для новых команд, а сами новые команды были ТОЛЬКО внесены в таблицы.

Вот так пишутся РАСШИРЯЕМЫЕ (а не ПЕРЕДЕЛЫВАЕМЫЕ) программы. Которые легко сопровождать и поддерживать. Что стало возможным как раз благодаря тому, что сам код интерпретатора (а это процедура ExecuteStatement со всеми ее внутренними процедурами) ИЗНАЧАЛЬНО был написан по ТЕОРИИ. И заметьте, что в ЭТОМ коде ВООБЩЕ ничего не менялось. К нему даже ничего и не ДОБАВЛЯЛОСЬ - поскольку благодаря теории этот код стал ОБЩИМ. Универсальным. Ему абсолютно без разницы, сколько и каких объектов и команд надо обрабатывать. Сколько угодно и каких угодно. Он работает по набору БНФ, в котором определены понятия ЛЮБОЙ объект и ЛЮБАЯ команда - а какой КОНКРЕТНЫЙ объект или команда встретились в тексте - безразлично, лишь бы этот объект или команда присутствовали в таблицах. Вот почему при добавлении новых объектов и команд модифицируются таблицы, а не интерпретирующий код.

Теперь допустим, что таблицы объектов и команд сидят не в программе, а в БД. Тогда вообще начинаются чудеса - код будет способен обрабатывать ЛЮБЫЕ объекты и команды ДАЖЕ БЕЗ ПЕРЕКОМПИЛЯЦИИ. Поскольку таблица DelphiClassTable может быть текстовой и тоже сидеть в БД (класс Delphi находится через GetClass), как и таблица обрабатывающих процедур CommandProcTable (сами процедуры могут сидеть в библиотеке UDF и определяться через GetProcAddress). ТАКУЮ программу надо только отладить, а все модификации могут вносится в БД и UDF самими юзерами - и получаем "язык, определяемый пользователем".

Неплохо, да? И, между прочим, благодаря теории.

===========================

P.S.
О том, что же сделали Вы (РАСШИРИЛИ свою программу или ПЕРЕДЕЛАЛИ ее) - позже.


 
wnew ©   (2004-10-16 18:01) [85]

Юрий Зотов, если бы Вы писали книги по программированию, то думаю, многим бы они были очень интересны и полезны. Я бы с удовольствием изучал бы их содержимое, даже просто так, для себя.
  Почему бы Вам не заняться писательством? Наверное, от этого занятия тоже есть какая-то материальная выгода.


 
GanibalLector ©   (2004-10-17 01:38) [86]

2 Юрий Зотов  [84]
Да,чудеса!!!
Полностью согласен с wnew [85].Может начнем инвестировать в Вас?


 
Defunct ©   (2004-10-17 02:36) [87]

programania ©   (16.10.04 03:24) [82]

>> Ваш код (до запутывания) - полный абсурд:
> Сожалею что вы стали анализировать бессмысленный код
> о чем было ясно написано:


Я стал его анализировать, после того как прочитал это:

> приведу пример работы интерпритатора Pascalя
> сделанного на днях для запутывания кода


Мне просто стало интересно, где же там интерпретатор.

Мельников Г.П. «Системология и языковыe аспекты кибернетики», М. 1978 г.
http://www.philol.msu.ru/~lex/melnikov/meln_r/glava_2_2-4.htm :
Поскольку дальше речь пойдет о различных аспектах проблемы отражения, которая подразумевает обязательное наличие отражающего объекта и отражаемых объектов, то условимся называть отражающий объект более кратко, одним словом: интерпретатор.

Следовательно, интерпретатор – это объект, отражающий поведение каких-то объектов отражения.

>> причем тут интерпретатор паскаля
> Чтобы сделать такой выходной код нужно выделить из текста паскаля
> операторы, коментарии, константы, элементы оператора FOR,
> begin, end, а разбор входного текста на составные части
> это и есть начальная стадия интерпретатора.


Смотрим определение интерпретатора. Где же тут отражение чего-либо?
Интерпретатор паскаля в вашем случае должен был бы выполнить (интерпретировать) приведенный код, или попытаться выполнить, и на основе результата выполнения, прийти к такому же выводу, к какому пришел я в [80] – код бессмысленный.

> "Генератор полиморфного кода" здесь не причем.
> код изменяется каждый раз одинаково,


Тем не менее, ваша программа, это хоть и неумелый, но все же именно «генератор полиморфного кода». Поясню:
В  результате выполнения вашей программы:
1. мы получаем штамм, выполняющий те же действия, что и исходный код;
2. новый штамм не совпадает по размеру с изначальным кодом;
3. новый штамм не совпадает ни в одном байте с исходным кодом.

(хотя второе у вас получилось исключительно из-за смещения, так что нормальный анализатор кода, к примеру, эвристический анализатор из DrWeb все же найдет совпадения)

Таким образом, ваша программа попадает под определение генератора полиморфного кода [81].

> цель не вирус а создание исходного кода,
> который нормально работает, но который невозможно
> понять или восстановить, например,
> для защиты от взлома или незаконного использования.


А кто говорит, что генератор полиморфного кода (ГПК) применяется только в вирусах? Я же в [81] указал область применения ГПК: широко применяется в вирусологии и в теории защиты информации. Вирусология, кстати, занята проблемами обнаружения и удаления вирусов.

> Было интересно узнать удалось ли это сделать или
> надо путать сильнее.


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

> О своих программах я могу писать без конца

Программу я посмотрю чуть позже, надеюсь, вы ее привели к нормальному виду.


 
Sphinx   (2004-10-17 17:12) [88]

> Юрий Зотов ©   (16.10.04 17:47) [84]

А есть возможность экспортировать нововведения из DLL?
Вроде бы описания объектов TRectangle TEllipse должно быть определено в основной программе? То есть расширить интерпретатор таким образом не получится? Или я ошибаюсь?


 
Palladin ©   (2004-10-17 17:26) [89]


> [88] Sphinx   (17.10.04 17:12)

для DLL в этот штук придется вводить интерфейсы, что в принципе очень не долго... или же использовать BPL...

имхо, лучше интерфейсы :)


 
Sphinx   (2004-10-17 22:17) [90]

> Palladin ©   (17.10.04 17:26) [89]

С интерфейсами на сталкивался...в плане их самостоятельного описания. Может ссылочка есть где можно почитать? Или литература? Хотя Инет предпочтительней...чуть-чуть :)


 
programania ©   (2004-10-18 02:13) [91]

>Юрий Зотов
>Как видите, в СТАРОМ коде снова абсолютно ничего не изменилось - были ДОБАВЛЕНЫ процедуры для новых команд, а сами новые команды были ТОЛЬКО внесены в таблицы.
А куда девалась передвижная панель?
Я обработку команд добавляю в оператор IF там где они получаются
вы в процедуры и в массив указателей на них. И чем это лучше?
По моему это самообман. Ничего не дает, а только усложняет.
А при любой потребности не учтенной в теории все придется делать заново.
Вы сами говорили что все должно быть учтено заранее.
А я уверен что могу добавлять все что угодно не заботясь ни о каких
теориях и так и сделал все свои программы.
Все они когда то выглядели как мой пример в форуме.

>а все модификации могут вносится в БД и UDF самими юзерами - и получаем "язык, определяемый пользователем".
и получаем еще один бейсик: тоже самими юзерами могут писаться любые процедуры или программы.

>Defunct
>«Системология и языковыe аспекты кибернетики», М. 1978 г.
>интерпретатор – это объект, отражающий поведение каких-то объектов отражения.
>Смотрим определение интерпретатора. Где же тут отражение чего-либо?
Это в 1978 можно было процитировать Ленина и спросить почему не отражено в программе.

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

>Тем не менее, ваша программа, это хоть и неумелый, но все же именно «генератор полиморфного кода».
Называйте как хотите но лучше давать названия чтоб было сразу
понятно назначение программы например: запутыватель или mixer.

>Как для запутывания человека – не удалось, человек может интерпретировать
>(выполнить) ваш код, понять что он делает и выбросить все лишнее.
После интерпритации человек получит цепочку из миллионов
операторов присвоения, проверки, а чаще GOTO разбросанных по всей программе.
И что дальше?
Программу с GOTO невозможно понять даже не запутывая ее специально,
и это давно все поняли.
Сложность кода и многократность его выполнения единственное средство
для защиты программы от анализа.
А этой программой можно достичь любой сложности просто повторяя ее.


 
KSergey ©   (2004-10-18 06:53) [92]

> [91] programania ©   (18.10.04 02:13)

С вами не интересно разговаривать. Вы не видите того, что вам пишут, смотрите на это лишь через узкую дырку своего понимания. Даже к словам придираться не буду - не интересно.

Елинственное, за что можно выразить вам благодарность - так это за посты Юрия Зотова в этой ветке. Только не приписывайте эту заслугу себе. Лучше просто почитайте, что он говорит, 5 раз, подумайте.


 
Юрий Зотов ©   (2004-10-18 22:47) [93]

> programania

Вот теперь о том, что же сделали Вы - РАСШИРИЛИ свою программу, или ПЕРЕДЕЛАЛИ ее.

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

1. Добавили глобальные переменные i, pNA, d, txt, stop, error, est, hide и wo. Если алгоритм не менялся, то зачем понадобились новые переменные?

2. Добавили функции C, SSP и E. Если алгоритм не менялся, то зачем понадобились новые функции? Ведь это совсем не те новые функции, которые я ввожу у себя для новых команд - мои новые функции в анализе текста никак не участвуют, а Ваши - участвуют. Вводя такие функции, Вы меняете алгоритм работы интерпретатора.

3. Изменили код процедуры SS. Если алгоритм не менялся, то зачем это потребовалось?

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

5. Добавили код обработки новых команд и объектов. Вот только это Вы и должны были бы сделать, если Ваша программа была действительно расширяемой.

Вывод напрашивается сам собой - чтобы ввести в Вашу программу новые команды и объекты, Вам потребовалось ее переписать. С изменением и старого кода и самого алгоритма. Фактически - написать новую, потому что другой алгоритм - это уже другая программа. И, как всякая новая программа, она снова требует полной отладки и т.д. Все заново, с нуля. Что не просто усложняет поддержку, а делает программу практически неподдерживаемой - потому что трудозатраты на поддержку такой программы слишком велики. И вот поэтому-то Ваш подход годится только для написания простых и маленьких программулек, но совершенно неприемлем для больших и сложных продуктов. И не надо обманывать - Ваш код более чем красноречиво говорит, что нет у Вас никакого опыта разработки и поддержки таких продуктов. Потому что и по идеологии, и по качеству это код студента, а не опытного программиста.

> programania ©   (14.10.04 19:24) [77]

> у меня чтоб добавить новую команду нужно добавить строку IF по
> ключевому слову и делать тамчто угодно совершенно независимо
> от обработки других команд.

Но продемонстрировали Вы почему-то прямо противоположное. Новые переменные, новые функции, измение старого кода и алгоритма. Говорить можно что угодно, но фактами Ваши слова почему-то не подтверждаются. А совсем наоборот - опровергаются.

> у вас все команды и их обработка сделаны по одному типу Cmds
> Dirs поэтому при изменении одной или добавлении новых
> конструкций придется затрагивать и старые и значит заново все
> отлаживать.

Но почему-то я тоже продемонстрировал прямо противоположное. Никаких изменений, только добавление нового. Соответственно, только это новое и требует отладки. И это тоже факты, а не слова.

> Еще, сами ключевые слова, действия и их обработка разбросаны
> по программе, а это не так наглядно.

И снова - продемонстрировал я прямо противоположное. Новые команды и объекты вносятся в таблицы - и все. И это снова не слова, а факты.

> Главное при изменении программы не навредить.

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

> Представьте что вашу программу собрался изменить незнакомый
> человек. В моей он сразу найдет ключевое слово по ctrl+F
> и изменит в одном месте только что относится к этой команде,

Насчет "в одном месте" - это мы уже видели. Если бы... Факты, сударь, факты. Они не на Вашей стороне.

> а вашу программу я вообще побоялся бы трогать.

Тем не менее, модифицируется она очень просто. Как именно - я уже показывал. И это тоже факты, а не слова.

> Делите программу на независимые куски: не пожалеете.

Спасибо, но Ваш совет запоздал лет эдак на 30. Программистский букварь я читал именно тогда.

> Никто не может предвидеть будущее.
> А значит при необходимости непредвиденных измененй
> вашу программу придется выкинуть.

Логика железная - раз никто не может предвидеть будущее, значит мою программу придется выкинуть. Ох, что-то тут не так с причинно-следственными связями...

Ну так вот - предвидеть будущее не просто можно, а очень даже легко. Надо просто сразу считать, что расширения понадобятся и сразу их предусмотреть. Это первое. И второе: чью программу пришлось выкинуть - это мы уже видели. Снова факты.

>> малого опыта работы с отладчиком в действительно сложном коде.
> Когда я работаю с отладчиком то могу исковырять код до
> неузнаваемости. Как вы отлаживаетесь не меняя кода?

Елы-палы! Вы даже не поняли, о чем я говорил. Почему опытные программеры оператор после then пишут на следующей строке, как Вы думаете?

> Совет:
> Не бойтесь переделывать и содержание и форму.

Благодарю. Я, в общем-то и не боюсь. Но это и не требуется - обычно я просто сразу пишу так, чтобы потом уже не переделывать. Ни содержание, ни форму. Расширять, наращивать возможности - это да. Но не переделывать. Пример был дан выше.

> Нет ничего застывшего. Все в вашей власти.

Красивые слова, и ничего больше. Я же просил Вас - не надо демагогии. Лучше факты, плз, это гораздо убедительнее.

>>зачем для форума "сжимать" код?
> Не у всех же бесплатная выделенка.

А как Вы считаете, сколько весит Ваш код в "сжатом" и в нормальном виде? Разница-то ведь копеечная, вряд ли и сотня байт наберется. Может, уважение к читателям дороже этой сотни байт?

> О программе лучше самому судить
> а Defunct похоже ее и не видел в нормальном виде

Не "похоже", а так и есть. Он сам об этом сказал - что увидеть программу ему так и не удалось, несмотря на все его старания. И мне тоже вряд ли удастся, так что "самому судить" - не получится.

> programania ©   (18.10.04 02:13) [91]

> А куда девалась передвижная панель?

Никуда не девалась.

> Я обработку команд добавляю в оператор IF там где они
> получаются вы в процедуры и в массив указателей на них. И чем
> это лучше? По моему это самообман. Ничего не дает, а только
> усложняет.

Гм... помнится, кто-то совсем недавно советовал делить программу на независмые куски... А теперь говорит, что это "ничего не дает, а только усложняет".

> А при любой потребности не учтенной в теории

Не будет такой потребности. Потому что теория позволяет программе работать с ЛЮБЫМ объектом и с ЛЮБОЙ командой. А шире, чем "любой" ничего не бывает. Некуда уже шире.

> все придется делать заново.

Но факты почему-то говорят об обратном.

> Вы сами говорили что все должно быть учтено заранее.

Что и продемонстрировал. На деле.


 
Palladin ©   (2004-10-18 22:51) [94]


> [90] Sphinx   (17.10.04 22:17)

Ссылочка на деле очень простая :)
www.podgoretsky.com

а там DDP, использование Com или что то на подобие...
точно название не помню... ну оно и к лучшему... пока ищешь... найдешь много интересного для себя...


 
Rouse_ ©   (2004-10-18 22:59) [95]

> programania ©   (18.10.04 02:13) [91]
- Эх, кабы не старость постылая, - заговорил старик после недолгого молчания, - плюнул бы на все и увел тебя на Вятшую реку.
ЗЫ: Сдавайся Леопольд ;)


 
programania ©   (2004-10-19 19:51) [96]

>Юрий Зотов
Спасибо за анализ моей простой программы я даже не ожидал.
А изменения делал как и говорил в 1-ом сообщении:
если вижу что что-то повторяется выношу в процедуры или функции
при этом совершенно не заботит что меняю программу а не расширяю
однако конечно этого можно и не делать.

>Елы-палы! Вы даже не поняли, о чем я говорил.
вы говорили об отладке, в основном это поиск ошибок.
Тут следует как можно больше переложить на программу
чтоб она сама все показала и как работает и где ошибается
для этого все средства хороши: проверки,сообщения,имитаторы нажатия,
выкидывание лишнего кода для прояснения, написание дополнительного и т.п.
После такой войны с ошибкой вся программа в руинах,
а вы говорите then на отдельной строке: смешно.

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

>Потому что теория позволяет программе работать с ЛЮБЫМ объектом
>и с ЛЮБОЙ командой. А шире, чем "любой" ничего не бывает. Некуда уже шире.
о настройке:
Во всех больших программах заметны попытки вынести переменные
части для доступа пользователя это ini файлы, pluginы, macro и т.п.
вы тоже предлагаете что-то подобное в своем формате,
чтоб пользователи сами изобретали себе язык по вашим правилам.
Может лучше попытаться обработать любую команду
привычную пользователю без всяких БНФ,
например, путем последовательного
выбора пользователем из предлагаемых ему альтернатив
интерпретировать его команду
в команды доступные программе и запомнить.
Наверно тут еще потребуется пошаговый отладчик,
чтоб пользователь мог видеть что собирается делать
программа и поправлять ее.
Предусматривает ли это ваша теория?


 
Юрий Зотов ©   (2004-10-19 21:37) [97]

> programania ©   (19.10.04 19:51) [96]

И снова слова... слова... слова... одни лишь слова. А как только доходит до конкретики - почему оператор после then пишут на новой строке) - так снова слова... слова... слова... одни лишь слова. Я Вас дважды спрашивал, спрошу и в третий раз - ПОЧЕМУ? Не надо многословия, ответьте конкретно. Иначе получается, что ответа Вы просто не знаете - а значит, никогда не ходили отладчиком по действительно непростому коду. Вообще ни разу. А в таком случае спорить с Вами просто не о чем, понимаете?

Сначала Вы говорите об опыте разработки и сопровождения, потом приводите код, который ни к тому, ни к другому опыту даже близко не лежит. Получается жонглирование словами, типа - "слышал звон, да не знает, где он".

Сначала Вы говорите, что при модификации главное - не навредить, потом заявляете, что Вас совершенно не волнует, переделывете Вы программу или расширяете ее. А одно с другим не вяжется. И снова получается жонглирование словами, снова "слышал звон".

Сначала Вы говорите о структурировании программы, о ее разбиении на независимые куски - но почему-то игнорируете вопрос о восходящем и нисходящем проектировании (видимо, потому что Вы просто не знаете, что это такое?). А потом вообще заявляете что все это - ненужные усложнения. А потом произносите много-много слов по этому поводу, которые в итоге сводятся к "перемещение готового кода не требует больших усилий". Батенька, да такой подход как раз и показывает, что и о проектировании программ Вы не имеете ни малейшего понятия. Снова - всего лишь "слышал звон".

В [84] я Вам говорю: "получаем язык, определяемый пользователем, причем именно благодаря теории". И конкретно показываю, как именно мы его получаем. Вплоть до указания имен функций, с помощью которых разрешаются текстовые ссылки на классы и процедуры. После чего реализовать все это становится легче легкого.

А в [96] Вы предлагаете то же самое (только в каком-то кастрированном, извините, виде) и спрашиваете - предусматривает ли это ваша теория?

Повторяю еще раз (третий уже - чтобы Вы больше уже никогда не задавали таких вопросов ни мне, ни кому-либо другому) - теория предусматривает все. Работу с любыми командами и любыми объектами. На то она и теория и есть. Общая она, понимаете?

И, несмотря на все эти "слышал звон", Вы еще и беретесь спорить, притом с каким-то совершенно непонятным упорством. Приводя в качестве "аргументов" красивые и умные слова, но не приводя подтверждений этим словам (зато приводя их собственноручные опровержения).

По-видимому, Вы сказали правду - разговаривать о программировании Вы готовы бесконечно. Но пока что всего лишь разговаривать (очень надеюсь, что именно "пока").

Что же касается меня, то извините, но я к бесконечным разговорам не готов и временем для них не располагаю. Все, что я хотел Вам сказать, уже сказано - так что читайте и думайте, как сказал KSergey. А еще - читайте все же книжки (если конечно, в будущем хотите не только слышать звон, но еще и знать, где он). И никогда не спорьте о том, в чем как следует не разбираетесь (если, конечно, не хотите рано или поздно услышать-таки в свой адрес знаменитую аббревиатуру из 3-х английских букв).

До свидания. Искренне желаю Вам успехов. Серьезно.


 
Aldor ©   (2004-10-21 09:32) [98]

Юрий, спасибо большое за Ваши посты в этой ветке. Действительно очень интересно и полезно.

 P.S. И ламера бывают косвенно полезны :)))


 
Sphinx   (2004-10-21 15:16) [99]

> Palladin ©   (18.10.04 22:51) [94]

Может я не совсем вник в интерфейсы, но я все равно не понял как передать к примеру тип TEllipse из dll в программу.

Нашел вот еще что:
"DLL не в состоянии поставлять в программу переменные, константы и типы. В результате DLL не могут экспортировать в программу столь необходимые программисту классы - для этого используются пакеты." Фаронов Delphi 6 Учебный курс

Что это за пакеты ?


 
Владислав ©   (2004-10-21 15:32) [100]

Да... цитата просто супер...
Интересно, а у него дальше написано, что такое пакеты?..
А ведь главное, что понятным языком! ;о)


 
Sphinx   (2004-10-21 15:34) [101]

> Интересно, а у него дальше написано, что такое пакеты?..

А дальше про пакеты ни слова...


 
Palladin ©   (2004-10-22 00:28) [102]

Пакеты это и есть то что я сказал - BPL


 
Webgirl   (2004-10-22 21:55) [103]

NAROD mne nujen BNF opisanie paskalya...POMOGITEeee



Страницы: 1 2 3 вся ветка

Форум: "Основная";
Текущий архив: 2004.11.07;
Скачать: [xml.tar.bz2];

Наверх




Память: 1.08 MB
Время: 0.047 c
4-1096816084
Teap0t
2004-10-03 19:08
2004.11.07
создаем Сервис под XP


14-1097934498
vidiv
2004-10-16 17:48
2004.11.07
w3c или браузер


14-1097656240
Семен Сорокин
2004-10-13 12:30
2004.11.07
Пейнтбол


4-1096670108
GanibalLector
2004-10-02 02:35
2004.11.07
PortMon


14-1097805547
Думкин
2004-10-15 05:59
2004.11.07
С днем рождения! 15 октября





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский