Я написал этот алгоритм , чтобы сгенерировать строку, которой будет соответствовать регулярное выражение.Работает действительно хорошо, но в нем по-прежнему отсутствует пара функций.
Например, при реверсировании \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 на узел?