|
||||||||||||||||||||||||||||||||||||||||||||||||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Програмування обробника синтаксичних помилокТреба доповнити таблицю переходів ПСА (п.4.8) інформацією про сутність помилки при попаданні в «не правильні комірки» таблиці та розширити програмне забезпечення п.4.8. Для наведеної вище граматики опису змінних заплануємо текстове пояснення таких синтаксичних помилок: 1) замість ключового слова var записано інше, наприклад, vart – при наборі зачипили літеру t (на клавіатурі r і t розташовані поруч). Лексичний аналізатор розпізнає vart як токен “ідентификатор” (id). vart a12: char;
В комірку М[<оператор_опису_змінних>, id ] поміщуємо call error#1(“vart”). 2) У списку змінних між двома змінними замість коми проставлено інший символ, наприклад, крапка (переплутано регістр при наборі в українському алфавіті). var a12.bc: integer;
Оскільки у таблиці аналізу відсутня комірка М[<спис_імен_зм2>, “. ”], до неї нового не додаємо. 3) Після списку змінних замість роздільника “: ” стоїть інший символ: var a12;char;
В комірку М<спис_імен_зм2>, “; ”] поміщуємо call error#3(“ Перед типом змінних має бути символ двокрапки, а не крапки з комою ”).
Граматика, таблиця аналізу якої не має множинних записів, називається LL(1). Перше " L " означає перегляд вхідного потоку зліва направо, друге " L "– ліве породження, а " 1 " – перегляд одного символу із вхідного потоку на кожному кроці для прийняття рішення про подальші дії. Можна показати, що алгоритм 5.2 для кожної LL(1)-граматики G будує таблицю аналізу, що розбирає всі речення G, і тільки їх. LL(1)-граматики мають ряд відмітних властивостей. Така граматика не може бути неоднозначною або ліворекурсивною. Можна також показати, що граматика G є LL(1)-граматикою тоді й тільки тоді, коли для будь-яких двох різних її продукцій А::= α | β виконуються наступні умови. 1. Не існує такого термінала а, для якого і α, і β породжують рядок, що починається з а. 2. Порожній рядок може породжувати тільки одна із продукций αабо β. 3. Якщо β →* ε, то α не породжує ні один рядок, що починається з термінала із FOLLOW(A). Ясно, що граматика (4.11) для арифметичних виразів є LL(1)-граматикою. Граматика ж (4.13), що моделює інструкції if-then-else, не є такою. Залишається питання, що робити, якщо таблиця аналізу має комірки з декількома записами. Один вихід полягає в перетворенні граматики, що усуває ліву рекурсію, і її лівої факторизації, в надії одержати граматику, в таблиці аналізу якої відсутні комірки з декількома записами. На жаль, є граматики, ніякі зміни яких не приведуть до LL(1) -граматики. Прикладом може служити граматика (4.13). Як ми бачили, граматику (4.13) можна аналізувати за допомогою предиктивного синтаксичного аналізатора шляхом вибору M[S',е] = { S' →eS}. Взагалі ж, не існує універсальних правил, за допомогою яких комірки з декількома записами можна перетворити в однозначні без певного впливу на мову, розпізнавану синтаксичним аналізатором. Основна складність у використанні предиктивного аналізу складається в написанні для вхідної мови такої граматики, що дозволяє побудувати предиктивнй синтаксичний аналізатор. Хоча усунення лівої рекурсії й ліва факторизация прості в реалізації, вони роблять граматику нечитабельною і важкою для трансляції. Звичайна організація синтаксичного аналізатора в компіляторі полягає у використанні предиктивного синтаксичного аналізатора для керуючих конструкцій і визначення пр. Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.003 сек.) |