Интерпретатор команд

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Интерпретатор команд

Сообщение Хакер » 24.08.2010 (Вт) 7:25

Всё не так. Это не описание. Это издевательски краткая отписка, не раскрывающая сути. Содержащая внутрениие противоречия. И не отвечающая на все поставленные вопросы.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

kuhtiov
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 419
Зарегистрирован: 03.08.2006 (Чт) 5:31

Re: Интерпретатор команд

Сообщение kuhtiov » 24.08.2010 (Вт) 7:33

Если бы я знал все ответы на эти вопросы, я бы не создавал этот топ. Я приблизительно представляю себе алгоритм, как я его себе представляю, я описал выше. Весь алгоритм до мелочей я описать не могу, т.к. не представляю их. Чтобы не переписывать код 100 раз, создал тут топ, чтобы знающие люди подсказали, как лучше реализовывать. Для того и пример просил.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Интерпретатор команд

Сообщение Хакер » 24.08.2010 (Вт) 7:56

Да как до тебя не дойдёт, от тебя требуется не описание алгоритма (за которым ты и пришёл), а описание языка. Описание языка. Описание языка. Описание языка, а не алгоритма, разбирающего этот язык. Не алгоритма, разбирающего язык, а самого языка. Языка. Думаю достаточно.

Мы понимаем, что ты не знаешь наилучшего алгоритма и способа для разбора языка. Но мы требуем, чтобы ты точно знал, что за язык ты придумал.

Ты описал язык, в котором перевод строки имеет декоративную функцию, а сам хочешь вытягивать из файла последовательности, ограниченные переводом строки. Это противоречие. Пока ты не объяснишь, какой из моментов — чушь (один из моментов обязательно чушь), нет смысла продолжать.

Давай, думай, либо перевод строки декоративен и ничего не знает, либо не декоративен, и что-то значит. Это первый момент, который обязательно должен быть определён. Это 1 % от всего числа моментов, которые должны быть строго определены. Но ты даже этот 1 % не определил. Понимаешь, как всё плачевно?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Re: Интерпретатор команд

Сообщение Денис » 24.08.2010 (Вт) 10:47

kuhtiov писал(а):Команда параметр,параметр;
где “,” – разделитель между параметрами
;” – разделитель команд.


Подредактирую свой пример (поскольку хороший интерпретатор, как мы выяснили на бейсике написать все равно не получится, я просто заменю в нем синтаксис и Split заменю на Mid$) и выложу после обеда.
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Интерпретатор команд

Сообщение Хакер » 24.08.2010 (Вт) 10:50

Денис писал(а):поскольку хороший интерпретатор, как мы выяснили на бейсике написать все равно не получится, я просто заменю в нем синтаксис и Split заменю на Mid$

Это ты выдумал. Мы такого не выясняли.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Re: Интерпретатор команд

Сообщение Денис » 24.08.2010 (Вт) 15:26

Да точно. Речь шла не о хорошем а о нормальном. Его можно написать, но только с использованием API. Вот об этом речь была, да.
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Интерпретатор команд

Сообщение Хакер » 24.08.2010 (Вт) 15:31

Можно без одной API, но не очень быстро.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Re: Интерпретатор команд

Сообщение Денис » 24.08.2010 (Вт) 16:00

Хакер писал(а):Left вообще не нужна в принципе, она генерирует копию подстроки, а копия никому не нужна.Split тоже генерирует копии и этим плох


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


Опиши мне пожалуйста алгоритм функции Split? Я уверен, ты знаешь. Просто мне кажется, предлагаемая тобой не хватающая функция очень похожа на Split. В плане того, что у себя внутри она наверняка находит все разделители, затем находит все позиции от и до. А в конце своей работы, согласно сформированным данным, формирует выходной массив.
Но поскольку, как ты говоришь, она делает это неоптимально (создавая множество копий исходной строки), то логичнее всего сделать свой Split, использующий только inStr и Mid$?
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

Samsonov
Новичок
Новичок
 
Сообщения: 30
Зарегистрирован: 22.04.2010 (Чт) 7:32
Откуда: DC

Re: Интерпретатор команд

Сообщение Samsonov » 24.08.2010 (Вт) 16:23

