Теория языков программирования

  • 02 окт. 2012 г.
  • 1570 Слова
Содержание

Введение 3
Постановка задачи 5
Структурная схема программы 6
Текст программы 8
Результат работы программы 13
Заключение 16
Литература 17

Введение



В информатике лексический анализ – процесс аналитического разбора входной последовательности символов (например, такой как исходный код на одном из языков программирования) с целью получения на выходе последовательности символов,называемых «токенами» (подобно группировке букв в словах). При этом, группа символов входной последовательности, идентифицируемая на выходе процесса как токен, называется лексема, т.е. в процессе лексического анализа производится распознавание и выделение лексем из входной последовательности символов.
Как правило, лексический анализ производится с точки зрения определённого языка или набора языков.Язык, а точнее его грамматика, задаёт определённый набор лексем, которые могут встретиться на входе процесса.
Традиционно принято организовывать процесс лексического анализа, рассматривая входную последовательность символов, как поток символов. При такой организации, процесс самостоятельно управляет выборкой отдельных символов из входного потока.
Распознавание лексем в контекстеграмматики обычно производится путём их идентификации (или классификации), согласно идентификаторов (или классов) токенов, определяемых грамматикой языка. При этом, любая последовательность символов входного потока (лексема), которая, согласно грамматике, не может быть идентифицирована как токен языка, обычно рассматривается как специальная токен-ошибка.
Каждый токен можно представить в виде структуры,содержащей идентификатор токена (или идентификатор класса токена) и, если нужно, последовательность символов лексемы выделенной из входного потока (строку, число и т.д.).
Цель такой конвертации обычно состоит в том, чтобы подготовить входную последовательность для другой программы, например, для грамматического анализатора, и избавить его от определения лексических подробностей в контекстно-свободной грамматике(что привело бы к усложнению грамматики).

Постановка задачи



Разработать программу на языке C++ по выполнению лексического анализа для языка программирования, удовлетворяющего ниже перечисленным требованиям.


Упрощенный язык программирования должен обязательно включать:
1. Оператор присваивания "=" и арифметическую операцию сложения "+"
2. Оператор условия, построенный всоответствии с предложенным синтаксисом конструкции:
IF <условие> THEN BEGIN <операторы> END;
здесь <условие> задается одной из форм: ab;
3. Оператор вывода переменных
WRITE (<список переменных через запятую>);
4. Программа языка имеет структуру
VAR <список переменных через запятую >: INTEGER
BEGIN <операторы программы> END


На фазе лексического анализа необходимовыделить лексемы, закодировать их и поместить в таблицу идентификаторов. Для этого необходимо выделить символы операций, имена переменных и служебные слова, которые определены в задании на контрольную работу.
Исходные данные берутся из текстового файла, на выходе генерируется три файла: таблица лексем, таблица идентификаторов, а также протокол работы программы.

Структурная схема программыПрограмма разбита на 10 функций:
1. void ust() – начальная установка, заполнение таблицы идентификаторов всеми служебными словами, предварительно зарезервированными в таблице кодов лексем
2. void input() – ввод исходного текста
3. void out() – формирование результатов в виде файлов: cod.lex, ident.lex
4. int bukva(char a) – распознавание буквы - true(1), иначеfalse(0)
5. int cifra(char a) – распознавание цифры - true(1), иначе false(0)
6. int l_ident(int i) – размер идентификатора (количество символов, входящих в образование имени лексемы)
7. int l_const(int i) – размер цифровой константы ( начало i, конец k )
8. void ttin(int kk, char* str, int *kod, int *typ) – Определение типа и кода лексемы,...
tracking img