Хорошая проблема.
Во-первых, спросите себя, можете ли вы ограничить шаблон шаблоном "+", или вам также необходимо проверить / сопоставить прямоугольники. Например, прямоугольник из [bc]
с a
границей a
будет соответствовать центральному прямоугольнику ниже, но также будет соответствовать форме "+" [c([bc]*a})v([bc]*a)>([bc]*a)<([bc]*a)]
(в вашем синтаксисе)
xxxaaaaaxxx
yzyabcba12d
defabcbass3
oreabcba3s3
s33aaaaas33
k388x.egiee
Если вы можете ограничить его знаком "+", тогда ваша задача будет намного проще. Как сказал ShuggyCoUk, синтаксический анализ RE обычно эквивалентен DFSM - но для одного последовательного ввода, который значительно упрощает работу.
В вашем "RE +" движке вам придется отлаживать не только движок, но и каждое место, где вводятся выражения. Я хотел бы, чтобы компилятор ловил любые ошибки, которые он мог. Учитывая это, вы также можете использовать что-то, что было явно четырьмя RE, например:
REPlus engine = new REPlus('b').North("a{3}")
.East("a{3}").South("a{3}").West("a{3}");
Однако, в зависимости от вашей реализации, это может быть громоздким.
А что касается движка обхода - будут ли шаблоны Север / Запад соответствовать RtL или LtR? Это может иметь значение, если шаблоны соответствуют или не соответствуют жадным подсовпадениям.
Кстати, я думаю, что '^' в вашем примере должен быть одним символом слева, вне скобок.