Чи регулярні вирази


16

Якщо у мене є граматика типу 3, вона може бути представлена ​​на автоматичному віджиманні (не виконуючи жодної операції над стеком), тому я можу представляти регулярні вирази за допомогою контекстних вільних мов. Але чи можу я знати, якщо граматика типу 3 - , , тощо, не будуючи таблиць розбору?LR(1)LL(1)SLR(1)

Відповіді:


16

Усі звичайні мови мають граматики LL (1). Щоб отримати таку граматику, візьміть будь-яку DFA для звичайної мови (можливо, виконавши побудову підмножини на NFA, отриману з регулярного виразу), а потім перетворіть її в правильну рекурсивну регулярну граматику. Потім ця граматика є LL (1), тому що будь-яка пара виробництв для одного і того ж нетерміналу або починається з різних символів, або одна виробляє ε і має $ як знак лексеми. Отже, всі звичайні мови є також LR (1), оскільки будь-яка граматика LL (1) є LR (1). Крім того, використовуючи важливий результат цієї роботи , ви можете показати, що будь-яка мова LR (1) має дзеркальну (1) граматику, тобто будь-яка звичайна мова має SLR (1) граматику.

Однак звичайні мови не всі LR (0). Мови LR (0) мають дуже специфічні властивості - зокрема, вони не мають префіксів. Таким чином, звичайна мова {a, aa} не є LR (0), хоча вона явно регулярна (regex a | (aa)). Однак мови LR (0) не містяться належним чином у звичайних мовах; ця граматика для {0 n 21 n | n ≥ 1} - LR (0), але мова не є регулярною:

S -> E
E -> 0E1 | 2

Сподіваюся, це допомагає!


2
Те, що правильні звичайні граматики приймають саме набір регулярних мов, зазвичай робиться на уроці (або навіть вправах), тому відповідь є набагато більш безпосереднім.
Рафаель

2

Синтаксис регулярного виразу (звичайний старий) (ви сказали "представлення") - LR (0). Для розбору рядка, що представляє собою регулярний вираз, вам не потрібен жодний пошук. Ви можете легко вирішити це, запустивши генератор парсера в граматиці для регулярних виразів: -} Ви також можете легко зашифрувати простий рекурсивний парсер (LL (0)) для регулярних виразів; все, що є LL (0), є LR (0).

Я не знаю, чи такий синтаксис складніших так званих "регулярних виразів", таких як Perl; але регулярні виразки Perl суворо потужніші, ніж регулярні регулярні.

Щоб визначити, чи має граматика якусь властивість, потрібно запустити якийсь присудок. Щоб визначити, чи це (S) LR (k), вам слід запустити предикат, який може перевірити цю властивість. По суті, будь-який подібний предикат повинен фактично будувати таблиці розбору через спосіб їх визначення.


Регулярні регулярні вирази працюють на NFA

Питання полягало не в тому, як працювали регексеси Perl. Йшлося про те, чи (Perl?) Регулярні вирівнювання підлягали аналізу за певними технологіями. Я можу повірити, що регекпси Perl використовують NFA для їх узгодження разом із деяким іншим контекстно-залежним захопленням даних, але я не бачу актуальності цього питання.

3
-1 Регулярні вирази не LR (0). Мови LR (0) повинні бути без префіксу, але регулярний вираз a|(aa)описує мову, яка не є префіксом. Крім того, мови LR (0) не можуть обробляти граматики з продукуванням epsilon, тому звичайна мова {epsilon, a} не є LR (0). Однак звичайними мовами є LL (1), оскільки ви можете записати їх як звичайні граматики, і, таким чином, всі вони є LR (1). Оскільки будь-яка мова LR (1) має граматику SLR (1), це означає, що всі звичайні мови є SLR (1).
templatetypedef

1
Що стосується LL (0), то навпаки: мови LL (0) - це належна підмножина звичайних мов. Зауважте, що LL (0) означає, що ви не використовуєте lookahead для вирішення між різними похідними - що в основному означає, що рішень немає, а мова складається з одного слова. LR (0), навпаки, є корисним класом - знову ви не використовуєте lookahead для вирішення (тут для скорочень), але все ж є певне розмаїття через те, що перехід може відрізняти різні виробництва.

1
@ IraBaxter- Синтаксис регулярних виразів не є LR (0), оскільки регулярні вирази не є префіксами. Вони також не є LL (0), оскільки мови LL (0) можуть містити лише одну рядок (або жодних рядків).
templatetypedef
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.