Лексичний аналіз (аналізатор) у компіляторі з прикладом

⚡ Розумний підсумок

Лексичний аналіз – це перший етап проектування компілятора, де лексичний аналізатор перетворює потік вихідних символів на змістовні токени. Він видаляє пробіли та коментарі, записує токени в таблицю символів і повідомляє про лексичні помилки синтаксичному аналізатору.

  • 🔤 Перша фаза компілятора: Лексичний аналіз зчитує вихідні символи та перетворює їх на послідовність лексем.
  • 🧩 Ключові терміни: Лексема — це послідовність символів, що збігається, токен — її категорія, а шаблон визначає правило.
  • 🏗️ Як Це Працює: Парсер запитує «отримати наступний токен», а сканер повертає токени на вимогу.
  • 🧹 Роль прибиральника: Лексер видаляє пробіли та коментарі, розширює макроси та заповнює таблицю символів.
  • ⚠️ Лексичні помилки: Недопустимі символи або неправильно написані ідентифікатори викликають помилки, які обробляються методами відновлення, такими як видалення або транспозиція.
  • 🔀 Лексер проти Парсера: Лексер ідентифікує токени; парсер будує дерево розбору під час синтаксичного аналізу.

Лексичний аналіз

Що таке лексичний аналіз?

Лексичний аналіз це найперша фаза в проектуванні компілятора. Лексер приймає змінений вихідний код, який записується у формі речень. Іншими словами, це допомагає вам перетворити послідовність символів у послідовність токенів. Лексичний аналізатор розбиває цей синтаксис на серію лексем. Він видаляє будь-який зайвий пробіл або коментар, написаний у вихідному коді.

Програми, які виконують лексичний аналіз під час розробки компілятора, називаються лексичними аналізаторами або лексерами. Лексер містить токенізер або сканер. Якщо лексичний аналізатор виявляє, що маркер недійсний, він генерує помилку. Роль лексичного аналізатора в розробці компілятора полягає в тому, щоб зчитувати потоки символів із вихідного коду, перевіряти допустимі маркери та передавати дані аналізатору синтаксису, коли він вимагає.

Приклад

How Pleasant Is The Weather?

Дивіться цей приклад лексичного аналізу; Тут ми можемо легко розпізнати п’ять слів «Як приємно», «Погода», «Як приємно». Це дуже природно для нас, оскільки ми можемо розпізнавати роздільники, пробіли та знаки пунктуації.

 HowPl easantIs Th ewe ather?

Тепер перевірте цей приклад, ми також можемо це прочитати. Однак це займе деякий час, тому що роздільники розміщені в непарних місцях. Це не те, що приходить до вас відразу.

Основні термінології

Що таке лексема?

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

Що таке жетон?

Токени в дизайні компілятора — це послідовність символів, яка представляє одиницю інформації у вихідній програмі.

Що таке шаблон?

Шаблон – це опис, який використовується маркером. У випадку ключового слова, яке використовується як маркер, шаблон є послідовністю символів.

Лексичний аналізатор Architecture: Як розпізнаються токени

Основним завданням лексичного аналізу є читання вхідних символів у коді та створення токенів.

Лексичний аналізатор сканує весь вихідний код програми. Він ідентифікує кожен маркер один за одним. Сканери зазвичай створюють маркери лише за запитом синтаксичного аналізатора. Ось як працює розпізнавання токенів у компіляторі –

Лексичний аналізатор Archiтектура
Лексичний аналізатор Archiтектура
  1. «Отримати наступний токен» — це команда, яка надсилається від парсера до лексичного аналізатора.
  2. Отримавши цю команду, лексичний аналізатор сканує вхідні дані, поки не знайде наступну лексему.
  3. Він повертає маркер до аналізатора.

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

Ролі лексичного аналізатора

Лексичний аналізатор виконує такі завдання:

  • Допомагає ідентифікувати токен у таблиці символів
  • Видаляє пробіли та коментарі з вихідної програми
  • Співвідносить повідомлення про помилки з вихідною програмою
  • Допомагає вам розширити макрос, якщо він знайдений у вихідній програмі
  • Читання введених символів із вихідної програми

Приклад лексичного аналізу, лексеми, нелексеми

Розглянемо наступний код, який надсилається до лексичного аналізатора

#include <stdio.h>
    int maximum(int x, int y) {
        // This will compare 2 numbers
        if (x > y)
            return x;
        else {
            return y;
        }
    }