[Хакер] :: Постить сюда двухстраничный пост, полностью касающийся дотнета, а именно, рассказывающий об исследовании подробностей компилирования SelectCase-ов в MSIL в языках VB.NET и C# в этом разделе, посвящённом VB6, считается злостным оффтопиком. Удалено. Автору — предупреждение.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Интерпретатор команд

Сообщение Хакер » 24.08.2010 (Вт) 16:58

предлагаемая тобой не хватающая функция

Какая именно функция?

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

Последняя фраза относится ко всем известным мне языкам, кроме сверх-примитивных, вроде языка, еле-как описанного автором темы.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Интерпретатор команд

Сообщение Mikle » 24.08.2010 (Вт) 18:55

Хакер
Да как ты не поймешь, что 99% людей мыслят, и выражают свои мысли, точно так же, как kuhtiov. И ПРИХОДИТСЯ понимать их язык. Ему нужен пример, и не важно, будет перенос строки выполнять разделительную функцию, или только декоративную. Его УСТРОИТ любой вариант, лишь бы это был РАБОЧИЙ ПРИМЕР... Извини, не могу сдержаться. Хотя, конечно, похвально, что ты заставляешь людей думать.

Joo
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 762
Зарегистрирован: 14.08.2008 (Чт) 11:55
Откуда: Казахстан

Re: Интерпретатор команд

Сообщение Joo » 25.08.2010 (Ср) 4:45

Mikle писал(а):Хакер
Да как ты не поймешь, что 99% людей мыслят, и выражают свои мысли, точно так же, как kuhtiov

Самое интересное, что Хакер сам выражал так свои мысли, если не лень почитайте его первые посты. Там он и примерчики рабочего кода клянчит, и нестандартные контролы(коих он сейчас противник) просит и много еще интересного. После прочтения нескольких страниц его сообщений, я смотрю на его выпады на новичков с улыбкой.

Хакер, ты такой же как все и был точно таким же наивным новичком, помни это. Я не пойму почему ты стал такой озлобленный, в тех же первых постах видно, что там ты был нормальный человек. Вероятно тебя испортило постоянное сидение за компом.
"Им будет не просто, тем кто полагается на истину авторитета, вместо того чтобы полагаться на авторитет Истины"
Джеральд Месси, Египтолог

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Интерпретатор команд

Сообщение Хакер » 25.08.2010 (Ср) 8:53

Хакер, ты такой же как все и был точно таким же наивным новичком, помни это. Я не пойму почему ты стал такой озлобленный, в тех же первых постах видно, что там ты был нормальный человек.


Все когда-то были грудничками и какались в штаны. И ты точно так же делал это в своё время. Разве это означает, что, по хорошему, тебе стоит делать это и сейчас? :roll:
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Re: Интерпретатор команд

Сообщение Денис » 25.08.2010 (Ср) 9:38

Хакер писал(а):никто не назовёт адекватного разделителя, разделение с помощью которого улучшило бы ситуацию, а не ухудшило её


Мы сейчас говорим о разделителе между командами, я правильно понимаю? В этом смысле самым простым мыслится, что достаточно пробела, чтоб отделить команду и параметры, и запятой, чтоб отделить параметры друг от друга. Следующий пробел без запятой после параметра просто говорит о начале следующей команды. Кавычка говорит о том, что все читаемое до следующей кавычки, включая пробелы и запятые, является одним параметром. Стиль bat-файла, если ничего не путаю.
В бейсике остались пережитки прошлого, типа интера, завершающего команду и двоеточия, которое разделяет команды в одной строке. Но тут еще ввели костыль для раскидывания одной длинной строки на несколько, подчеркивание.
Возможно, дополнительный разделитель строк вносит ясность в формирование блоков кода. Тоесть, такой код не будет требовать признака конца блока if true then x=0[Enter], а такой код уже будет (пишу так как его будет видеть парсер): if true then[Enter]x=0[Enter]y=0[Enter]end if[Enter].
В общем, если допускать возможность использования блочных команд без признака конца блока (в VB) или признаков начала и конца блока (Pascal, C и др.), то признак конца строки (конца команды) ситуацию улучшает. А такое использование допускается.
Теперь попробуем привести пример псевдокода, использующего только пробелы и запятые:
Код: Выделить всё
private x as long
private y as long
private sub Main()
    dim i as long
    for i = 0 to 10
        if i mod 2 = 0 then
            x = i y = i +1
        end if
    next
