Лексикален анализ (анализатор) в дизайна на компилатора с пример

Какво е лексикален анализ?

Лексикален анализ е първата фаза в проектирането на компилатора. Лексерът приема модифицирания изходен код, който е написан под формата на изречения. С други думи, помага ви да конвертирате поредица от знаци в поредица от токени. Лексикалният анализатор разделя този синтаксис на серия от токени. Той премахва всяко допълнително пространство или коментар, написан в изходния код.

Програмите, които извършват лексикален анализ в дизайна на компилатора, се наричат ​​лексикални анализатори или лексери. Лексерът съдържа токенизатор или скенер. Ако лексикалния анализатор открие, че токенът е невалиден, той генерира грешка. Ролята на лексикалния анализатор в дизайна на компилатора е да чете потоци от символи от изходния код, да проверява за законни токени и да предава данните на анализатора на синтактиката, когато той изисква.

Пример

How Pleasant Is The Weather?

Вижте този пример за лексикален анализ; Тук можем лесно да разпознаем, че има пет думи Колко приятно, Времето, е. Това е много естествено за нас, тъй като можем да разпознаем разделителите, празните места и символа за пунктуация.

 HowPl easantIs Th ewe ather?

Сега, проверете този пример, ние също можем да прочетем това. Това обаче ще отнеме известно време, защото сепараторите са поставени на странните места. Това не е нещо, което ви идва веднага.

Основни терминологии

Какво е лексема?

Лексема е поредица от знаци, които са включени в изходната програма според съвпадащия модел на токен. Това не е нищо друго освен екземпляр на токен.

Какво е токен?

Токените в дизайна на компилатора са поредица от знаци, която представлява единица информация в изходната програма.

Какво е Pattern?

Моделът е описание, което се използва от токена. В случай на ключова дума, която се използва като токен, шаблонът е поредица от знаци.

Лексикален анализатор 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 Ключова дума
максимален Identifier
( OperaTor
Int Ключова дума
x Identifier
, OperaTor
Int Ключова дума
Y Identifier
) OperaTor
{ OperaTor
If Ключова дума

Примери за нетокени

Тип Примери
коментар // Това ще сравни 2 числа
Директива за предпроцесор #включва
Директива за предпроцесор #define NUMS 8,9
Макро NUMS
Празно /n /b /t

Лексикални грешки

Поредица от знаци, която не е възможно да се сканира в нито един валиден токен, е лексикална грешка. Важни факти за лексикалната грешка:

  • Лексикалните грешки не са много чести, но трябва да се управляват със скенер
  • Неправилното изписване на идентификатори, оператори, ключови думи се считат за лексикални грешки
  • Обикновено лексикалната грешка се причинява от появата на някакъв незаконен знак, най-вече в началото на лексема.

Възстановяване на грешки в лексикален анализатор

Ето няколко най-често срещани техники за възстановяване на грешки:

  • Премахва един знак от оставащия вход
  • В паник режим последователните знаци винаги се игнорират, докато не достигнем добре оформен токен
  • Чрез вмъкване на липсващия знак в оставащия вход
  • Замяна на знак с друг знак
  • Транспонирайте два серийни знака

Лексикален анализатор срещу анализатор

Лексикален анализатор Анализатор
Програма за сканиране на въвеждане Извършете синтактичен анализ
Идентифицирайте токени Създайте абстрактно представяне на кода
Вмъкнете токени в таблицата със символи Актуализиране на записи в таблицата със символи
Генерира лексикални грешки Той генерира дърво за анализ на изходния код

Защо да разделяте Lexical и Parser?

  • Простотата на дизайна: Улеснява процеса на лексикален анализ и синтактичен анализ чрез елиминиране на нежелани токени
  • За подобряване на ефективността на компилатора: Помага ви да подобрите ефективността на компилатора
  • Специализация: могат да се прилагат специализирани техники за подобряване на процеса на лексикален анализ
  • Преносимост: само скенерът изисква да комуникира с външния свят
  • По-висока преносимост: специфични за входното устройство особености, ограничени до лексера

Предимства на лексикалния анализ

  • Методът на лексикалния анализатор се използва от програми като компилатори, които могат да използват анализираните данни от кода на програмиста, за да създадат компилиран двоичен изпълним код
  • Използва се от уеб браузъри за форматиране и показване на уеб страница с помощта на анализирани данни от JavsScript, HTML, CSS
  • Отделен лексикален анализатор ви помага да конструирате специализиран и потенциално по-ефективен процесор за задачата

Недостатък на лексикалния анализ

  • Трябва да отделите значително време за четене на изходната програма и разделянето й под формата на токени
  • Някои регулярни изрази са доста трудни за разбиране в сравнение с правилата на PEG или EBNF
  • Необходими са повече усилия за разработване и отстраняване на грешки в лексера и неговите описания на токени
  • Необходими са допълнителни разходи по време на изпълнение, за да се генерират таблиците на лексерите и да се конструират токените

Oбобщение

  • Лексикалният анализ е първата фаза в дизайна на компилатора
  • Лексемите и токените са поредица от знаци, които са включени в изходната програма според съвпадащия модел на токен
  • Лексикалният анализатор е внедрен за сканиране на целия изходен код на програмата
  • Лексикалният анализатор помага да се идентифицира токен в таблицата със символи
  • Поредица от знаци, която не е възможно да се сканира в нито един валиден токен, е лексикална грешка
  • Премахва един знак от оставащия вход е полезен Метод за възстановяване на грешка
  • Лексикалният анализатор сканира входната програма, докато анализаторът извършва синтактичен анализ
  • Улеснява процеса на лексикален анализ и синтактичен анализ чрез елиминиране на нежелани токени
  • Лексикалният анализатор се използва от уеб браузърите за форматиране и показване на уеб страница с помощта на анализирани данни от JavsScript, HTML, CSS
  • Най-големият недостатък на използването на лексикален анализатор е, че се нуждае от допълнително време за изпълнение, за да се генерират таблиците на лексерите и да се конструират токените