Приклади створених токенів

Лексема Знак
Int ключове слово
максимальний ідентифікатор
( Operaтор
Int ключове слово
x ідентифікатор
, Operaтор
Int ключове слово
Y ідентифікатор
) Operaтор
{ Operaтор
If ключове слово

Приклади нетокенів

тип прикладів
коментар // Порівняє 2 числа
Директива попереднього процесора #включати
Директива попереднього процесора #define NUMS 8,9
Macro NUMS
Пробіл /n /b /t

Лексичні помилки

Послідовність символів, яку неможливо сканувати в будь-який дійсний маркер, є лексичною помилкою. Важливі факти про лексичну помилку:

  • Лексичні помилки не дуже поширені, але їх слід усунути за допомогою сканера
  • Помилки в написанні ідентифікаторів, операторів, ключових слів вважаються лексичними помилками
  • Як правило, лексична помилка виникає через появу деяких недозволених символів, переважно на початку лексеми.

Відновлення помилок у лексичному аналізаторі

Ось кілька найпоширеніших методів усунення помилок:

  • Видаляє один символ із решти введення
  • У режимі паніки послідовні символи завжди ігноруються, доки ми не досягнемо добре сформованого маркера
  • Вставляючи пропущений символ у решту введення
  • Заміна символу іншим символом
  • Транспонувати два послідовні символи

Лексичний аналізатор проти парсера

Лексичний аналізатор Парсер
Програма Scan Input Виконати синтаксичний аналіз
Ідентифікуйте токени Створіть пресtract-представлення коду
Вставте маркери в таблицю символів Оновити записи таблиці символів
Він породжує лексичні помилки Він генерує дерево аналізу вихідного коду

Навіщо розділяти лексичний і парсер?

  • Простота дизайну: полегшує процес лексичного аналізу та синтаксичного аналізу, усуваючи небажані лексеми
  • Щоб підвищити ефективність компілятора: допомагає підвищити ефективність компілятора
  • Спеціалізація: спеціалізовані методи можуть бути застосовані для покращення процесу лексичного аналізу
  • Портативність: для зв’язку із зовнішнім світом потрібен лише сканер
  • Вища портативність: специфічні особливості пристрою введення обмежені лексером

Переваги лексичного аналізу

  • Метод лексичного аналізатора використовується такими програмами, як компілятори, які можуть використовувати аналізовані дані з коду програміста для створення скомпільованого двійкового виконуваного коду
  • Він використовується веб-браузерами для форматування та відображення веб-сторінки за допомогою проаналізованих даних з JavaScript, HTML, CSS
  • Окремий лексичний аналізатор допоможе вам створити спеціалізований і потенційно більш ефективний процесор для виконання завдання

Недолік лексичного аналізу

  • Вам потрібно витратити багато часу на читання вихідної програми та її розділення у вигляді токенів
  • Деякі регулярні вирази досить важко зрозуміти порівняно з правилами PEG або EBNF
  • Потрібні додаткові зусилля для розробки та налагодження лексера та його описів маркерів
  • Для генерації таблиць лексерів і побудови токенів потрібні додаткові витрати часу виконання

Поширені запитання

Серед популярних інструментів – Lex та його версія з відкритим кодом Flex. Ви пишете шаблони токенів як регулярні вирази, а інструмент автоматично генерує вихідний код сканера, позбавляючи вас необхідності писати токенаізатор вручну.

Лексичний аналізатор визначає кожну лексему як регулярний вираз і реалізує зіставлення за допомогою скінченних автоматів. Він сканує символи зліва направо та видає найдовший дійсний збіг як наступну лексему.

Таблиця символів — це структура даних, де лексичний аналізатор зберігає ідентифікатори та їхні атрибути, такі як ім'я та тип. Later фази компілятора читають та оновлюють його до track змінних та функцій.

Штучний інтелект може генерувати регулярні вирази з прикладів, виявляти неоднозначності або перекриттяping шаблони та пояснюють помилки сканера. Це пришвидшує створення та налагодження лексичного аналізу для нової мови або DSL.

Не зовсім. Компілятори використовують фіксовані правила та скінченні автомати для токенізації коду, тоді як моделі штучного інтелекту розділяють текст на статистичні підсловні токени. Цілі відрізняються: точний розбір проти гнучкого розуміння мови.

Підсумуйте цей пост за допомогою: