Какво е лексикален анализ?
ЛЕКСИЧЕН АНАЛИЗ е първата фаза в проектирането на компилатора. Lexer взема модифицирания изходен код, който е написан под формата на изречения. С други думи, това ви помага да конвертирате последователност от символи в последователност от символи. Лексикалният анализатор разбива този синтаксис на поредица от символи. Той премахва излишното пространство или коментар, написани в изходния код.
Програмите, които извършват лексикален анализ, се наричат лексикални анализатори или лекси. Лексерът съдържа токенизатор или скенер. Ако лексикалният анализатор открие, че маркерът е невалиден, той генерира грешка. Той чете потоци от символи от изходния код, проверява за законни маркери и предава данните на анализатора на синтаксиса, когато поиска.
Пример
How Pleasant Is The Weather?
Вижте този пример; Тук можем лесно да разпознаем, че има пет думи колко е приятно, времето, времето. Това е много естествено за нас, тъй като можем да разпознаем разделителите, заготовките и пунктуационния символ.
HowPl easantIs Th ewe ather?
Сега, проверете този пример, ние също можем да прочетем това. Това обаче ще отнеме известно време, тъй като се добавят разделители в странните места. Това не е нещо, което идва при вас веднага.
В този урок ще научите
- Основни терминологии:
- Архитектура на лексикален анализатор: Как се разпознават символите
- Роли на лексикалния анализатор
- Лексикални грешки
- Възстановяване на грешки в лексикален анализатор
- Лексикален анализатор срещу парсер
- Защо да разделяме Lexical и Parser?
- Предимства на лексикалния анализ
- Недостатък на лексикалния анализ
Основни терминологии
Какво е лексема?
Лексема е поредица от символи, които са включени в програмата-източник според съответстващия модел на маркер. Това не е нищо друго освен екземпляр на символ.
Какво е знак?
Токенът е последователност от символи, която представлява единица информация в програмата източник.
Какво е Pattern?
Шаблонът е описание, което се използва от маркера. В случай на ключова дума, която използва като символ, моделът е последователност от символи.
Архитектура на лексикален анализатор: Как се разпознават символите
Основната задача на лексикалния анализ е да чете въведени символи в кода и да произвежда жетони.
Лексикалният анализатор сканира целия изходен код на програмата. Той идентифицира всеки жетон един по един. Обикновено скенерите се прилагат, за да произвеждат токени само при поискване от анализатор. Ето как работи това-
- „Get next token“ е команда, която се изпраща от анализатора към лексикалния анализатор.
- При получаване на тази команда лексикалният анализатор сканира входа, докато намери следващия маркер.
- Той връща маркера на Parser.
Lexical Analyzer пропуска интервалите и коментарите, докато създава тези маркери. Ако има някаква грешка, тогава Лексикалният анализатор ще свърже тази грешка с изходния файл и номера на реда.
Роли на лексикалния анализатор
Лексикалният анализатор изпълнява следните задачи:
- Помага за идентифициране на символа в таблицата със символи
- Премахва празни пространства и коментари от програмата източник
- Съпоставя съобщенията за грешки с програмата източник
- Помага ви да разширите макросите, ако са намерени в програмата източник
- Прочетете входните символи от програмата източник
Пример за лексикален анализ, токени, нетокени
Помислете за следния код, който се подава към Lexical Analyzer
#includeint maximum(int x, int y) {// This will compare 2 numbersif (x > y)return x;else {return y;}}
Примери за създадени жетони
Лексема | Жетон |
инт | Ключова дума |
максимум | Идентификатор |
( | Оператор |
инт | Ключова дума |
х | Идентификатор |
, | Оператор |
инт | Ключова дума |
Y. | Идентификатор |
) | Оператор |
{ | Оператор |
Ако | Ключова дума |
Примери за Nontokens
Тип | Примери |
Коментирайте | // Това ще сравни 2 числа |
Директива преди процесора | #include |
Директива преди процесора | #define NUMS 8,9 |
Макро | БРОЯ |
Пробел | / n / b / t |
Лексикални грешки
Последователност от символи, която не е възможно да се сканира във всеки валиден маркер, е лексикална грешка. Важни факти за лексикалната грешка:
- Лексикалните грешки не са много чести, но трябва да се управляват от скенер
- Погрешно изписване на идентификатори, оператори, ключови думи се считат за лексикални грешки
- Като цяло лексикалната грешка се причинява от появата на някакъв нелегален знак, най-вече в началото на символа.
Възстановяване на грешки в лексикален анализатор
Ето няколко най-често срещани техники за възстановяване на грешки:
- Премахва един знак от останалия вход
- В режим на паника последователните символи винаги се игнорират, докато достигнем добре оформен знак
- Чрез вмъкване на липсващия знак в останалия вход
- Заменете знак с друг
- Транспонирайте два серийни знака
Лексикален анализатор срещу парсер
Лексикален анализатор | Парсер |
Програма за въвеждане на сканиране | Извършете анализ на синтаксиса |
Идентифицирайте жетоните | Създайте абстрактно представяне на кода |
Поставете символи в таблицата със символи | Актуализиране на записите в таблицата със символи |
Той генерира лексикални грешки | Той генерира дърво за синтактичен анализ на изходния код |
Защо да разделяме Lexical и Parser?
- Простотата на дизайна: Улеснява процеса на лексикален анализ и анализ на синтаксиса чрез елиминиране на нежелани лексеми
- За подобряване на ефективността на компилатора: Помага ви да подобрите ефективността на компилатора
- Специализация: могат да се прилагат специализирани техники за подобряване на процеса на лексикален анализ
- Преносимост: само скенерът изисква комуникация с външния свят
- По-висока преносимост: специфични за входното устройство особености, ограничени до лексера
Предимства на лексикалния анализ
- Методът на лексикален анализатор се използва от програми като компилатори, които могат да използват анализираните данни от код на програмист, за да създадат компилиран двоичен изпълним код
- Използва се от уеб браузърите за форматиране и показване на уеб страница с помощта на анализирани данни от JavsScript, HTML, CSS
- Отделен лексикален анализатор ви помага да създадете специализиран и потенциално по-ефективен процесор за задачата
Недостатък на лексикалния анализ
- Трябва да отделите значително време за четене на програмата източник и разделянето й под формата на символи
- Някои регулярни изрази са доста трудни за разбиране в сравнение с правилата на PEG или EBNF
- Необходими са повече усилия за разработване и отстраняване на грешки на лексера и неговите описания на маркери
- Необходими са допълнителни режийни времена за изпълнение, за да се генерират таблиците на lexer и да се конструират маркерите
Обобщение
- Лексикалният анализ е първата фаза в проектирането на компилатора
- Лексема е поредица от символи, които са включени в програмата-източник според съответстващия модел на маркер
- Лексикален анализатор е реализиран за сканиране на целия изходен код на програмата
- Лексикалният анализатор помага да се идентифицира символът в таблицата със символи
- Последователност от символи, която не е възможно да се сканира във всеки валиден маркер, е лексикална грешка
- Премахва един знак от останалия вход е полезен метод за възстановяване на грешки
- Lexical Analyzer сканира програмата за въвеждане, докато парсерът извършва синтаксисен анализ
- Улеснява процеса на лексикален анализ и анализ на синтаксиса, като елиминира нежеланите лексеми
- Лексикалният анализатор се използва от уеб браузърите за форматиране и показване на уеб страница с помощта на анализирани данни от JavsScript, HTML, CSS
- Най-големият недостатък на използването на лексикален анализатор е, че се нуждае от допълнителни режийни времена за изпълнение, за да се генерират таблиците на лексика и да се конструират токените