2012-03-30 3 views
-1

Я не знаю, как это сделать, и я не нашел хороших ресурсов в Интернете для того, как выполнять эту операцию. [.] Я пытаюсь принять аннотированное правило производства EBNF что является разницей между двумя регулярными выражениями и превращает их в правило спецификации (грамматики) lex-грамматики (na | f?) [.] Проблема заключается в том, что я не вижу возможности нормально это делать [.] {3} есть ли способ сделать это с помощью Клини алгебры, как и то, как вы можете использовать пустой матч с чередованием в контекстно-свободной грамматики [?][af]? Lex регулярное выражение разницы

ответ

1

что правило производства EBNF выглядеть (и вы можете написать, что в EBNF?)

Установленное различие A\B между регулярными выражениями равнозначно nt к пересечению с дополнением: A&~B: набор строк, соответствующих A, лишенный любых строк, сопоставленных B. Ни гибкость, ни поддержка alex не поддерживают такую ​​семантику на их языках регулярного выражения.

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

+0

Я вижу. Спасибо за информацию до сих пор, очень полезно понять, почему я не могу использовать предоставленную грамматику для Visual Basic для ее анализа из-за нескольких правил, таких как: XMLProcessingValue :: = <Любая XMLString, которая не содержат строку> ... если написано правило EBNF не будет ">?": "?>" XMLProcessingValue :: = XMLString \ Является ли это правильно? Я по-прежнему новичок в механизме формальных языков. – user1303374

+0

EBNF - формально определенный язык грамматики (посмотрите его в Википедии). Он не имеет оператора для заданной разницы. Авторы грамматики ввели неофициальный английский язык для того, что они не могут выразить в стандартном EBNF. – Kaz

+0

Существует способ использовать регулярное выражение без установленных операторов дополнения или пересечения, чтобы исключить орграф, например 'ab'. А именно что-то вроде: '(a * | [^ a] * | ([^ a] * (a [^ b])) *) [^ b] *'. То есть сопоставить все строки, которые являются либо 'a', либо все не' '', либо ноль или несколько сегментов не-'', завершенных 'a' и не-' b', что позволяет объединение всех этих возможностей, которое должно быть обработано последовательностью из нуля или более не-'b''s – Kaz