Релиз расширенного движка регулярных выражений - альфа-2

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

Релиз расширенного движка регулярных выражений - альфа-2

Postby VoidVolker » Sat, 20 Feb 2016, 13:03

Расширенный движок представляет из себя dll библиотеку-обертку для .Net класса Regex написанную на C# оформленную в виде обычного плагина для ннкрон.
Специально для тех, кому мало встроенных регулярных выражений данный плагин реализует 178 функций: многие из, конечно же, них дублируют друг друга и по факту основных функций тут всего лишь четыре - isMatch, Match, Replace, Split.
Ссылка: https://github.com/nnCron/dotnet-regex

Сам плагин еще в разработке - т.к. надо прежде всего понять как удобнее всего использовать данные функции и как передавать им опции, коллбэки и прочее. На данный момент плагин представляет из себя по сути просто импорт функций из библиотеки - и в таком виде совершенно не юзабельно. Поэтому хочу услышать предложения и варианты как именно это все могло бы выглядеть в удобной форме.

И несколько слов о том, что там внутри. Основная проблема в том, что в C# есть автоматическая сборка мусора и все строки/объекты автоматически собираются и уничтожаются. А в ннКроне за управление ресурсами отвечает программист. И тут есть два решения:
1) Копирование объекта/строки в неуправляемую память в C# и отдавать ннкрону - при этом надо будет потом руками вызвать дополнительную функцию для освобождения памяти;
2) Передача в функцию C# коллбэка (слово) из ннкрона и передача этому слову объекта для обработки.
На данный момент поддерживаются оба варианта. Есть еще третий вариант - в коллбэке можно копировать строку средствами ннкрона и работать с ней привычным способом.
Проблема два: возврат данных из C# функций - где-то есть ошибка. Но все void функции возвращают мусор (логичнее всего заменить на флаг - успешно или нет). Еще передача объекта через возврат вызывает переполнение стека в C#. Единственное рабочее решение, которое удалось найти - размещать объекты внутри объекта-обертки и передавать его через переменную типа out (адрес, VARIABLE).
Еще один важный момент: в C# все строки - это UTF16BE. Поэтому некоторые функции, которые принимают на вход строки или возвращают строки имеют суффикс U, T, A. U = unicode, T = кодировка зависит от платформы, A - ANSI. Поэтому рекомендуется сразу в ннкроне конвертировать строки в юникод.

Приветствуются пулл-реквесты, особенно на документацию: большей частью копи-паст из МСДН. Планируется два раздела: документация для DLL и отдельно для плагина.

Так же, данный плагин открывает возможность использования любого функционала из .NET.

Простой пример:
Code: Select all
VARIABLE match
: forCapture   \ ( group -- )
    Capture.Value 16 DUMP CR
; ' forCapture WNDPROC: forCaptureCb

: forGroup   \ ( group -- )
    ['] forCaptureCb SWAP Group.Captures.For
; ' forGroup WNDPROC: forGroupCb


Z" (\d)*(\D)*" Z" 1234qwer" match MatchA DROP
match @ Match.Success . CR
' forGroupCb match @ Match.Groups.For DROP
match @ Match.Free DROP

Результат:
Code: Select all
88C4E0   31 32 33 34  71 77 65 72  00 00 00 00  00 00 00 00 1234qwer........

897710   31 00 00 00  00 00 00 00  AC 84 BE 06  00 00 00 80 1.......┐"_...._

897720   32 00 00 00  09 00 00 00  AA 84 BE 06  F8 C6 00 80 2.......Є"_.шЖ._

897730   33 00 00 50  1E 02 00 06  A8 84 BE 06  00 00 00 80 3..P....Ё"_...._

897740   34 00 00 00  90 5F 7E 00  A6 84 BE 06  00 00 00 80 4...__~.│"_...._

897750   71 00 00 00  0A 00 00 00  A4 84 BE 06  B0 C5 00 80 q.......¤"_.°Е._

897760   77 00 00 50  C1 4E 00 06  A2 84 BE 06  00 00 00 80 w..PБN..ў"_...._

897770   65 00 00 00  10 60 7E 00  A0 84 BE 06  00 00 00 80 e....`~. "_...._

897780   72 00 00 00  00 00 00 00  BE 84 BE 06  00 00 00 80 r......._"_...._
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Альфа релиз расширенного движка регулярных выражений

Postby VoidVolker » Sat, 20 Feb 2016, 17:34

Добавил поддержку распознавания паттернов:
Code: Select all
/pattern/ VALUE re1
/pattern/imnsxrec VALUE re2

Code: Select all
    i = IgnoreCase
    m = Multiline
    n = ExplicitCapture
    s = Singleline
    x = IgnorePatternWhitespace
    r = RightToLeft
    e = ECMAScript
    c = CultureInvariant

И потом можно сразу компилировать регулярное выражение. И добавил еще несколько слов.
И далее что-то типа такого:
Code: Select all
S" source string" re1 reForMatches(
    <полезный код>
)reForMatches

Или, если более одного раза не нужно:
Code: Select all
S" source string" /pattern/ reForMatches(
    <полезный код>
)reForMatches


В целом, достаточно разумной видится следующая концепция:
1) Компилируем паттерн в регулярное выражение при запуске приложения и сохраняем в переменную, если надо;
2) Применяем какой-либо метод скомпилированного регулярного выражения к строке;
3) Обрабатываем результат.
Само собой, будет возможность скомпилировать регулярное выражение в рантайме и применить его. И вероятно, имеет смысл сделать "ленивый" вариант: при запуске паттерн сохраняется как строковый литерал, а регулярное выражение компилируется при первом запуске.
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Релиз расширенного движка регулярных выражений - альфа-2

Postby VoidVolker » Tue, 23 Feb 2016, 23:33

Добавлено слово ReIsMatch. Пример:
Code: Select all
S" 1234qwer" /(\d)*(\D)*/ ReIsMatch . CR
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Альфа релиз расширенного движка регулярных выражений

Postby ANR Daemon » Tue, 26 Apr 2016, 03:56

VoidVolker wrote:В целом, достаточно разумной видится следующая концепция:

В общем-то все нормальные люди именно так и делают.
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 5 guests

cron