Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Чт апр 25, 2024 09:46

...
Google Search
Forth-FAQ Spy Grafic

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 29 ]  На страницу 1, 2  След.

Векторизировать в ядре SPF
Надо 50%  50%  [ 3 ]
И так сойдет 33%  33%  [ 2 ]
Другой вариант 17%  17%  [ 1 ]
Всего голосов : 6
Автор Сообщение
 Заголовок сообщения: Кто как смотрит на векторизацию IsDelimiter ?
СообщениеДобавлено: Чт ноя 22, 2007 17:46 
Вроде слово предназначено для определения что в тексте есть разделитель, а на самом деле делит все символы на две части не позволяя никаких вольностей.
Что часто приводит к чесанию репы когда о вполне себе пробел (0xFF :shuffle; ) транслятор спотыкается. Не говоря уже о необходимости разных ухищрений при разборе хитрого синтаксиса.


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт ноя 22, 2007 18:19 
Сейчас
Код:
: IsDelimiter ( char -- flag )
  BL 1+ <
;


Мне, например, хотелось бы
Код:
VECT IsDelimiter                   \  или USER-VECT IsDelimiter 
: IsDelimiter1 ( char -- flag )
  BL 1+ <
;

' IsDelimiter1 (TO) IsDelimiter


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт ноя 22, 2007 18:42 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
ArtemKAD писал(а):
Вроде слово предназначено для определения что в тексте есть разделитель, а на самом деле делит все символы на две части не позволяя никаких вольностей.

Сделано в строгом соответствии с ANSI - что тут скажешь.

_________________
С уважением, chess


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт ноя 22, 2007 19:01 
IsDelimiter в ANSI нет.
Там вообще правила поиска разделителей отданы на усмотрение реализации. Т.е. речь идет о разделителях как таковых, но нет указания которые они. Явно там упоминается только пробел и то не как обязательный.


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт ноя 22, 2007 19:10 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
ArtemKAD писал(а):
IsDelimiter в ANSI нет.

Причем здесь IsDelimiter. Разделитель по ANSI это ascii-символ с кодом меньшим чем 33.

_________________
С уважением, chess


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт ноя 22, 2007 19:25 
Нет, не совсем так.
Там есть определение "управляющие символы". Управляющие символы там все, которые не принадлежат 33...127. Т.е. в т.ч. и русские буквы.

Но не обязательно не графические символы это разделители.
Разделители описаны в разделе 3.4.1.1 и правила их определения отданы на откуп реализации. Хотя и явно указано, что если BL=hex20, то разделителями МОГУТ быть одновременно и управляющие символы (см. выше)...


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт ноя 22, 2007 19:52 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
а так не проще?
http://spf.cvs.sourceforge.net/spf/deve ... iew=markup

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

Delimiter: разделители 3A 3B 5B 5D

слово Delimiter: создаст слово "разделители" в которое войдут все 16ричные константы указанные до конца строки.
дальше используем связку: разделители xWord

Код:
    Delimiter: proba 3A 3B 5B 5D
   
    : test BEGIN proba xWord DUP WHILE
                 CR ." лексема: " TYPE
                    8 SPACES ." разделитель: "
                    PeekChar EMIT
                    >IN 1+!
           REPEAT 2DROP CR ;
   
    test as[asdasd]dasdv;vkjjl:vlkj;l

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт ноя 22, 2007 21:35 
mOleg писал(а):
а так не проще?

Нет, совсем не проще. Тут по сути делается свой транслятор. Я и сам так делал, но каждый раз изобретать велосипед достало. :(
ЗЫ. Твой способ проверки по списку разделителей вполне ложиться на векторизированный IsDelimiter. Даже реализация станет проще. Ведь все равно он проходит один раз по разбираемой строке. На кой потом еще раз по ней-же проходить?


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт ноя 22, 2007 22:15 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
ArtemKAD писал(а):
Нет, совсем не проще. Тут по сути делается свой транслятор.

сделан 8) то есть уже готов.
ArtemKAD писал(а):
Твой способ проверки по списку разделителей вполне ложиться на векторизированный IsDelimiter.
да, в принципе ложится, но так немного быстрее.

ArtemKAD писал(а):
Ведь все равно он проходит один раз по разбираемой строке. На кой потом еще раз по ней-же проходить?

а где ты видишь двойной проход по строке?

на самом деле все просто. Для каждого случая своя табличка разделителей, в примере 'proba', ты подсовываешь табличку - получаещь слово, ограниченное одним из разделителей.

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт ноя 22, 2007 23:05 
mOleg писал(а):
а где ты видишь двойной проход по строке?

Будет :) .
На самом деле естественно, когда есть слово которое потом разбирает последующую абракадабру двойного прохода нет. Но при этом нет и всех инструментов исходного транслятора. Т.е. строку-то разобрали а че с кусками потом делать? Кроме того - а первый пробел если он не пробел (сразу после test) чем ловить?
mOleg писал(а):
на самом деле все просто. Для каждого случая своя табличка разделителей, в примере 'proba', ты подсовываешь табличку - получаещь слово, ограниченное одним из разделителей.


Да это я понял и даже испытал. Хотя когда ограничителей становится слишком много длинные строки приходится писать...

Да, я бы делал Delimiter: немного иначе

Код:
: Delimiter: ( | xC xC xC EOL --> )
             CREATE HERE DUP 256 DUP ALLOT ERASE +delimiters
             DOES> + C@ 0xFF = ;


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт ноя 22, 2007 23:28 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
ArtemKAD писал(а):
На самом деле естественно, когда есть слово которое потом разбирает последующую абракадабру двойного прохода нет. Но при этом нет и всех инструментов исходного транслятора. Т.е. строку-то разобрали а че с кусками потом делать? Кроме того - а первый пробел если он не пробел (сразу после test) чем ловить?

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

ArtemKAD писал(а):
mOleg писал(а):на самом деле все просто. Для каждого случая своя табличка разделителей, в примере 'proba', ты подсовываешь табличку - получаещь слово, ограниченное одним из разделителей.

Да это я понял и даже испытал. Хотя когда ограничителей становится слишком много длинные строки приходится писать...

это смотря какие разделители. С другой стороны, если заранее известно, что не будет неотображаемых разделителей, то можно просто подсовывать строку, или, как вариант, можно скомбинировать данную либу с
http://spf.cvs.sourceforge.net/spf/deve ... iew=markup
и с немного другим синтаксисом получить что-то такое:

s" ()[]{},.+-= .... \013\t\n\r" DELIMITERS: proba
будет удобнее и короче одновременно 8)

ArtemKAD писал(а):
Да, я бы делал Delimiter: немного иначе

Код:

: Delimiter: ( | xC xC xC EOL --> )
             CREATE HERE DUP 256 DUP ALLOT ERASE +delimiters
             DOES> + C@ 0xFF = ;

можно и так, но вроде более удобный вариант я только что описал 8)

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт ноя 23, 2007 00:25 
mOleg писал(а):
ArtemKAD писал(а):
На самом деле естественно, когда есть слово которое потом разбирает последующую абракадабру двойного прохода нет. Но при этом нет и всех инструментов исходного транслятора. Т.е. строку-то разобрали а че с кусками потом делать? Кроме того - а первый пробел если он не пробел (сразу после test) чем ловить?

а не проблема, ведь test - это пример, а не реальный код.
В реальном коде просто даешь адрес начала буфера и все.

Куда задаешь адрес начала буфера? xWord у тебя работает только с текущим входным потоком. Причем работает вместо основного транслятора чем провоцирует дальнейший вопрос - "че делать с разобранным?".
А если векторизировать IsDelimiter , то разобранное основным транслятором (с учетом разделитилей) будет исполнено или отпавлено NOTFOUND на дожевывание.

mOleg писал(а):
К тому же обрати внимание, что значение разделителя легко получается.

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


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт ноя 23, 2007 00:49 
Т.е. с векторизированным IsDelimiter выглядеть будет примерно так:
Код:
: Delimiter: ( | xC xC xC EOL --> )
             CREATE HERE DUP 256 DUP ALLOT ERASE +delimiters
             DOES> + C@ 0xFF = ;

Delimiter: delimit 20 3A 3B 5B 5D

` delimit TO IsDelimiter

И далее основной транслятор будет разбирать уже совершенно другой синтаксис...


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт ноя 23, 2007 01:15 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
ArtemKAD писал(а):
Куда задаешь адрес начала буфера?

как вариант так:
2>R SAVE-SOURCE SOURCE! .... RESTORE-SOURCE

ArtemKAD писал(а):
xWord у тебя работает только с текущим входным потоком.

это логично, не правда ли 8)

ArtemKAD писал(а):
Причем работает вместо основного транслятора чем провоцирует дальнейший вопрос - "че делать с разобранным?".

в смысле? разобранное уже не нужно, его DROP

ArtemKAD писал(а):
А если векторизировать IsDelimiter , то разобранное основным транслятором (с учетом разделитилей) будет исполнено или отпавлено NOTFOUND на дожевывание.

мой набросок парсера http://fforum.winglion.ru/viewtopic.php ... highlight=
с меньшей зависимостью от TIB, впрочем, оно в развитии.

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

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт ноя 23, 2007 01:17 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
ArtemKAD писал(а):
И далее основной транслятор будет разбирать уже совершенно другой синтаксис...

это то и настораживает, так как в случае ошибки можно "сесть мимо стула".

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 29 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа [ Летнее время ]


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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 26


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

cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
phpBB сборка от FladeX // Русская поддержка phpBB