2015-08-05 3 views
1

Я хотел бы знать, как можно получить взаимную рекурсию с регулярным выражением в Javascript.Взаимная рекурсия в Regex

Например, регулярное выражение, распознающее язык {a^n b^n}, будет/a $ 0b/где $ 0 обозначает текущее регулярное выражение. Это была бы базовая рекурсия.

Взаимная рекурсия такая же, но с различными регулярными выражениями.

Как мы можем сделать это с помощью Javascript?

Спасибо за ваши ответы!

+0

JS даже не поддерживает «базовую» рекурсию в регулярном выражении. – Bergi

+0

Взаимная рекурсия должна быть довольно тривиальной, вставляя одно выражение в другое. – Bergi

+0

Не так просто. Поскольку A вызывает B и B, вызывает A. Таким образом, это не сработает. (Вот почему это «рекурсия») –

ответ

0

К сожалению, Javascript не поддерживает рекурсивные регулярные выражения.

Вы можете реализовать основную рекурсивную функцию с проверками на первую и последнюю букву (чтобы они a и b соответственно) и рекурсивный вызов для внутренней струны ($0 в вашем примере).

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

Во-вторых, ваш единственный случай отказа - если буквы на каждом конце не совпадают.

Вы можете сопоставить любое другое регулярное выражение с такой функцией тестера. Чтобы реализовать взаимно-рекурсивный, просто вызовите одну функцию из другой.

Чтобы по-настоящему воплотить конечный автомат, пойдите с помощью токена, когда вы делаете проверки; для примера выше, сначала проверьте, что у вас есть a в начале, а затем рекурсия, затем проверьте на b в конце.

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

+0

Я не хочу делать функцию для каждого регулярного выражения. Вот почему есть двигатель регулярных выражений, я думаю: D –

+2

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

+0

Существует теория. Регулярные языки - это те, которые могут быть представлены с использованием регулярных выражений. Регулярные Javascript следуют этому строго. Рекурсивные регулярные выражения на самом деле не являются регулярными выражениями в строгом смысле; это то, что мы называем контекстно-свободными грамматиками. Контекстно-свободные языки представлены контекстно-свободными грамматиками, которые представляют собой только конечные машины, которые принимают токены и продвигают состояние фразы, которую мы строим. Это поведение, которое вы хотите имитировать с помощью функций. Другого пути нет. – Purag

Смежные вопросы