end sub

Этот код можно без изменения функциональности выстроить в одну строку: private x as long private y as long private sub Main() dim i as long for i = 0 to 10 if i mod 2 = 0 then x = i y = i +1 end if next end sub.
При этом важно, чтобы парсер компилятора требовал обязательного закрытия блоков, например, требовал бы End If всегда.
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Интерпретатор команд

Сообщение Хакер » 25.08.2010 (Ср) 9:46

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

О любом разделителе, который улучшит ситуацию.

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

Т.е. вот, к примеру, если ты разделишь код на С++ разделителем «0», масимум, что ты получишь — это набор подстрок, разделённых нулём. Это никак не улучшает ситуацию. Сколько-нибудь улучшило бы ситуацию получения набора statement-ов.

Ни в C-подоюных языках (C, C++, Java, JavaScript, PHP и даже CSS), ни в VB, ни в BAT-файлах нельзя получить массив statement-ов просто поделив текст разделителем (CRLF или ";").

Да, даже bat-файлы нельзя делить с помощью CRLF, потому что ты получишь не последовательность bat-команд, а набор подстрок, о котором можно сказать только одно: это набор подстрок, разделённых «символом» CRLF.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

kuhtiov
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 419
Зарегистрирован: 03.08.2006 (Чт) 5:31

Re: Интерпретатор команд

Сообщение kuhtiov » 25.08.2010 (Ср) 9:55

Денис писал(а):
kuhtiov писал(а):Команда параметр,параметр;
где “,” – разделитель между параметрами
;” – разделитель команд.


Подредактирую свой пример (поскольку хороший интерпретатор, как мы выяснили на бейсике написать все равно не получится, я просто заменю в нем синтаксис и Split заменю на Mid$) и выложу после обеда.


Денис, а где обещанный пример? :)

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Re: Интерпретатор команд

Сообщение Денис » 25.08.2010 (Ср) 10:27

kuhtiov писал(а):Денис, а где обещанный пример?

На первой странице. В моем первом ответе. Чего еще тебе нужно? Готовый компилятор? Бабки плати! 15000 руб. И два месяца на разработку. У меня тарифы такие (Потому что я не программист).

Хакер писал(а):Улучшит ситуацию означает примерно следующее: после разделения получил набор подстрок о которых можно сказать: «это набор XXXX», где «XXXX» — всё что угодно, кроме «подстрок, полученных в результате разделения этим же разделителем».

Я понял! Это потому, что в коде несколько разделителей! Идеальный сплит должен на входе получать строку и коллекцию разделителей, использующихся в строке. Тогда мы получим массив как раз таки неделимых, атомарных элементов: ключевых слов, инструкций, операторов, параметров.
Алгоритм приблизительно такой:
Код: Выделить всё
Поставить курсор на первый символ.
Цикл:
искать разделители по списку до первого вхождения, начиная с текущей позиции курсора
определить наименьшую позицию с одним из разделителей
установить курсор в эту позицию
записать в массив подстроку от предыдущего курсора до текущего
конец цикла.
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Интерпретатор команд

Сообщение Хакер » 25.08.2010 (Ср) 10:38

Денис писал(а):Я понял! Это потому, что в коде несколько разделителей! Идеальный сплит должен на входе получать строку и коллекцию разделителей, использующихся в строке. Тогда мы получим массив как раз таки неделимых, атомарных элементов: ключевых слов, инструкций, операторов, параметров.


Ты правильно понял, такой сплит лучше, но он далеко не идеален и по прежнему плох.

В частности, если у тебя среди разделителей будет кавычка (чтобы выделить строки), то случаях before "foo ""word"" bar" after или before "foo \"word\" bar" after ты поучишь совершенно не тот результат.

Поэтому правильный подход: проходить строку слева направо так, что встреча какого-нибудь символа меняет логику дальнейшего следования строки. Встретил проходчик кавычку: и болььше не обращает ни на что внимания, кроме как на кавычку, перед которой нет бэкслэша или второй кавычки. Встретил опять кавычку, перед которой неш бэкслэша или другой кавычки, вернулся к начальной логике следования. Записал указатели на места, где он встретил первую и вторую кавычку.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

kuhtiov
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 419
Зарегистрирован: 03.08.2006 (Чт) 5:31

Re: Интерпретатор команд

