Навіщо розділяти лексинг та розбір?


15

Можна проаналізувати документ за допомогою одного пропуску з державної машини. Яка користь мати два проходи, тобто. мати лексеру для перетворення тексту в лексеми та аналізатор для тестування правил виробництва для цих маркерів? Чому б не було єдиного пропуску, який застосовує правила виробництва безпосередньо до тексту?



2
Про це вже йшлося в CS, stackexchange, з багатьма дуже технічними коментарями у відповідь на Експресивна сила lexer + парсера . Але там можуть бути місця для подальших відповідей.
babou

Цікаво, чи паралелізм у стилі трубопроводу (хоч і сильно незбалансований етап) може бути побічною перевагою. Як інструкції, так і поведінка кешу даних також можуть бути цікавими. На скільки (якщо взагалі) таких скоротиться час компіляції, залежатиме від конкретного обладнання.
Пол А. Клейтон,

Одна досить очевидна (принаймні для мене) причина полягає в тому, що потім ви можете використовувати інструмент сканування окремо. На практиці я часто використовую flex для сканування вводу, але рідко потрібна вся потужність yacc.
jamesqf

Відповіді:


13

Не потрібно їх розділяти. Люди об'єднують їх у сканери без сканерів .

Основним недоліком парсерів, що не скануються, є те, що отримані граматики є досить складними - складнішими, ніж відповідна комбінація регулярного виразу, що робить лексінг, і без контекстної граматики, що робить аналіз на потоці токенів. Зокрема, граматики для сканування без сканера прагнуть до неоднозначності. Граматики, які працюють над токеновим потоком, легше усунути неоднозначність.

Прагматична перевага використання спеціальної фази попереднього лексингу полягає в тому, що ви не з’єднуєте наступний аналізатор з лексичними деталями. Це корисно під час розробки мови раннього програмування, коли лексичні та синтаксичні деталі все ще часто змінюються.


1
Наявність одного проходу замість двох проходів передбачає властивості закриття. Якщо ви вважаєте, що лексери є перетворювачами, що належать до формальної родини , які можуть поєднуватися з аналізаторами, що належать до формальної родини P , вам слід задуматися, чи складання їх залишається в одній родині P , чи потрібна більш складна формальна сім'я P T , таким чином, потрібна інша алгоритміка і, можливо, більш складна настройка синтаксису. Технологія розбору часто покладається на спеціалізовані сім'ї (наприклад, варіанти LR або LL), які можуть не мати належних властивостей закриття. TPPPT
бабу

@babou Так, це правильно. Я не знаю жодних формальних результатів форми регулярного вираження форми, складеної LL (k), виходить із LL (k), або подібного. Більше того, лексика зазвичай виконується не з звичайними мовами, а з чимось більш потужним, а саме звичайними мовами, розширеними з пріоритетами з найдовшою відповідністю та ключовими словами. Я не впевнений, що це точний клас мови та які його властивості закриття.
Мартін Бергер

2
Якщо ваш погляд вперед передбачає зчитування ідентифікатора, композиція вимагатиме необмеженого перегляду вперед, оскільки (в принципі) довжина ідентифікаторів не обмежена.
babou

@babou Я не впевнений. Якщо найдовше ключове слово становить 17 символів, то будь-який рядок, який довше, повинен бути ідентифікатором або лексично недійсним.
Мартін Бергер

Але ви ідентифікатор, або, можливо, рядок, число чи інший буквальний, - це послідовність більше 17 окремих символів, яка може стояти перед маркером, який вам дійсно потрібен. Це великий погляд вперед, без обмежень. Ви можете опинитися з недетермінованою мовою.
бабу
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.