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

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

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

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

Приклад

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 Виконати синтаксичний аналіз
Ідентифікуйте токени Створіть абстрактне представлення коду
Вставте маркери в таблицю символів Оновити записи таблиці символів
Він породжує лексичні помилки Він генерує дерево аналізу вихідного коду

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

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

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

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

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

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

Підсумки

  • Лексичний аналіз є першою фазою розробки компілятора
  • Лексеми та маркери — це послідовність символів, які включені у вихідну програму відповідно до шаблону відповідності маркера
  • Реалізовано лексичний аналізатор для сканування всього вихідного коду програми
  • Лексичний аналізатор допомагає ідентифікувати лексеми в таблиці символів
  • Послідовність символів, яку неможливо сканувати в будь-який дійсний маркер, є лексичною помилкою
  • Видаляє один символ із решти введених даних. Це корисно. Спосіб усунення помилок
  • Лексичний аналізатор сканує вхідну програму, а аналізатор виконує синтаксичний аналіз
  • Це полегшує процес лексичного аналізу та аналізу синтаксису, усуваючи небажані лексеми
  • Лексичний аналізатор використовується веб-браузерами для форматування та відображення веб-сторінки за допомогою аналізованих даних з JavsScript, HTML, CSS
  • Найбільший недолік використання лексичного аналізатора полягає в тому, що він потребує додаткових накладних витрат на час виконання, щоб створити таблиці лексерів і створити маркери