Сообщение kuhtiov » 25.08.2010 (Ср) 10:43

Денис писал(а):На первой странице. В моем первом ответе. Чего еще тебе нужно? Готовый компилятор? Бабки плати! 15000 руб. И два месяца на разработку. У меня тарифы такие (Потому что я не программист).



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

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Re: Интерпретатор команд

Сообщение Денис » 25.08.2010 (Ср) 10:59

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

Итак мы подходим к самому главному: Идеальный сплит это уже даже не сплит, а наш простенький интерпретатор, которого так хочется автору. На входе этот интерпретатор получает:
• строку
• коллекцию простых разделителей
• коллекцию составных разделителей, блочных (включая начальный, конечный и описатель режима, в который переводится автомат в начале блока и описатель режима, в который следует вернуться в конце блока)
• коллекцию ключевых слов, операторов, в общем синтаксиса
Оно?
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Интерпретатор команд

Сообщение Хакер » 25.08.2010 (Ср) 11:11

Денис писал(а):• строку

Оно.

Денис писал(а):• коллекцию простых разделителей
• коллекцию составных разделителей, блочных (включая начальный, конечный и описатель режима, в который переводится автомат в начале блока и описатель режима, в который следует вернуться в конце блока)
• коллекцию ключевых слов, операторов, в общем синтаксиса

Не оно, очень холодно оно, не оно.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Re: Интерпретатор команд

Сообщение Денис » 25.08.2010 (Ср) 12:31

Хакер писал(а):Не оно

Но почему?
Откуда цикл, проходящийся по строке будет знать, что при встрече кавычки надо переключиться в другой режим (изменить логику сканирования строки)? У него явно должна быть либо константа, означающая кавычку, либо переменная, которую он получил бы при инициализации. Так же и по отношению к запятым и к vbCrLf.
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Интерпретатор команд

Сообщение Хакер » 25.08.2010 (Ср) 12:39

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


Потому что он так написан. Это вложено в него при создании создателем.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Re: Интерпретатор команд

Сообщение Денис » 25.08.2010 (Ср) 14:17

Хакер писал(а):Потому что он так написан. Это вложено в него при создании создателем.

А, ну да. Тогда значит, получаем вот что:
• на входе этот интерпретатор получает строку;
В него зашиты константы:
• коллекция простых разделителей;
• коллекция составных разделителей, блочных (включая начальный, конечный и описатель режима, в который переводится автомат в начале блока и описатель режима, в который следует вернуться в конце блока);
• коллекция ключевых слов, операторов, в общем синтаксиса;
Используя все это добро, интерпретатор сначала устанавливает себя в некий первоначальный режим, в котором он ищет первый оператор (из коллекции операторов, с которых следует начинать программу, включая признак комментария). Натыкаясь на символы перевода себя в другой режим, он либо переводит себя в этот режим, либо выдает ошибку синтаксиса, если такой символ не ожидался (например, прямо вначале написано "Hello, world!", это просто строковая константа, а программа еще даже не началась).
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Интерпретатор команд

Сообщение Хакер » 25.08.2010 (Ср) 14:24

Что-то я не понимаю, ты о чём?

Мы обсуждали эволюцию Сплит-функции.

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

Если же речь идёт о моих графах, то всё не так. Нет разделителей в привычном смысле этого слова, нет никакого деления разделителей на простые и (о, ужас) составные/блочные.

Нет коллекции ключевых слов и операторов. Есть графо-основанная быстрая коллекция ключевых слов, это да, но она существует отдельно от графа, о котором идёт речь.

З.Ы. Вот это я кстати наблюдаю во всех топиках по этой тематики: всех так и прёт вместо поэтапной обработки превлкать монстров, которые всё делают за раз.

З.Ы.Ы. Придумал, как на VB с помощью классов без единого внешнего API изобразить концепцию. Могу изобразить. Правда многие моменты искажаются и вообще без внеш. API получится по моим меркам очень медленно.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Re: Интерпретатор команд

Сообщение Денис » 25.08.2010 (Ср) 14:44

Хакер писал(а):Придумал, как на VB с помощью классов без единого внешнего API изобразить концепцию. Могу изобразить.

