Форум: "Основная";
Текущий архив: 2004.11.07;
Скачать: [xml.tar.bz2];
ВнизИнтерпритатор языка или что-то в этом роде. Найти похожие ветки
← →
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 и ни один анализатор кода (без интерпретации) не сможет установить вызов вирусоопасной функции получения списка списков.
Страницы: 1 2 3 вся ветка
Форум: "Основная";
Текущий архив: 2004.11.07;
Скачать: [xml.tar.bz2];
Память: 0.75 MB
Время: 0.045 c