p align="left">Таблица 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 | | условный оператор | 12 | | оператор цикла | 13 | | тип данных | 14 | | элементы управления | 15 | | оператор цикла | 16 | | события элементов управления | 17 | | свойства элементов управления | 18 | | специальные константы | 19 | | логические функции | 20 | | функции | 21 | | десятичная целая константа | 22 | | идентификатор | 23 | | название функции | 24 | | псевдоним функции | 25 | | библиотек | 26 | | открывающая скобка «(« | 27 | | закрывающая скобка «)» | 28 | | |
Для каждой лексической единицы составляем автоматную грамматику. Идентификатор: S = бK K = бK|цК|%F |#F Десятичная целая константа: S = «ц» D D = «ц» D | e2 F Степень: S = «^» F
Деление: S = «\» F Cложение: S = «+» F Знаки отношения: S = «<» A | «>» B | «=» F A = «=» D |«>«D| e3 F B = «=» D | e4 F D = e5 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. Константы |
Константа | Атрибуты | | | Тип | Запятая | Точность представления | Основание системы счисления | | 2 | integer | Нет | 1 | 10 | | 9 | integer | Нет | 1 | 10 | | 0 | integer | Нет | 1 | 10 | | 10 | integer | Нет | 1 | 10 | | |
Таблица 7. Идентификаторы |
Идентификатор | Атрибуты | Адрес идентификатора | | | Тип | Запятая | Основание системы счисления | | | A | integer | нет | 10 | 1 | | B% | integer | нет | 10 | 2 | | C | integer | нет | 10 | 3 | | D | Single | нет | 10 | 4 | | |
Таблица 8. Стандартные символы |
Лексическая единица | Тип лексической единицы | Адрес лексической единицы | | Private | 10 | 10 | | Sub | 10 | 10 | | D11 | 21 | 21 | | ( | 22 | 77 | | ) | 23 | 78 | | Dim | 10 | 10 | | 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 | 21 | 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 | | ( | 22 | 78 | | ( | 22 | 78 | | IsNumeric | 19 | 2 | | ( | 22 | 77 | | A | 21 | 1 | | ) | 23 | 78 | | <> | 9 | 67 | | 0 | 20 | 3 | | and | 18 | 1 | | A | 21 | 1 | | > | 9 | 66 | | 0 | 20 | 3 | | ) | 23 | 78 | | Then | 11 | 11 | | A | 21 | 1 | | = | 1 | 65 | | B | 21 | 2 | | EndIf | 11 | 11 | | Text | 14 | 14 | | . | 6 | 74 | | Text | 16 | 16 | | = | 1 | 65 | | A | 21 | 1 | | End | 10 | 10 | | Sub | 10 | 10 | | |
Отладка формальной грамматики Отладка грамматики - это процесс преобразования грамматики к виду, удовлетворяющему используемый метод синтаксического анализа. В исходной грамматике 42 конфликта. Среди них встречаются конфликты трех типов: Конфликты типа =< Рис. 13. Конфликт типа =< Для того, чтобы показать как отладить этот конфликт, рассмотрим его на примере: Из рисунка 3.13 видно, что между терминальным символом «(» и нетерминальным uslovie конфликт типа =<. Чтобы его отладить необходимо опустить нетерминал uslovie вниз по дереву. Таким образом, между символами «(» и uslovie осталось только отношение <. Все остальные конфликты этого типа разрешаются аналогично. Конфликт типа => Чтобы показать как разрешаются конфликты этого типа, разрешим конфликт между символами Вody и Еnd. Этот конфликт изображен на рисунке 15. Рис. 15. Конфликт типа => Синтаксический анализ В процессе синтаксического анализа требуется для нескольких предложений входного языка построить синтаксическое дерево, провести синтаксический разбор методом простого предшествования. Задачи синтаксического анализатора: 1) выделение синтаксических единиц; 2) определение всех синтаксических ошибок (если они есть); 3) преобразование таблицы стандартных символов (ТСС) в некоторую внутреннюю форму представления программы(ВФПП). Схема программы синтаксического анализатора Схема программы синтаксического анализа методом простого предшествования приведена в графическом приложении (лист1). Принятые обозначения: X - массив символов анализируемой цепочки; MP - матрица простого предшествованя; P - множество правил грамматики, которые описывают язык; ST - стек для определения хвоста основы; ST1 - стек для определения головы основы; TL - текущая литера; NTL - номер текущей литеры; OSN - массив, в котором будет накапливаться основа; NOSN - количество символов в массиве OSN (текущее количество символов в основе); A->?, где ? - правая часть правила, которая совпадает с массивом OSN, A - левая часть правила, на которую заменяется основа; REZ - результат. Чтобы выделить основу необходимо сначала найти конец основы, а затем ее начало, после чего выделяется основа (блоки J2 - O8). Если после выделения строки OSN находится правило, у которого правая часть правила совпадает с OSN то, переменной REZ присваивается 1, если такого правила нет - ошибка, синтаксический анализ может быть прекращен или нужно исправить ошибку (блок R8). Операции выполняемые над строковыми переменными: st.push(i) - поместить элемент i в стек; st.pop() - удалить элемент из стека; st.top() - получить доступ к вершине стека; st.nst() - определить количество элементов в стеке. Работа данного алгоритма представлена в таблице синтаксического анализа в графическом приложении (лист1). Заключение В процессе выполнения курсовой работы были разработаны синтаксический и лексический анализаторы, семантические процедуры для сканера, а также был разработан алгоритм реализующий синтаксический анализ методом простого предшествования. В целом язык оправдал надежды, возложенные на него в начале работы, и получился довольно стройным и гибким.
Страницы: 1, 2
|