Как я должен реорганизовать этот алгоритм обращения регулярных выражений, чтобы позволить повторять классы символов? - PullRequest
1 голос
/ 08 декабря 2010

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

Например, при реверсировании \d{3} сначала выбирается число, а затем повторяется то же число 3 раза.Я хотел бы выбрать 3 разных числа.

Я думаю, что самый простой способ решить эту проблему - вставить \d в список токенов и оценить его после квантификатора,а не раньше.

Это все прекрасно, но как насчет разбора таких вещей, как (a(b)){2}|(c)\3.Если предположить, что я придерживаюсь стратегии «оценить позже», это будет разбито на «(a(b)), (a(b)) или (c), \3».Что на самом деле приводит к нескольким проблемам.Я не могу просто обработать (a(b)) как целый блок и повторить его, мне действительно нужно оценить его как-то раньше \3, чтобы я мог сосчитать пронумерованные ссылки (ab - это \1, b - * \2, а c - это \3).

Другая проблема в том, что если я на самом деле повторю такие строки, (a(b)), (a(b)) дважды ... тогда, когда я перейду к числуэто, это будет двойной счет, так как я потерял информацию о квантификаторе.Если я не храню список строк, а скорее более сложную структуру, которая указывает, был ли он подсчитан или нет.Это, или я немедленно добавляю это в список обратных ссылок ... но если я помещу это в неоцененный, это должно будет быть оценено дважды, что не будет работать, поэтому я должен буду оценить это прежде, чем поместить это всписок обратных ссылок ...

Но тогда, если у меня есть что-то вроде (a|b){2}\1 думаю \1 относится к последнему захвату.Поэтому я не могу сразу оценить (a|b), а затем выбросить результат в список обратных ссылок, потому что он может быть определен количественно ... Возможно, я могу оценить его сразу после количественного определения.

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

1 Ответ

1 голос
/ 08 декабря 2010

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

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