Що таке синтаксичний аналіз?
Синтаксичний аналіз - це друга фаза процесу проектування компілятора, в якій даний вхідний рядок перевіряється на підтвердження правил та структури формальної граматики. Він аналізує синтаксичну структуру та перевіряє, чи вказаний ввід відповідає правильному синтаксису мови програмування чи ні.
Синтаксичний аналіз у процесі проектування компілятора відбувається після фази лексичного аналізу. Він також відомий як дерево синтаксичного аналізу або дерево синтаксису. Дерево розбору розроблено за допомогою заздалегідь визначеної граматики мови. Аналізатор синтаксису також перевіряє, чи відповідає дана програма правилам, передбаченим безконтекстною граматикою. Якщо це задовольняє, парсер створює дерево синтаксичного аналізу цієї вихідної програми. В іншому випадку на екрані з’являться повідомлення про помилки.
У цьому підручнику ви дізнаєтесь
- Навіщо потрібен Syntax Analyzer?
- Важлива термінологія аналізатора синтаксису
- Навіщо нам потрібен розбір?
- Методи синтаксичного аналізу
- Помилка - методи відновлення
- Граматика:
- Нотаційні конвенції
- Безкоштовна граматика
- Виведення граматики
- Синтаксис проти лексичного аналізатора
- Недоліки використання синтаксичних аналізаторів
Навіщо потрібен Syntax Analyzer?
- Перевірте, чи правильний код граматично
- Синтаксичний аналізатор допомагає застосовувати правила до коду
- Допомагає вам переконатися, що кожна відкриваюча скоба має відповідний баланс закриття
- Кожна декларація має тип, і тип повинен існувати
Важлива термінологія аналізатора синтаксису
Важливі термінології, що використовуються в процесі аналізу синтаксису:
- Речення: Речення - це група символів над деяким алфавітом.
- Лексема: Лексема - це синтаксична одиниця найнижчого рівня мови (наприклад, total, start).
- Лексема : маркер - це просто категорія лексем.
- Ключові слова та зарезервовані слова - це ідентифікатор, який використовується як фіксована частина синтаксису висловлювання. Це зарезервоване слово, яке ви не можете використовувати як ім’я змінної чи ідентифікатор.
- Слова з шумом - слова з шумом не є обов’язковими, які вставляються у висловлювання для покращення читабельності речення.
- Коментарі - Це дуже важлива частина документації. Він здебільшого відображається за допомогою, / * * /, або // Пусто (пробіли)
- Розділювачі - це синтаксичний елемент, який позначає початок або кінець певної синтаксичної одиниці. Як заява чи вираз, "почати" ... "закінчити" або {}.
- Набір символів - ASCII, Unicode
- Ідентифікатори - це обмеження довжини, яке допомагає зменшити читабельність вироку.
- Символи оператора - + та - виконують дві основні арифметичні операції.
- Синтаксичні елементи Мови
Навіщо нам потрібен розбір?
Синтаксичний аналіз також перевіряє, чи є вхідний рядок правильно сформованим, а якщо ні, відхиліть його.
Нижче наведені важливі завдання, які виконує парсер при розробці компілятора:
- Допомагає виявити всі типи синтаксичних помилок
- Знайдіть позицію, в якій сталася помилка
- Чіткий і точний опис помилки.
- Відновлення після помилки, щоб продовжити і знайти подальші помилки в коді.
- Не повинно впливати на компіляцію "правильних" програм.
- Синтаксичний аналіз повинен відхилити неприпустимі тексти, повідомляючи про синтаксичні помилки
Методи синтаксичного аналізу
Методи синтаксичного аналізу поділяються на дві різні групи:
- Розбір зверху вниз,
- Розбір знизу вгору
Розбір зверху вниз:
При синтаксичному розборі зверху вниз дерево синтаксичного аналізу починається від кореня, а потім рухається до листя.
Два типи розбору зверху вниз:
- Інтелектуальний аналіз:
Прогнозний синтаксичний аналіз може передбачити, яке виробництво слід використовувати для заміни конкретного вхідного рядка. Синтаксичний аналізатор передбачає використання точки перегляду вперед, яка вказує на наступні введені символи. Зворотне відстеження не є проблемою при цій техніці аналізу. Він відомий як LL (1) Parser
- Рекурсивний аналіз спуску:
Ця техніка синтаксичного аналізу рекурсивно аналізує вхідні дані, щоб створити дерево мовлення. Він складається з декількох невеликих функцій, по одній для кожного нетерміналу в граматиці.
Розбір знизу вгору:
При синтаксичному аналізі знизу вгору в дизайні компілятора побудова дерева синтаксичного аналізу починається з відпустки, а потім воно обробляється до свого кореня. Це також називається синтаксичним синтаксичним розбором. Цей тип розбору в дизайні компілятора створюється за допомогою деяких програмних засобів.
Помилка - методи відновлення
Поширені помилки, які виникають при розборі в системному програмному забезпеченні
- Лексичний : Назва неправильно введеного ідентифікатора
- Синтаксичний : незбалансована дужка або відсутня крапка з комою
- Семантичне : присвоєння несумісного значення
- Логічне : нескінченний цикл і недосяжний код
Синтаксичний аналізатор повинен виявляти та повідомляти про будь-яку помилку, виявлену в програмі. Отже, щоразу, коли виникала помилка, парсер. Він повинен мати можливість обробляти це і продовжувати синтаксичний аналіз залишку вводу. Програма може мати наступні типи помилок на різних етапах процесу компіляції. Існує п’ять загальних методів відновлення помилок, які можна реалізувати в парсері
Відновлення режиму виписки
- У випадку, коли синтаксичний аналізатор виявляє помилку, це допоможе вам зробити коригувальні дії. Це дозволяє решті вхідних даних і станів аналізувати вперед.
- Наприклад, додавання відсутньої крапки з комою є в режимі оператора відновлення. Однак розробник синтаксичного аналізу повинен бути обережним під час внесення цих змін, оскільки одне неправильне виправлення може призвести до нескінченного циклу.
Відновлення в режимі паніки
- У випадку, коли синтаксичний аналізатор виявляє помилку, цей режим ігнорує решту оператора і не обробляє введення від помилкового вводу до роздільника, як крапка з комою. Це простий спосіб відновлення помилок.
- У цьому типі методу відновлення парсер відхиляє введені символи по черзі, поки не буде знайдено одну призначену групу токенів синхронізації. Маркери синхронізації, як правило, використовують роздільники, такі як або.
Відновлення на рівні фрази:
- Компілятор виправляє програму, вставляючи або видаляючи маркери. Це дозволяє йому продовжувати аналіз з того місця, де він був. Він виконує корекцію залишку вводу. Він може замінити префікс залишку вводу деяким рядком, що допомагає синтаксичному аналізатору продовжити процес.
Виробництво помилок
- Помилка відновлення виробництва розширює граматику мови, яка генерує помилкові конструкції. Потім парсер виконує діагностику помилок щодо цієї конструкції.
Глобальна корекція:
- Компілятор повинен вносити якомога менше змін, обробляючи неправильний вхідний рядок. Враховуючи неправильні вхідні рядки a та граматику c, алгоритми будуть шукати дерево синтаксичного аналізу для пов'язаного рядка b. Як і деякі вставки, видалення та модифікації маркерів, необхідних для перетворення символу b на якнайменше.
Граматика:
Граматика - це набір структурних правил, що описують мову. Граматики призначають структуру будь-якому реченню. Цей термін також відноситься до вивчення цих правил, і цей файл включає морфологію, фонологію та синтаксис. Він здатний описати багато, синтаксис мов програмування.
Правила форми граматики
- Нетермінальний символ повинен з'являтися зліва від принаймні одного продукту
- Символ цілі ніколи не повинен відображатися праворуч від :: = будь-якого виробництва
- Правило є рекурсивним, якщо LHS з'являється в його RHS
Нотаційні конвенції
Символ умовних позначень може бути позначений, заключивши елемент у квадратні дужки. Це довільна послідовність екземплярів елемента, яку можна вказати, вклавши елемент у фігурні дужки, після яких додається символ зірочки, {…} *.
Це вибір альтернативи, яка може використовувати символ у межах єдиного правила. За необхідності він може бути вкладений у дужки ([,]).
Два типи нотаційних конвенцій - термінали та нетермінали
1. термінали:
- Малі літери в алфавіті, такі як a, b, c,
- Символи оператора, такі як +, -, * тощо.
- Розділові знаки, такі як дужки, геш, кома
- 0, 1,…, 9 цифр
- Рядки напівжирного шрифту, такі як id або if, що-небудь, що представляє один символ терміналу
2.Номінали:
- Великі літери, такі як A, B, C
- Малі курсивні назви: вираз або деякі
Безкоштовна граматика
CFG - це ліворекурсивна граматика, яка має принаймні одне виробництво цього типу. Правила в безконтекстній граматиці в основному рекурсивні. Аналізатор синтаксису перевіряє, чи відповідає певна програма всім правилам безконтекстної граматики чи ні. Якщо воно відповідає, аналізатори синтаксису цих правил можуть створити дерево розбору для цієї програми.
expression -> expression -+ termexpression -> expression - termexpression-> termterm -> term * factorterm -> expression/ factorterm -> factor factorfactor -> ( expression )factor -> id
Виведення граматики
Виведення граматики - це послідовність граматичного правила, яке перетворює початковий символ у рядок. Висновок доводить, що рядок належить до мови граматики.
Найлівіша деривація
Коли сентенційна форма введення сканується і замінюється в послідовності зліва направо, вона відома як найбільш ліва деривація. Форма речення, яка походить від крайнього лівого виведення, називається формою лівого речення.
Найправіша деривація
Сканування деривації праворуч та заміну вводу на виробничі правила, справа наліво, послідовність. Це відоме як найбільш правильне виведення. Форма речення, яка походить від самого правого виведення, відома як право-сентенційна форма.
Синтаксис проти лексичного аналізатора
Аналізатор синтаксису |
Лексичний аналізатор |
Аналізатор синтаксису в основному має справу з рекурсивними конструкціями мови. |
Лексичний аналізатор полегшує завдання аналізатора синтаксису. |
Аналізатор синтаксису працює над лексемами у вихідній програмі для розпізнавання значущих структур у мові програмування. |
Лексичний аналізатор розпізнає маркер у вихідній програмі. |
Він отримує вхідні дані у вигляді лексем від лексичних аналізаторів. |
Він несе відповідальність за дійсність маркера, наданого компанією аналізатор синтаксису |
Недоліки використання синтаксичних аналізаторів
- Це ніколи не визначить, дійсний маркер чи ні
- Не допомагає визначити, чи дійсна операція, виконана над типом маркера, дійсною чи ні
- Ви не можете вирішити, що маркер оголошено та ініціалізовано перед тим, як його використовувати
Резюме
- Синтаксичний аналіз - це друга фаза процесу проектування компілятора, яка настає після лексичного аналізу
- Синтаксичний аналізатор допомагає застосовувати правила до коду
- Речення, Лексема, Лексема, Ключові слова та зарезервовані слова, Шумні слова, Коментарі, Розділювачі, Набір символів, Ідентифікатори - деякі важливі терміни, що використовуються в Синтаксичному аналізі у побудові компілятора
- Синтаксичний розбір перевіряє, чи є вхідний рядок правильно сформованим, а якщо ні, відхиляйте його
- Методи синтаксичного аналізу поділяються на дві різні групи: синтаксичний синтаксичний розбір зверху вниз, синтаксичний синтаксичний розбір знизу вгору
- Лексичні, синтаксичні, семантичні та логічні деякі загальні помилки, що виникають під час методу синтаксичного аналізу
- Граматика - це набір структурних правил, що описують мову
- Символ умовних позначень може бути позначений, заключивши елемент у квадратні дужки
- CFG - це ліворекурсивна граматика, яка має принаймні одне виробництво цього типу
- Виведення граматики - це послідовність граматичного правила, яке перетворює початковий символ у рядок
- Аналізатор синтаксису в основному має справу з рекурсивними конструкціями мови, тоді як лексичний аналізатор полегшує завдання аналізатора синтаксису в СУБД
- Недоліком методу аналізатора синтаксису є те, що він ніколи не визначить, чи правильний маркер