Вот что я сделал:
Я смоделировал регулярное выражение следующим образом:
- (интерфейс): классы ниже реализуют этот интерфейс
Код: Выделить всё
RegularExpression
- (т. е.: aaa, bbb, abcde): это листовой класс; у него нет подвыражений
Код: Выделить всё
Simple
- (т. е.: a(ab)* , (a(ab)*c(b)*)* ): этот класс содержит список RegularExpression. p>
Код: Выделить всё
ComplexWithoutOr
- (пример: a(a|b)*, (a((ab)*|c(b)*)*): этот класс содержит операцию «ИЛИ» , который содержит список RegularExpression. Он представляет часть a|b первого примера и (ab)*|c(b)* второго.
Код: Выделить всё
ComplexWithOr
- (пример: awcw, где w ∈ {a,b}*): это еще не реализовано, но идея состоит в том, чтобы смоделировать его как листовой класс с логикой, отличной от Simple >. Он представляет часть w примеров.
Код: Выделить всё
Variable
Код: Выделить всё
Simple
Код: Выделить всё
ComplexWithoutOr
Описание проблемы
Вот пример ввода, для которого мой алгоритм дает сбой. :
Код: Выделить всё
(ab)*abac
Мой алгоритм сначала генерирует TM1 для ab. Этот TM1 используется TM2 для (ab)*, поэтому в случае успеха TM1 он снова входит в TM 1, в противном случае TM1 выполняет откат и TM2 успешно завершает работу. Другими словами, TM2 не может дать сбой.
Затем он генерирует TM3 для abac. Выход TM2 является входом TM3. Выходные данные TM3 являются результатом выполнения.
Теперь предположим, что эта входная строка: abac. Как видите, оно соответствует регулярному выражению. Итак, давайте посмотрим, что происходит, когда TM выполняется.
TM1 выполняется успешно с первого раза: ab. TM1 терпит неудачу во второй раз для ac и выполняет откат, помещая головку TM в третьюrd позицию в a. TM2 завершается успешно, и ввод пересылается в TM3. TM3 не работает, поскольку ac не соответствует abac. Значит ТМ не распознает abac.
Это проблема. Как это решить?
Я использую Java для разработки, но язык не важен. Мой вопрос касается алгоритма.
Подробнее здесь: https://stackoverflow.com/questions/316 ... expression