Я сейчас пытаюсь решить проблему, похожую на Проверка пересечения двух обычных языков , за исключением того, что я знаю, как сделать пересечение, но у меня есть дополнительное требование.
Логика пересечения, которую я собираюсь использовать, - это алгоритм Книги Дракона для преобразования NFA в DFA, но выполняемый на двух NFA одновременно. Поскольку все DFA являются NFA (но с очень небольшим недетерминизмом), вы можете повторить это по мере необходимости для большего количества пересечений.
Моя проблема в том, что у одного из моих регулярных выражений есть группы, которые можно использовать в дальнейшем как часть нового регулярного выражения. В частности:
bin/x86/a.out: obj/x86/.*\.o
obj/{[a-zA-Z0-9]+}/{.*}.o: src/\2.c
В конце первой строки у меня есть регулярное выражение, которое соответствует всем объектам для целей x86. Во второй строке у меня есть регулярное выражение, которое указывает возможную строку сборки, которая должна соответствовать первой группе с фиксированным «x86», а второй - любой данной строке после нее. В этом примере первое совпадение еще не используется, но оно должно быть извлекаемым. Чтобы убедиться, что сопоставление заканчивается (и разрешить рекурсивные правила), я хочу использовать информацию, полученную из первого регулярного выражения, в сопоставлении со вторым. Правило выбирается путем взятия второго регулярного выражения из первой и первого из второй строки и определения, имеет ли пересечение двух (DFA, являющееся результатом пересечения) состояние принятия. Если это так, то есть предложения, которые оба могут анализировать, и, следовательно, некоторые значения, которые может принимать группа.
Можно ли вообще извлечь информацию из первого регулярного выражения для использования при сопоставлении группы второго регулярного выражения?
Если нет, то какие ограничения мне нужно добавить?