АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Програмування обробника синтаксичних помилок

Читайте также:
  1. PHP – скриптова мова програмування
  2. Виправлення помилок і зміни у фінансових звітах.
  3. Виявлення помилок і шахрайства
  4. Візуальна мова програмування Бейсік для додатків: Visual Basic for Applications (VBA)
  5. Геометричні методи та лінійне програмування.
  6. Державне програмування та прогнозування економіки.
  7. Дії аудитора при виявленні помилок і шахрайства.
  8. Загальне поняття про документи(5), вимоги, щодо них ставляться(5), класифікація документів(7), методи виправлення помилок в документах і регістрах (8)
  9. Зредагуйте текст, перекладений електронним перекладачем, відповідно до норм української літературної мови. Укажіть характер помилок.
  10. Інструментарій технології програмування
  11. Лабораторний практикум побудови синтаксичних аналізаторів.
  12. Метод рекурсивного спуску програмування синтаксичних аналізаторів

Треба доповнити таблицю переходів ПСА (п.4.8) інформацією про сутність помилки при попаданні в «не правильні комірки» таблиці та розширити програмне забезпечення п.4.8.

Для наведеної вище граматики опису змінних заплануємо текстове пояснення таких синтаксичних помилок:

1) замість ключового слова var записано інше, наприклад, vart – при наборі зачипили літеру t (на клавіатурі r і t розташовані поруч). Лексичний аналізатор розпізнає vart як токен “ідентификатор” (id).

vart a12: char;

Вміст стеку Вхідий рядок Правило з таблиці М[X,a]
$ <оператор_опису_змінних> vart a12:char;  
    Error#1.Неправильне ключове слово vart. Має бути var.

В комірку М[<оператор_опису_змінних>, id ] поміщуємо call error#1(“vart”).

2) У списку змінних між двома змінними замість коми проставлено інший символ, наприклад, крапка (переплутано регістр при наборі в українському алфавіті).

var a12.bc: integer;

Вміст стеку Вхідий рядок Правило з таблиці М[X,a]
$ <оператор_опису_змінних> var a12.bc: integer;  
$<тип_змінних>:<список_імен_змінних> var var a12.bc: integer; оператор_опису_змінних>→ var <список_імен_змінних>: <тип_змінних>;
$ <тип_змінних>:<спис_імен_зм2>; id a12.bc: integer; <список_імен_змінних> → id<спис_імен_зм2>;
$ <тип_змінних>:<спис_імен_зм2> .bc: integer;  
    Error#2. Символ крапки відсутній у таблиці аналізу. Замість символу крапки має бути або кома, якщо список змінних ще не закінчився, або символ двокрапки, якщо закінчився.

Оскільки у таблиці аналізу відсутня комірка М[<спис_імен_зм2>, “. ”], до неї нового не додаємо.

3) Після списку змінних замість роздільника “: ” стоїть інший символ:

var a12;char;

Вміст стеку Вхідий рядок Правило з таблиці М[X,a]
$ <оператор_опису_змінних> var a12;char;  
$<тип_змінних>:<список_імен_змінних> var var a12; char; оператор_опису_змінних>→ var <список_імен_змінних>: <тип_змінних>;
$ <тип_змінних>:<список_імен_змінних> a12; char;  
$ <тип_змінних>: <спис_імен_зм2> id a12: char; <список_імен_змінних> → id <спис_імен_зм2>;
$<тип_змінних>: <спис_імен_зм2> ; char;  
$ <тип_змінних>: ; char; <спис_імен_зм2> → ε;
    Error#3. Перед типом змінних має стояти символ двокрапки.

В комірку М<спис_імен_зм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}. Взагалі ж, не існує універсальних правил, за допомогою яких комірки з декількома записами можна перетворити в однозначні без певного впливу на мову, розпізнавану синтаксичним аналізатором.

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


1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |

Поиск по сайту:



Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.003 сек.)