Это вопрос к автору топика. Мне бы не хотелось увидеть готовое решение, а прийти к нему самостоятельно.
Хакер писал(а):Мы обсуждали эволюцию Сплит-функции.Сейчас речь идёт об огромном монстре, который на вход получает полностью сырую строку, а на выходе даёт полностью обратотанные данные

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

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

Главный вопрос, чего я не могу понять: как без длинных портянок Case'ов организовать в дальнейшем сравнения? Ладно, допустим там нет сравнений вообще, а есть графы (я предпочитаю классическое советское название блок-схемы). Но тогда, все равно подстроки пришлось бы сравнивать!! У меня мозг кипит, как сравнивать не сравнивая?
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Интерпретатор команд

Сообщение Хакер » 25.08.2010 (Ср) 14:52

как без длинных портянок Case'ов организовать в дальнейшем сравнения?

О!!! :bom:

Сначала я стал писать всё с применениев Case-ов и goto, и вообще на ассемблере, но это был ад. Для нормального разборщика нужны сотни кейсов и goto, и нормальный человек ошибается на числе 50, и вообще получается гипер-спагетти-код. Так что я быстро отказался от идеи: делать разбирающий алгоритм вручную.

Поэтому-то и написан механизм, динамически формирующий «кейсы» (хотя их нет, на самом деле). Как бонус: обычные люди не могут в рантайме добавить в свой SelectCase новый Case, а я могу добавить добавить ребро в своём механизме.

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


Вот, блок-схемы, хорошо. Роутер — такой кирпичик блоксхемы. Кирпичик и ромбик в одном лице. В одной сущности. Видел ромбики от которых исходят стролочки «да»/«нет» к другим кирпичикам блоксхемы? Вот роутеры и есть такие кирпичики, только стрелочек от них отходит не 2, а сотни. Многие стрелочки ведут к одним и тем же кирпичиками, многие ведут на этот же самый кирпичик. Технология позволяет в рантайме строить и перестраивать такие блоксхемы, состоящие их большого числа кирпичиков, большого числа перехода, и малого количества типов кирпичиков. Иными словами, из практически однотипных кирпичиков строится большая блоксхема с большим числом переходов.

У меня мозг кипит, как сравнивать не сравнивая?

А разгадка проста: не нужно сравнивать вообще. Докажи мне обратное: докажи, что что-то (и расскажи что) нужно сравнивать с чем-то (и расскажи чем).
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Re: Интерпретатор команд

Сообщение Денис » 25.08.2010 (Ср) 15:36

Хакер писал(а):Докажи мне обратное: докажи, что что-то (и расскажи что) нужно сравнивать с чем-то (и расскажи чем).

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

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Интерпретатор команд

Сообщение Хакер » 25.08.2010 (Ср) 15:40

Уу... никто не сравнивает входные данные с хранящимися блоками блок-схемы.

Первый блок (селектор) встретит «О» и, если только один тип сущностей может начинаться на «О», то первый маршрутизатор (селектор) направит выполнение на другой маршрутизатор, который занимается обработкой этого типа сущностей. Вот в C-языках на O могут ещё и октальные числа начинаться. В этом случае первый маршрутизатор направит выполнение на другой маршрутизатор, который посмотрит на следующий символ, и либо направит выполнение в ветку, занимающуюся идентификаторами, либо в ветку — занимающуюся числами.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Re: Интерпретатор команд

Сообщение Денис » 25.08.2010 (Ср) 15:57

Хакер писал(а):если только один тип сущностей может начинаться на «О», то первый маршрутизатор (селектор) направит выполнение на другой маршрутизатор

Хакер писал(а):другой маршрутизатор, который посмотрит на следующий символ, и либо направит выполнение в ветку, занимающуюся идентификаторами, либо в ветку — занимающуюся числами

К направлению претензий нет. Я понимаю. Но, ведь "Если - то" это же и есть сравнение!! Как оно реализовано без if - then? А "либо - либо" это же самые что ни есть Case! Как они реализованы?
Я так полагаю, что эта технология у тебя либо на сях реализована, либо на асме, ты на это как мне кажется намекал выше, странице на второй, но этот вопрос не принципиален, он только скорость дает по сравнению с бейсиком, наверное.
Главное, что я пытаюсь, понять, допустим, маршрутизаторы сами занимаются построением сравнительных блоков, но, все-таки, какие-то сравнения в них самих должны же быть?
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

Пред.След.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot, Google-бот и гости: 99

    TopList