Наведені вище відповіді дають досить хороше визначення того, що це таке. Подивимось, чи можу я сказати це своїми словами, щоб у вас було 23 пояснення замість 20. Вся мета граматики, будь-яка граматика, - з’ясувати, чи певне речення є реченням на даній мові. Однак, для чого ми насправді використовуємо граматики та синтаксичний аналіз, - це з'ясувати, що означає речення. Це як старе діаграмування речення, яке ви, можливо, не робили ще в класі англійської мови ще в школі. Речення складається з предметної частини та присудкової частини, підметна частина має іменник і, можливо, деякі прикметники, присудна частина має дієслово і, можливо, предметний іменник, ще з деякими прикметниками тощо.
Якби була граматика англійської мови (а я не думаю, що вона є, не в сенсі інформатики), то вона мала б правила такої форми, що називаються виробництвом.
Sentence -> SubjectPart PredicatePart
SubjectPart -> Adjective Noun
тощо ...
Потім ви могли написати програму і вручити їй будь-яке речення, а програма могла використовувати граматику, щоб визначити, якою частиною речення є кожне слово і яке відношення вони мають один до одного.
Якщо в кожному виробництві є лише одне з лівого боку, то це означає, що щоразу, коли ви бачите праву сторону в реченні, вам дозволяється підставляти ліву частину. Наприклад, кожного разу, коли ви бачили прикметниковий іменник, ви можете сказати "That is SubjectPart", не звертаючи уваги на що-небудь поза цією фразою.
Однак англійська мова (навіть спрощений опис англійської мови, яку я дала вище), є залежною від контексту. "Іменник-прикметник" не завжди є SubjectPart, це може бути NounPhrase в PredicatePart. Це залежить від контексту. Давайте трохи розширимо нашу псевдо-англійську граматику:
Sentence -> SubjectPart PredicatePart
SubjectPart -> Adjective Noun
PredicatePart -> VerbPhrase ObjectNounPhrase
VerbPhrase ObjectNounPhrase -> VerbPhrase Adjective Noun
Ви можете зробити "прикметниковий іменник" в ObjectNounPhrase лише в тому випадку, якщо він приходить одразу після VerbPhrase.
В основному, якщо у вас є виробництво і ви можете застосовувати його в будь-який час, незалежно від того, що його оточує, це без контексту.
Ви завжди можете зрозуміти, чи граматика без контексту. Просто перевірте, чи є більше символів на лівій частині стрілок.
Будь-яка мова може бути описана більш ніж однією граматикою. Якщо деякі граматики для мови є без контексту, мова є без контексту. Для деяких мов можна довести, що граматика без контексту неможлива. Я припускаю, що для спрощеної псевдоанглійської підмножини я описую контекстну граматику.
Що стосується того, чому це важливо, для розбору контексту без граматики потрібна більш проста програма. Як зазначається в інших відповідях, для розбору контексту без граматики не потрібна вся потужність машини Тьюрінга. Аналізатор LR (1) пошуку (який є своєрідною машиною віджимання) для певної без контекстної граматики може аналізувати будь-яке речення в цій граматиці в часі та просторі, лінійних до довжини речення. Якщо речення є мовою, аналізатор створить дерево структури, що визначає, що означає кожен символ у реченні (або принаймні, яку роль він відіграє у структурі). Якщо речення відсутнє в граматиці, аналізатор помітить і зупиниться на першому символі, який неможливо узгодити з граматикою та попередніми символами (на першій "помилці").
Що ще краще - це те, що є програми, на яких можна дати опис граматики, і список інструкцій про те, що робити з кожною частиною (в певному сенсі додаючи "значення" кожній продукції), і програма напише парсер для вас. Програма розбере речення, знайде структуру та виконає ваші вказівки щодо кожної частини структури. Цей вид програми називається парсером-генератором або компілятором-компілятором.
Цей вид мовного аналізу був винайдений для автоматичного аналізу природної мови (наприклад, англійської), але виявляється, що це найбільш корисно для аналізу комп'ютерних мов. Мовний дизайнер може написати граматику, яка захоплює його нову мову, а потім запустити її через аналізатор аналізатора, щоб отримати програму, яка розбирає його мову, а також перекладає, інтерпретує, компілює, виконує і т.д., якщо він захоче.
Насправді, у більшості випадків ви не можете цього реально зробити. Наприклад, збалансовані дужки - це безконтекстна мова, але мова, де потрібно оголосити всі змінні, перш ніж використовувати їх, є контекстно-залежною. Аналізатор є частиною компілятора, але для забезпечення цих інших вимог необхідна додаткова логіка. Тоді вам потрібно зробити граматику, яка захоплює якомога більше вашої мови, запустіть її через аналізатор аналізатора, а потім напишіть код, який виконує інші вимоги (обробник таблиці символів тощо).
Зазвичай ми не використовуємо контекстно-залежні граматики, оскільки вони значно слабкіше підтримуються. Я не знаю, чи існує еквівалент LR (k) аналізатор аналізатора для контекстно-чутливих мов. Так, машина Тьюрінга (або лінійно прив'язана машина) може проаналізувати її, але я не знаю, чи існує загальний алгоритм перетворення контекстно-чутливої граматики в програму для машини Тьюрінга в сенсі, що LR (1 ) генератор робить розбір таблиць для машини, що висувається. Я здогадуюсь, що таблиці, які лежать в основі аналізатора, були б експоненціально більшими. У будь-якому випадку, студентів з КС (як я, у той же час), як правило, викладають без контексту граматики та генератори парсерів LR (1), такі як YACC.