Главная страница
    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 архива вытаскивать.



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

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

Наверх




Память: 0.74 MB
Время: 0.041 c
3-1097127825
ligor
2004-10-07 09:43
2004.11.07
XML->БД


3-1097164914
GanibalLector
2004-10-07 20:01
2004.11.07
BLOB в UDF


1-1098742503
Змей
2004-10-26 02:15
2004.11.07
Showmessage()


3-1097069082
Max Ivanych
2004-10-06 17:24
2004.11.07
Фильтр для таблицы Access


1-1098469078
Grundic
2004-10-22 22:17
2004.11.07
Кодирование "без нуля" - как оптимальнее?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский