Чи можна розрізнити граматику LL (k) та LR (k)?


12

Я нещодавно вивчаю питання проектування компіляторів. Мені стало відомо про два типи граматик, один - граматика ЛЛ, а другий - граматика ЛР.

Ми також знаємо факти, що кожна граматика LL є LR, що є LL граматикою - це належна підмножина граматики LR. Перший використовується при синтаксичному розборі зверху вниз, а другий - при синтаксичному розборі знизу вгору.

Але чи є спосіб, щоб ми могли сказати, що дана граматика - LL чи LR?


3
Як щодо використання канонічних методів для генерації таблиць та L R ( k ) та перевірки, чи містять вони конфлікти? L L ( 1 ) і L R ( 1 ) зазвичай розглядаються в будь-якому стандартному підручнику з розбору; то L L ( K ) і L R ( K ) методи є трохи складніше знайти, але також добре відомі. LL(k)LR(k)LL(1)LR(1)LL(k)LR(k)
Алекс десять Бринк

@AlextenBrink Це звучить так, ніби ви могли дати відповідь! (Ласкаво просимо назад, вас пропустили!)
Рафаель

Використовуючи канонічну техніку для перевірки правильності граматики LL чи LR, але це тривалий шлях. Я намагаюся знайти такий спосіб, який я знайшов у книзі "Компілятори" Ахо-Лам-Сетхі-Улмана.
Деб

Відповіді:


11

Граматики L L ( k ) та L R ( k ) приємні не лише тому, що їх можна ефективно розбирати, а й тому, що ми можемо перевірити, чи граматика L L ( k ) чи L R ( k )LL(k)LR(k)LL(k)LR(k), і тому, що ми можемо генерувати для них таблиці (таблиці для розбору використовуються для розбору вхідних рядків). Зауважте, що для цих двох класів наявність таблиці розбору відразу дозволяє перевірити, чи є граматики в класах, оскільки це так, якщо і лише в тому випадку, якщо таблиці не містять помилок. Крім того, так, є класи граматик, які ми можемо ефективно розбирати, якщо у нас є таблиця розбору, але для якої ми не можемо створити таблицю, якщо вона існує.

Будь-який підручник з методів розбору навчить вас генерувати таблиці для методів і, можливо, також для L R ( 1 ) (хоча S L R ( 1 ) є більш поширеним). Підручники, такі як Теорія розбору Сіппу та Сойсалона-Сойнінена, також розглядають генерацію таблиці розбору для L L ( k ) та L R ( k ) граматик.LL(1)LR(1)SLR(1)LL(k)LR(k)

На жаль, для дійсно дивних граматик таблиці розбору для та L R ( k ) (хоча не для L L ( 1 ) ) можуть підірватися і стати величезними; вони зроблять це навіть для звичайних граматик, якщо k досить високий. Існують тести, які дозволяють перевірити, граматика L L ( k ) або L R ( k )LL(k)LR(k)LL(1)kLL(k)LR(k)чи ні, що виконується в поліномічний час (генерація таблиці є експоненціальною). Детальніше читайте підручник вище. Зауважимо, що у багатьох випадках таблиця має достатній розмір, тому тест не потрібен.

Якщо ви не хочете спробувати значення щоб побачити, чи працює ваша програма, але натомість хочете, щоб ваш комп'ютер розібрався, чи існує значення k таке, щоб ваша граматика була L L ( k ) або L R ( k ) , вам, на жаль, не пощастило, оскільки це не можна визначити. Якщо ваша граматика L R ( k ) для деякого k , ви можете вирішити, чи ваша граматика L L ( c ) для деякого c , можливо, відрізняється від kkkLL(k)LR(k)LR(k)kLL(c)ck( подробиці див. тут ).


Чи знаєте ви, де я можу знайти деталі алгоритму поліноміального часу для тестування, якщо мова є LR (k) (окрім придбання підручника)?
користувач541686

2

Ми повинні перевірити лише те, що граматика є LL чи ні, тому що кожна граматика LL - LR, що є LL, є належним підмножиною LR. Отже, якщо граматика LL, то вона повинна бути LR, але кожен LR не LL.

Граматика G є у LL iff, коли A-> C | D, має виконуватися така умова:

  1. Перший (C) і First (D) - це роз'єднані множини.
  2. Якщо порожній в першій (D), то перший (C) і слідуючий (A) - це роз'єднані набори, так само порожні є у першій (C).
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.