[ Розробка та налагодження формальної мови ] | 3 | |
75 | _ | 3 |
76 | @ | 3 |
77 | ( | 3 |
7 серпня | ) | 3 |
Таблиця 2. Двулітерние термінальні символи
Адреса | Символ | KTL |
1 | <= | 3 |
2 | > = | 3 |
3 | <> | 3 |
Таблиця 3. Класи поточних літер
Символ | Клас |
Буква | 1 |
Цифра | 2 |
Допустимий символ | 3 |
Таблиця 4. Функції
Логічні ф-та (адреса) |
Not (1) |
And (2) |
Or (3) |
Функції (адреса) |
CBool (5) |
Format (6) |
GetAllSettings (7) |
Concat (8) |
Таблиця 5. Тип лексичної одиниці
Лексична одиниця | Тип | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
операція «=» | 1 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
операція «-» | 2 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
операція «*» | 3 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
операція «^» | 4 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
операція «\» | 5 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
операція «mod« | 6 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
роздільники «.», »,« | 7 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
нижнє підкреслення "_" | 8 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
лапки «@» | 9 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
операції порівняння | 10 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
службові слова | 11 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
умовний оператор | 2 Січень | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
оператор циклу | 3 січня | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
тип даних | 1 квітня | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
елементи управління | 1 травня | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
оператор циклу | 1 червня | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
події елементів управління | 1 липня | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
властивості елементів управління | 18 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
спеціальні константи | 19 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
логічні функції | 20 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
функції | 21 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
десяткові а цілий а констант а | 22 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ідентифікатор | 23 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
назва функції | 24 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
псевдонім функції
Для кожної лексичної одиниці складаємо автоматну граматику. Ідентифікатор: S = б K K = б K | ЦК |% F | # F Десяткова ціла константа: S = «ц» D D = «ц» D | e 2 F Ступінь: S = «^» F Розподіл: S = «\» F C мiщення: S = «+» F Знаки відносини: S = «<» A | «>» B | «=» F A = «=» D | «>« D | e 3 F B = «=» D | e 4 F D = e 5 F Дужки відкр ивающая «(»: S = «(« F Дужка закриваюча »)»: S = «)» F Операція «=»: S = «=» F Точка «.»: S = «.» F Нижня підкреслення «_»: S = «_» F Функції, службові слова, спеціальні константи, логічні функції, елементи управління, події, властивості елементів управління, псевдонім функцій резервуємо, тому для них автоматної граматики не будуємо. Схема узагальненого кінцевого автомата Сканер виконує наступні дії: 1. Виділяє лексичні одиниці. 2. Класифікує лексичні одиниці. 3. Визначає лексичні помилки; 4. Створює деякі внутрішні форми подання - таблиці стандартних символів (ТСС). Побудуємо узагальнений автомат для всього сканера (схема сканера). Для цього об'єднаємо початкові символи опису всіх лексем в стартову вершину. Схема сканера наведена нa Рис. 12. У даному сканері використані наступні скорочення: A - вхідна ланцюжок; NA - кількість символів вхідний ланцюжка; TL - поточна літера; NTL - номер поточної літери; KTL - клас поточної літери; TLE - тип лексичної одиниці; LE - лексична одиниця; MDLE - максимальна довжина лексичної одиниці; NLE - поточна довжина LE; ALE - компонента запису ТСС, яка визначає адресу лексичної одиниці у відповідній таблиці. На рис. 12 зображена схема сканера
Рис. 12. Схема сканера Семантичні підпрограми сканера Кінцевий автомат необхідно довизначити семантичними підпрограмами для того, щоб він був перетворений у сканер. В основі роботи семантичних підпрограм лежать найпростіші дії з перетворення рядків: 1) виділення поточної літери; 2) об'єднання рядків; 3) виконання арифметичних операцій. У даному сканері задіяні такі підпрограми: Підпрограма PODGOT (підготовка): NTL = 0; NLE = 0; TLE = A [NTL]; KTL = KLASS (TL); {визначаємо клас TL} STRCOPY (LE, "»); Підпрограма TIP (визначення типу): IF KTL = 2 {цифра} THEN {можна визначити тип лексичної одиниці} TLE = 2; MDLE = 7; ELSE ERROR («помилка»); Підпрограма BKL (включення): NLE + +; IF NLE> MDLE THEN ERROR («помилка») ELSE LE = LE | | TL; Підпрограма SLL (наступна літера) NTL + +; TL = A [NTL]; KTL = klass (TL); Підпрограма ZAPTAB (LE, TLE, ALE, REZ): Здійснює пошук лексичної одиниці в ТК. Для постійних таблиць ця підпрограма тільки визначає адресу LE, проте, в тимчасові таблиці вона ще й записує лексичну одиницю. Запис елемента в ТСС можна здійснити за допомогою процедури OUT (TLE, ALE). Таблиці сканера для тестової ланцюжка Private Sub D11 () Dim A As Integer, B% As Integer Const D As Single Dim M (2) As Integer A = (B / 2 + 9) ^ 10 If ((IsNumeric (A) <> 0 and A> 0 ) Then MsgBox («A is number», vbOkOnly) EndIf Text. Text = A End Sub Таблиця 6. Константи
Таблиця 7. Ідентифікатори
Таблиця 8. Стандартні символи
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
A | 21 | 1 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
As | 10 | 10 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Integer | 13 | 13 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
, | 6 | 74 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
B% | 21 | 2 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
As | 10 | 10 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Integer | 13 | 13 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Const | 10 | 10 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
D | 21 | 3 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
As | 10 | 10 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Single | 13 | 13 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
A | 2 Січень | 1 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
= | 1 | 65 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
( | 22 | 77 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
B% | 21 | 2 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
, | 6 | 74 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
B% | 21 | 2 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
/ | 5 | 70 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
2 | 20 | 2 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
+ | 2 | 69 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
9 | 20 | 4 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
) | 23 | 78 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
^ | 3 | 68 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
10 | 20 | 3 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
If | 11 | 11 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
( | 2 лютого | 78 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
( | 2 лютого | 78 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
IsNumeric | 19 | 2 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
( | 2 лютого | 77 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
A | 21 | 1 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
) | 2 Березня | 78 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
<> | 9 | 67 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
0 | 20 | 3 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
and | 18 | 1 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
A | 21 | 1 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
> | 9 | 66 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
0 | 20 | 3 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
) | 23 | 78 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Then | 11 | 11
Налагодження формальної граматики Налагодження граматики - це процес перетворення граматики до виду, що задовольняє використовуваний метод синтаксичного аналізу. У вихідній граматиці 42 конфлікту. Серед них зустрічаються конфлікти трьох типів: Конфлікти типу = <
Рис. 13. Конфлікт типу = < Для того, щоб показати як налагодити цей конфлікт, розглянемо його на прикладі: З рисунка 3. 13 в ідно, що між термінальним символом «(» та нетермінальним uslovie конфлікт типу = <. Щоб його налагодити необхідно опустити нетермінал uslovie вниз по дереву. Таким чином, між символами «(» та uslovie залишилося тільки ставлення <. Всі інші конфлікти цього типу вирішуються аналогічно. Конфлікт типу => Щоб показати як вирішуються конфлікти цього типу, дозволимо конфлікт між символами Вody і Еnd. Цей конфлікт зображений на малюнку 15.
Рис. 15. Конфлікт типу => Синтаксичний аналіз У процесі синтаксичного аналізу потрібно для декількох пропозицій вхідного мови побудувати синтаксичне дерево, провести синтаксичний розбір методом простого передування. Завдання синтаксичного аналізатора: 1) виділення синтаксичних одиниць; 2) визначення всіх синтаксичних помилок (якщо вони є); 3) перетворення таблиці стандартних символів (ТСС) в деяку внутрішню форму представлення програми (ВФПП). Схема програми синтаксичного аналізатора Схема програми синтаксичного аналізу методом простого передування наведена в графічному додатку (Лист1). Прийняті позначення: X - масив символів аналізованої ланцюжка; MP - матриця простого передування; P - множина правил граматики, які описують мова; ST - стік для визначення хвоста основи; ST 1 - стек для визначення голови основи; TL - поточна літера; NTL - номер поточної літери; OSN - масив, в якому буде накопичуватися основа; NOSN - кількість символів в масиві OSN (поточну кількість символів в основі); A -> , де - права частина правила, яка збігається з масивом OSN, A - ліва частина правила, на яку замінюється основа; REZ - результат. Щоб виділити основу необхідно спочатку знайти кінець основи, а потім її початок, після чого виділяється основа (блоки J 2 - O 8). Якщо після виділення рядка OSN знаходиться правило, у якого права частина правила збігається з OSN те, змінної REZ присвоюється 1, якщо такого правила немає - помилка, синтаксичний аналіз може бути припинено або потрібно виправити помилку (блок R 8). Операції виконуються над рядковими змінними: st. push (i) - помістити елемент i в стек; st. pop () - видалити елемент з стека; st. top () - отримати доступ до вершини стека; st. nst () - визначити кількість елементів в стеку. Робота даного алгоритму представлена в таблиці синтаксичного аналізу в графічному додатку (Лист1). Висновок У процесі виконання курсової роботи були розроблені синтаксичний і лексичний аналізатори, семантичні процедури для сканера, а також був розроблений алгоритм, який реалізує синтаксичний аналіз методом простого передування. У цілому мова виправдав надії, покладені на нього на початку роботи, і вийшов досить струнким і гнучким. Будь ласка, не зберігайте тестовий текст. |