2 Николас: проблемы RegExp-ов и слово --

Обсуждение программ nnCron и nnCron LITE

2 Николас: проблемы RegExp-ов и слово --

Postby Tez » Tue, 17 May 2005, 04:07

Открываю я страничку в FILE. Она всего 88 KB, вообще куда больше бывает (форумы, новостные,..). Ищу в ней c RE-MATCH – всё ок. Даю опцию s чтобы переводы строк игнорировать - переполнение стека. С s всегда.
Со страницей в 22 KB размером – опция s работает.

Также, RegExp-ы не определяют русские заглавные буквы (\u* \w* .*). [\x192-\x255]* находит, но вывести найденное $0 не может. Без повторения (+) только . (точка) находит одну буковку (S” ПРОВЕРКА” S” /……../” RE-MATCH . $0 TYPE – работает!).
Если в страничке есть хоть одна русская заглавная буква, приходится что-то придумывать.

.*\n.*..* не спасает, видимо в заглавной странице русского форума по nnCron что-то ещё аномальное кроме переводов строк и заглавных букв. Или алгоритм RegExp не предусматривает таких извращений: .*. :)

Один раз, я поставил в скобки что-то вроде: .*\n*\t* и проц перегрузился, совсем… Я с минуту подождал.., но RE-MATCH ничего не нашёл, тогда просто завершил работу службы; ошибок не было.

Это я пытался разобрать HTML в RegExp без опции s. Hо я уже решил обойти это сильно обрезая HTML. Просто решил дать тебе знать о приколах с RegExp-ами.


Сейчас я пытаюсь понять что-же за слово такое: --
Есть в re.f такой код:
Code: Select all
0
1  CELLS -- re_re
16 CELLS -- re_s
16 CELLS -- re_e
1  CELLS -- re_cnt
1  CELLS -- re_last_res
1  CELLS -- re_text
1  CELLS -- re_pat
1  CELLS -- re_last_beg
CONSTANT /RE

: RE-RES? ( ? -- ? ) DUP IF DROP RE re_e @ RE re_s @ - 0<> THEN ;

: RE-START ( text u1 re u2 -- ?)
    RE
    IF
        RE re_pat @ FREE DROP
        RE re_text @ FREE DROP
        RE /RE ERASE
    ELSE
        /RE ALLOCATE THROW RE-H !
    THEN
    S>ZALLOC RE re_pat !
    S>ZALLOC RE re_text !
    re_load
    RE re_start ( RE-RES?) ;
В консоли -- выглядит как крутая головоломка (вот он Форт!). С компиляцией я тоже ничего не добился.
Вопросы:
1. А чего делают re_* слова объявленные словом -- ?
Я сначала думал сдвиг делают, но оказалось нет. А "адрес" что они оставляют нечитабельный.
2. Пляшу я вокруг RegExp-ов потому, что хочу сделать слово с серьёзным их использованием. Надеюсь получить преимущество от более низкоуровневых слов.
Только вот не очень ли это опасно в виду возможных модификаций алгоритма RE-MATCH в будущем?

Когда сегодня всё перерывал из-за этих регэкспов, обнаружил совсем нечитанного Тарасова! Вот от туда для участников форума:

Язык программирования Форт (Forth) появился в 1970 г. благодаря работам Чарльза Мура. К моменту создания первого транслятора Форта уже существовали языки программирования третьего поколения, к которым относятся, в частности, Си и Паскаль. Язык, разработанный Муром, настолько отличался от них, что был отнесен к языкам программирования четвертого поколения, или Fourth generation level. Однако компьютер, использовавшийся для создания первого транслятора, допускал максимум пять символов в обозначениях, поэтому название Fourth («четвертый») было сокращено до Forth.
<…>
Вокруг Форта постоянно разворачивается масса дискуссий, призванных выяснить, чем же он является на самом деле: интерпретатором, компилятором, языком программирования или операционной средой, языком высокого или низкого уровня. Действительно, весьма неординарные правила программирования на этом языке, фактическая открытость архитектуры транслятора, простота модификации правил построения машинного кода и непривычная стековая архитектура затрудняют оценку Форта с позиций традиционной методологии программирования. Кроме того, чрезвычайно низкая трудоемкость разработки трансляторов Форта делает его невыгодным для поддержки крупными фирмами. Кроме того, что цикл разработки полноценного транслятора занимает всего лишь несколько человеко-месяцев, получаемый таким образом программный продукт легко доступен для модификации прикладными программистами, что затрудняет сопровождение языка фирмой-разработчиком. В результате программирование на Форте в настоящее время является уделом небольших групп энтузиастов, которые, разумеется, не могут обеспечить необходимый для быстрого развития языка объем прикладных библиотек, методических разработок, специальной литературы и пр.

А я то голову ломал, почему им все не пользуются.
Tez
 
Posts: 205
Joined: Mon, 23 Aug 2004, 09:17
Location: Moscow

Re: 2 Николас: проблемы RegExp-ов и слово --

Postby Nicholas_Nemtsev » Tue, 17 May 2005, 10:07

Tez wrote:Открываю я страничку в FILE. Она всего 88 KB, вообще куда больше бывает (форумы, новостные,..). Ищу в ней c RE-MATCH – всё ок. Даю опцию s чтобы переводы строк игнорировать - переполнение стека. С s всегда.
Со страницей в 22 KB размером – опция s работает.

Также, RegExp-ы не определяют русские заглавные буквы (\u* \w* .*). [\x192-\x255]* находит, но вывести найденное $0 не может. Без повторения (+) только . (точка) находит одну буковку (S” ПРОВЕРКА” S” /……../” RE-MATCH . $0 TYPE – работает!).
Если в страничке есть хоть одна русская заглавная буква, приходится что-то придумывать.
...

Что касается регеэкспов, то я использую реализацию из старого уже колорера в виде dll. Со всеми его органичениями (возможно, и сам чего-то добавил).
Много ссылок на разные реализации регекспов находится здесь:
http://wiki.forth.org.ru/RegExp
Я советую обратить внимание на
http://www.hi-ho.ne.jp/babaq/eng/bregexp.html
Tez wrote:Сейчас я пытаюсь понять что-же за слово такое: --
...
В консоли -- выглядит как крутая головоломка (вот он Форт!). С компиляцией я тоже ничего не добился.

Это простое и огромной мощи слово. Если говорить в терминах паскаля, то для создания записей (RECORD), в терминах C - структур (struct). Делает оно следующее: берет второе число со стека (текущее смещение) и компилирует слово с указанным именем (о действии которого расскажу позже) и добавляет к текущему смещению число лежащее не стеке (размер элемента структуры). Созданное слово при выполнении добавляет это число (смещение) к указанному на стеке адресу, т.е. перед выполнением слова мы кладём на стек начальный адрес структуры, а после выполнения получаем адрес элемента структуры.
Tez wrote:Вопросы:
1. А чего делают re_* слова объявленные словом -- ?
Я сначала думал сдвиг делают, но оказалось нет. А "адрес" что они оставляют нечитабельный.

Это элементы структуры.
Tez wrote:2. Пляшу я вокруг RegExp-ов потому, что хочу сделать слово с серьёзным их использованием. Надеюсь получить преимущество от более низкоуровневых слов.
Только вот не очень ли это опасно в виду возможных модификаций алгоритма RE-MATCH в будущем?

Опасно. В будущем, возможно, регекспы будут полностью переписаны.
Nicholas Nemtsev
User avatar
Nicholas_Nemtsev
Site Admin
 
Posts: 857
Joined: Thu, 01 Jul 2004, 22:25
Location: Псков

Postby Hermit0H » Fri, 08 Jul 2005, 11:52

#( Test1
WatchHotKey: "$b"
Action:
S" 1234567890987654321" S" /(345|543)/g" RE-ALL
THINT: "%$1% %$2% %$3%" 15
;RE-ALL
)#


#( Test1
WatchHotKey: "$b"
Action:
S" 1234567890987654321" S" /(345|543)/" RE-MATCH
IF
THINT: "%$1% %$2% %$3%" 15
THEN
)#

а так же регэкспы вида (?=345|543) (?:345|543) тоже не работают.
Hermit0H
 
Posts: 5
Joined: Wed, 06 Jul 2005, 12:06

Postby marc_2006 » Sun, 13 May 2007, 15:42

Что-то я никак не въеду в тему RegExp-ов.

Беру пример применения RegExp-ов из темы "HTML..", делаю такую задачу:
Code: Select all
#( test_read_from_file2
USER-VALUE list-file
USER-VALUE list-contents
10240 CONSTANT max-line-size
VARIABLE position

NoActive
Action:

max-line-size ALLOCATE THROW TO list-contents
S" E:\nnCron\test.htm" R/O OPEN-FILE-SHARED THROW TO list-file
BEGIN list-contents max-line-size 2- list-file READ-LINE THROW WHILE
list-contents + 0 SWAP C!
    MSG: "%list-contents ASCIIZ>%"
    REPEAT
    DROP
    list-file CLOSE-FILE DROP
    list-file FREE DROP

\ Теперь надо  найти вхождение паттерна <a href="/ru/author" в
\ прочитанной строке

list-contents COUNT S" /\<a href=.\/ru\/author/" RE-MATCH
IF
MSG: "Значение $0 = %$0% и значение: $1 = %$1%"
THEN
 
)#


При запуске задачи первый MSG нормально выводит считанное содержимое файла. И все на этом заканчивается... Где тут собака порылась?
marc_2006
 
Posts: 13
Joined: Fri, 26 Jan 2007, 07:19

Postby marc_2006 » Tue, 15 May 2007, 20:19

С предыдущим вопросом, после "танцев с бубном вокруг компа", вроде разобрался. Почему вроде? А вот почему.

Есть файл html, который скрипт парсит на предмет определенных ссылок. Ну так вот, поскольку этот файл очень большой, то скрипт отлаживал на отрывках из большого файла, скопированных в отдельный файл. В тестовом прогоне, в котором скрипт был напущен на файл, на 90% состоящий из материала оригинального, скрипт все отловил на отлично. Но будучи напущенным на оригинальный файл он вообще ни одной ссылки не нашёл. По тем тестам, который я провёл, понятно, что в данном случае имеется проблема в работе регэкспа, ориентирующегося на конец строки ($). В обоих случаях в строках, разбираемых регэкспом присутствовал фрагмент, совпадающий с поисковым фрагментом, но только в одном фрагмент был опознан.

В связи с этим вопрос по регэкспу: по каким именно критериям регэксп определяет конец строки?
marc_2006
 
Posts: 13
Joined: Fri, 26 Jan 2007, 07:19

Postby ANR Daemon » Fri, 25 May 2007, 02:49

Напиши, что ты хочешь поймать регэкспом - скажу, как это сделать.
ANR Daemon
 
Posts: 234
Joined: Mon, 26 Feb 2007, 22:59


Return to nnCron forum (Russian)

Who is online

Users browsing this forum: No registered users and 3 guests

cron