Чи може хтось надати простий, але неіграшковий приклад контекстно-залежної граматики?


12

Я намагаюся зрозуміти контекстно-залежні граматики.

Я розумію, чому так люблять мови

  1. {wwwA}
  2. {anbncnnN}

не є контекстними, але що я хотів би знати, якщо мова, схожа на нетипізований лямбдальний числення, є залежною від контексту.

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

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


1
майже всі реальні мови програмування залежать від контексту (у загальному сенсі, тобто, що поєднують граматики чомського типу 0 і типу I під "контекстно-залежною"). Наприклад, необхідні декларування змінних перед використанням, ідентифікатори повинні бути унікальними, все це вимагає контексту (st називається семантичним контекстом, але може вводити в оману) cs.purdue.edu/homes/hosking/502/notes/04-semantics.pdf
Nikos M .

Ну, "контекстно-залежна" - це стандартний термін для граматики типу 1.
reinierpost

Відповіді:


8

Так, я вважаю, що це можливо, але ні, я не бажаю чітко будувати цю граматику, залежну від контексту. Я поясню свою відповідь, розділивши це питання на дві різні частини.

(1) Яким би був приклад неграшок? Він повинен відображати декларування змінних. Моя пропозиція такої мови, абстрагована від реального програмування, була б приблизно такою. Алфавіт . { w 1 ; w 2 ; ; w n ( x 1 ; x 2 ; ; x m ) w i , x j{ a , b{a,b,;,(,)} Ця мова залежно від контексту.

{w1;w2;;wn(x1;x2;;xm)wi,xj{a,b}, each xj is equal to some wi}

(2) Щоб показати, що це насправді є залежним від контексту, я б застосував ще один формалізм. Машина Тьюрінга з лінійним використанням стрічки: лінійний обмежений автомат LBA. Я можу запрограмувати його на відповідність шаблону / я б послідовно розглядав кожну і намагався зіставити її з належним w j , буквою за буквою. Графіки LBA еквівалентні граматикам, залежним від контексту, але програмувати набагато простіше.xjwj


Дякую за повідомлення. На сьогодні я менш знайомий з LBA, тому я менш переконаний у пункті (2). Щодо пункту (1), я намагаюся зрозуміти, як побудувати правила, які створюють, де ім'я змінної очікується як вираз, лише одну зі змінних у поточній області. Мені не потрібно бачити цілий, формальний CSG, але просто неформальне пояснення спрацювало б. Я не уявляю, як це зробити з іменами змінних з декількома символами, що є контекстом іншого використання, ніж, наприклад, використання одного нетермінального контексту для спрямування угоди про число суб'єкта-дієслова в деривації ~ англійського речення.

{www}

{ww|w...}

3
{ww}LRLwRwLaMawMabbMaRMaRRa

13

[n]

Багато інших жорстких мов також є в CSL з тієї ж причини, як CLIQUE.

У CSL також є досить природні мови, які ще складніші.

Однак я не знаю жодного способу виразити довільну CSL як граматику, залежну від контексту (CSG), за винятком використання конструкції Landweber у теоремі 3 своєї статті. У цій конструкції CSG описує зворотній бік роботи лінійно обмеженого автомата, який розпізнає CSL. Продукція CSG описує, як певний стан машини є результатом одного можливого руху. Такий CSG - це нескладний переклад автомата на граматику, тому він не обов'язково повинен відповідати мовним особливостям, таким як можливість декларувати змінні, а замість цього буде пошкоджений деталями автомата.

Якщо ви наполягаєте на CSG, а не на CSL, і якщо ваш актуальний питання стосується того, щоб побачити CSG для мови, яка передбачає обмежене визначення змінної, відповідь Хендріка Яна здається гарним початком.


9

Так, граматики, що залежать від контексту (CSG), є досить потужними для перевірки невизначених / недекларованих / незв'язаних змінних, але, на жаль, ми не знаємо жодного ефективного алгоритму для розбору рядків CSG.

Реальним прикладом контекстно-чутливої ​​мови є мова програмування С. Така функція, як спочатку оголосити змінні, а потім використовувати їх, перетворить мову C на контекстно-залежну мову (CSL). ( Я не знаю про нетипізоване обчислення лямбда ).

А тому, що ми не знаємо жодного алгоритму лінійного розбору для CSL (або CSG). Саме тому в дизайні компілятора ми використовуємо CFG (і лише його алгоритм розбору) для перевірки синтаксису, оскільки ми знаємо ефективні алгоритми для розбору CFG (якщо він обмежений). Компілятори спочатку аналізують функцію, що не містить контексту, а пізніше проблематично обробляють функції, що залежать від контексту (наприклад, перевіряє будь-яку використану змінну в таблиці символів, якщо вона визначена. В іншому випадку вона генерує помилку).

Також контекстно-залежна граматика використовується в обробці природним мовою (NLP). І більшість природних мов є прикладами контекстно-чутливих мов. (Я не впевнений у санскритській мові).

Я спробую пояснити це нерозумним, але простим прикладом (це просто ідея, ви можете її вдосконалити):

NOUN     -->  { BlueBomber, Grijesh, I, We}
TENSE    -->  { am, was, is, were}
VERB     -->  { going, eating, working}

SENTENCE --> <NOUN> <TENSE> <VERB>

Тепер, використовуючи цю граматику, ми можемо генерувати кілька правильних тверджень, але деякі теж неправильно. Наприклад,

SENTENCE --> <NOUN>   <TENSE>   <VERB>
             Grijesh    is       working       [Correct statement]

Але

             Grijesh    am       working       [wrong statement]

Причина: значення <TENSE> залежить від значення <NOUN> (наприклад, I &lt;TENNSE> --> I am), а значить, граматика не створює правильних висловлювань в англійській мові.

Насправді ми не можемо написати безтекстову граматику для повної англійської мови!

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


ДОВІДКА : Ви можете подивитися лекції доктора Аруна Кумара . У якійсь лекції він пояснює саме те, що вас цікавить.


Дякую за інформацію, це, безсумнівно, буде корисно для інших, хто цікавиться цією ж темою, але це лише частково пов'язане з тим, про що я б просив. Я не стосуюся себе розбору рядка, генерованого CSG, але бачу простий - навіть нерозумний - приклад формальної CSG, який генерує добре сформовані абстракції (ніяких незв'язаних змінних в тілі функції). Я можу уявити, що CSG генерує правильні "англійські" рядки, оскільки один символ може спрямовувати угоду суб'єкта / дієслова, але з абстракціями змінні, як правило, складаються з декількох символів.

1
@BlueBomber: спасибі, я обов'язково відповім тобі, його ніч в Індії. З новим роком! :)
Гріеш Чаухан

Здається, я можу зробити це лише обмеженою кількістю разів, і відповідно до (цього) [ meta.scicomp.stackexchange.com/questions/156/… я повинен видалити це запитання і перенести його в більш відповідне місце ...

@BlueBomber Я позначений, щоб змінити, Ви також можете зробити.
Grijesh Chauhan

1

(розширення коментарів у відповідь)

Не впевнений, що це приклад, який ви хотіли б у будь-якому випадку.

Практично всі реальні мови програмування залежать від контексту (у загальному розумінні, тобто співвідношення граматики Чомського типу 0 та I типу під "контекстно-залежною", що вірно, звичайно, оскільки необмежені граматики є навіть більш контекстними, ніж контекстними -чутливі граматики).

Наприклад, "змінні повинні бути оголошені перед використанням", "ідентифікатори повинні бути унікальними", всі вони потребують контексту (іноді називаються як семантичний контекст, але це може вводити в оману, оскільки воно так чи інакше включає синтаксичні ознаки) див., Наприклад, https: // www .cs.purdue.edu / будинки / hosking / 502 / нотатки / 04-семантика.pdf

Сенс, що наведені вище приклади є контекстно-залежними (як у граматичному / синтаксичному, так і в семантичному сенсах), тому що вони говорять про свій контекст (що передує чи наступає після).

"Змінна вже визначена" - це про контекст, що передує , використанню змінної. "Унікальний ідентифікатор" - це контекст як того, що передувало, так і виникає після оголошення ідентифікатора тощо.

Дивіться також Чи JavaScript є контекстною вільною мовою? на ТАК


"Контекстно-чутливий" означає тип 1.
reinierpost
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.