LINUX.ORG.RU

grex 1.4.0 — генератор регулярных выражений

 , ,

grex 1.4.0 — генератор регулярных выражений

2

2

Обновилась утилита для создания регулярных выражений — grex 1.4.0. В новой версии исправлены ошибки, обновлена поддержка Unicode 14, крупным изменением стала возможность компиляции в WebAssembly и теперь grex можно использовать в браузере и Node.js (автор собрал NPM-пакет).

Посмотреть работу grex без установки можно на демо-странице: https://pemistahl.github.io/grex-js/

>>> Подробности

★★★★★

Проверено: hobbit ()
Последнее исправление: hobbit (всего исправлений: 2)

Ответ на: комментарий от loz

инновационные

Не вижу ничего плохого в том, чтобы взять хорошую вещь у кого-то другого :-)

по количеству аргументов

Для меня это выглядит хрупко.

Вопросы:

1. Я могу как-то записать эти вызовы так, чтобы количество аргументов там было прописано явно? Ну то есть расставить скобки, хотя они и не нужны?

2. Как сделано взаимодействие функций и операторов? Допустим, я хочу записать как-то так:

digit: non-zero | charset "0"

3. Как сделано взаимодействие функций и списков (или массивов)? Допустим есть

ipv4: [byte dot byte dot byte dot byte]

Допустим я хочу последний байт поменять на что-то другое, non_zero_byte скажем, но позарез не хочу писать

non_zero_byte: first_but_not_second byte "0"
ipv4: [byte dot byte dot byte dot non_zero_byte]

а хочу заинлайнить, как-то так:

ipv4: [byte dot byte dot byte dot first_but_not_second(byte,"0")]

а еще лучше с оператором \ как-то так:

ipv4: [byte dot byte dot byte dot (byte \ "0")]

Как это будет выглядеть на ред?

a--
()
Последнее исправление: a-- (всего исправлений: 1)
Ответ на: комментарий от a--

Надо прояснить несколько вещей чтобы понять как с этим работать :)

Ну то есть расставить скобки, хотя они и не нужны?

Да, в целом можно ставить скобки чтобы наверняка.

Как сделано взаимодействие функций и операторов? Допустим, я хочу записать как-то так:

digit: non-zero | charset «0»

Тут нет операторов в общем смысле, в изначальном примере есть только charset значения, вот эта штука

byte: [
  "25" half
| "2" four digit
| "1" digit digit
| non-zero digit
| digit
]

лишь создает «блок» данных, типа массив с разными элементами, строками и словами в терминологии red типа | и half:

>> byte/1
== "25"
>> byte/2
== half
>> byte/3
== |

Можно смотреть на это как на набор данных, внутри блока по-умолчанию ничего не вычисляется. А в конце функция parse разбирает эти данные на основе правил типа PEG и выполняет матчинг. Так что твой приведенный код можно записать так:

digit: compose [non-zero | (charset "0")]

Что создаст «правило» digit, compose это функция которая принимает блок и выполняет код внутри круглых скобочек. Собственно так и можно остальные примеры «заинлайнить».

То есть по-сути весь код на red это набор блоков, и они передаются некому вычислителю который решает что с ними сделать.

Например создание функции: z: func [x y] [x + y] это функция которая принимает 2 блока: аргументы и тело и создает из них внутреннее представление которое может вызываться. Таким образом язык полностью состоит из DSL и делает их создание супер простым.

Если знаком с лиспом то это как будто если бы каждый список по-умолчанию был заквочен.

loz ★★★★★
()
Последнее исправление: loz (всего исправлений: 5)
Ответ на: комментарий от loz

compose

Сразу вопросы:

1. А что, parse не озаботится вызвать compose, так что compose мне нужно вставлять самому?

2. Строчку

digit:    union non-zero charset "0"
лучше перепиши ты со вставкой всех скобочек, так как априори может по-разному это быть (в стиле S-expr или R-expr)

Если знаком с лиспом то это как будто если бы каждый список по-умолчанию был заквочен.

Да, знаком до некоторой степени.

a--
()
Последнее исправление: a-- (всего исправлений: 2)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.