Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсовая работа. / РЯП_Ксю / Other / tyap / Приложение С Спецификация программы.doc
Скачиваний:
15
Добавлен:
01.05.2014
Размер:
71.17 Кб
Скачать

3 Таблицы (метки, переменные, стоковые константы) создаются пустыми.

Таблицы типов после инициализации содержат стандартные типы, а потом дополняются пользовательскими типами.

Таблицы констант после инициализации содержат две стандартные константы: true, false.

Эти таблицы создаются во время заполняются во время анализа программы.

Типы

Константы

Метки

Переменные

Строковые константы

Код

Имя

Код стандарт- ного типа

Код

Имя

Тип

Значение

Код

Имя

Код

Имя

Тип

Код

Имя

1

integer

1

1

true

6

0

1

1

1

2

byte

2

2

false

6

0

2

2

2

3

word

3

3

3

3

3

4

shortint

4

4

4

4

4

5

longint

5

5

5

5

5

6

boolean

6

6

7

boolmatr

7

7

8

9

10

11

// Чтение лексемы-слова

function GetLexW(s:String; var begi:integer):string;

Входные параметры: s - анализируемая строка; begi – индекс, с которого начинается анализ строки.

Выходные параметры: begi – индекс, которым заканчивается анализ строки; результат функции - прочитанная лексема.

Алгоритм:

Читаем строку, пока не встречается разделитель или конец строки, и читаемые символы - это латинские буквы или цифры или _. В случае если встретился не допустимый символ, выдается ошибка.

// Чтение лексемы-знака

function GetLexS(s:String; var begi:integer):string;

Входные параметры: s - анализируемая строка, begi – индекс, с которого начинается анализ строки.

Выходные параметры: begi – индекс, которым заканчивается анализ строки; результат функции - прочитанная лексема.

Алгоритм:

Если читаемый символ – буква русского алфавита, то ошибка.

Если читаемый символ - не может быть началом двойного символа, то он является результатом.

иначе, проверяется следующий символ, и проверяются сочетания.

Анализ одной строки.

procedure AnalysStr(s:string; var outs:string);

Входным параметром является строка исходной программы. Выходным параметром outs – строка лексем.

В процедуре анализируется строка и в случае ошибки изменяется глобальная переменная ErrorStr.

Алгоритм, представлен на диаграмме работы лексического анализатора.

procedure TfmMain.tbGoClick(Sender: TObject);

На входе в эту процедуру в поле mmInput уже загружен файл с анализируемой программой. В теле процедуры запускается лексический анализатор для строки в поле mmInput и в поле mmOutput выводится соответствующая ей закодированная стока.

В процедуре выдаются сообщения о следующих ошибках:

ErrorStr:='Необъявленная метка';

ErrorStr:='Метка '+lex+' необъявлена';

ErrorStr:='Идентификатор объявлен повторно';

ErrorStr:='Неверный идентификатор метки';

Errorstr:='Неверный идентификатор';

ErrorStr:='Идентификатор объявлен повторно';

ErrorStr:='Переменная в константном выражении';

Вспомогательные процедуры и функции.

procedure ChangeSect(var Lex:string);

lex – последняя считанная лексема

Процедура изменяет состояние переменной CurSect, в зависимости от текущей секции и текущей лексемы.

function DefineTypeLex(var Lex: string): TLexType;

Входной параметр lex – последняя считанная лексема

Выходной параметр Результат функции – тип лексемы

Алгоритм:

Если лексема пуста, то возвращается тип ltNone

Если текущая секция не тело программы, то тип лексемы соответствует типу секции,

иначе проверяется наличие лексемы в списках, в зависимости от того в каком списке она присутствует, возвращается соответствующий тип лексемы, иначе, выдается ошибка «Неопределенный идентификатор».

Обработка зарезервированных слов. Смена текущей секции.

procedure ResWord(Lex: string; var outs: string);

Входной параметр Lex - лексема.

Выходной параметр outs – строка лексем.

Алгоритм:

Если встречается незарезервированное слово, то выдается ошибка

Далее в зависимости от встреченного слова, происходит переключение на соответствующую секцию.

В выходной поток выдается текущая лексема

procedure SetSym(Lex: string; var Outs: string);

В выходной поток outs выводится табличный код символа.

function VerifyLabel(var i: word): boolean;

Проверка правильности использования меток в программе.

Входной параметр mmOutPut поток лексем.

Выходной параметр i номер строки, в которой найдена ошибка

Используемые поля и методы класса TstringList

Поля:

Count – число элементов в списке

Value[n] – обращение к n элементу

Методы

Add(s:string) – Добавить элемент s в конец списка

IndexOf(s:string):integer – Поиск элемента s в списке (возвращается номер, -1 в случае если s не найден)

Create - Конструктор

Free – деструктор

Для синтаксического анализа используются модули