Компилятор регулярных выражений - PullRequest
11 голосов
/ 01 февраля 2009

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

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

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

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

Тогда я хотел бы задать вопрос: существует ли такая вещь, как компилятор регулярных выражений? Или можно даже построить?

Можно было бы рассматривать регулярные выражения с метафорической точки зрения как язык ассемблера - здесь есть некоторые сходства. Может ли быть разработан компилятор, который мог бы превратить более естественный язык - более высокий язык - в регулярные выражения? Затем в моем коде я мог определить свои регулярные выражения, используя язык более высокого уровня в заголовочном файле, и ссылаться на них при необходимости, используя символическую ссылку. Я и другие могли бы ссылаться из моего кода на файл заголовка и легче оценивать то, чего я пытаюсь достичь с помощью моих регулярных выражений.

Я знаю, что это можно сделать с логической точки зрения, иначе компьютеры были бы невозможны, но если бы вы зашли так далеко, то не могли бы вы потратить время на его реализацию?

Ответы [ 13 ]

0 голосов
/ 04 ноября 2009

Компилятор регулярных выражений:

FTP: //reports.stanford.edu/pub/cstr/reports/cs/tr/83/972/CS-TR-83-972.pdf

0 голосов
/ 04 марта 2009

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

Что-то, что вы не упоминаете в своем посте, но что почти так же плохо, это то, что почти каждый язык, редактор или инструмент имеют свои собственные вариации синтаксиса регулярных выражений. Некоторые из них поддерживают синтаксис POSIX, как он был определен много лет назад, некоторые поддерживают синтаксис Perl, как сегодня. Но у многих есть свои собственные независимые способы выражения вещей, или какие символы являются «специальными» (специальные символы - другая тема), а какие нет. Что сбежало, а что нет. И т. Д. Не только трудно прочитать регулярное выражение, написанное для одного языка или инструмента, но даже если вы полностью запомните правила синтаксиса для вашего любимого варианта, они могут сбить вас с толку на другом языке, где {2,3} больше не нужно означает то, что вы ожидаете. Это действительно беспорядок.

Кроме того, я думаю, что многие непрограммисты, которые (если бы они знали, что он существует), были бы рады иметь язык сопоставления с образцом, который они могли бы использовать в повседневных инструментах, таких как Google или Microsoft Word. Но для этого должен быть более простой синтаксис.

Итак, чтобы ответить на ваш вопрос, я часто думал о создании какой-нибудь кроссплатформенной, кросс-языковой, кросс-универсальной библиотеки, которая позволила бы вам «переводить» из любого синтаксиса регулярных выражений (будь то Perl или POSIX). или Emacs и т. д.) в любой другой синтаксис регулярных выражений. Чтобы вам не пришлось беспокоиться о том, может ли регулярное выражение Python выполнять отрицательный просмотр, или если скобки класса символов следует экранировать в регулярном выражении Emacs. Вы можете просто запомнить один синтаксис, а затем выполнить вызов функции, чтобы получить эквивалентный синтаксис для всего, что вы использовали.

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

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

0 голосов
/ 01 февраля 2009

Рассматривали ли вы использование генератора синтаксического анализатора (он же компилятор компилятора), например ANTLR ?

ANTLR также имеет некоторую IDE ( ANTLR Works ), где вы можете визуализировать / отлаживать парсеры.

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

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

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