Разработка сканера, который считывает литеры первоначальной, исходной программы и строит символы, исходной программы. Глобальные переменные и необходимые подпрограммы. Диаграмма состояний. Текст программы. Инструкция пользователю. Тестовый пример.
Аннотация к работе
Таким образом требуется разработать сканер, который считывает литеры первоначальной, исходной программы и строит слова, или иначе символы, исходной программы (идентификаторы, служебные слова, одно-или двулитерные разделители). 2. int Class, где Class содержит целое число, которое характеризует класс литеры, находящейся в с. Будем считать, что если Class = 1 то это цифра, Class = 2 - буква, Class = 3 - литера ‘{‘, Class = 4 - оператор, Class = 5 - недопустимое выражение. Под первой дугой, ведущей к состоянию S, записана команда init, которая указывает на необходимость выполнения подготовительных действий и начальных установок, а именно проверка содержимого с, и если там пробел, то повторно вызывается void Getchar(char, int&) до тех пор, пока в с не окажется литера, отличная от пробела если команда init определит конец файла то программа будет завершена. В состоянии Print int печатается определенное программой целое число, в Print sl - служебное слово, в Print log - логическая операция, в Print id - идентификатор, в Print com - комментарий, в Print error - недопустимое выражение.1.Служебное слово :Пока 2.
План
Содержимое файла: Пока {*(ldfjvkdfvfjkb*}
Вещественный =
Введите имя файла вывода: put.txtСодержимое файла:
Введение
На сегодняшний момент существует огромное количество разнообразных языков программирования. Все они имеют свою историю, свою область применения, и перечислять даже наиболее известные из них не имеет смысла. Но все эти языки построены на основе одних и тех же принципов, основы которых определяет теория формальных языков и грамматик.
1.
Постановка задачи: 1.1. Задание: В данной контрольно-курсовой работе необходимо выполнить лексический анализ текста программы на некотором условном языке программирования. Таким образом требуется разработать сканер, который считывает литеры первоначальной, исходной программы и строит слова, или иначе символы, исходной программы (идентификаторы, служебные слова, одно- или двулитерные разделители).
Символами в языке, для которого необходимо разработать сканер являются: 1.Служебные слова: Цикл …;
1.2. Глобальные переменные и необходимые подпрограммы: Для работы сканера требуются следующие переменные и подпрограммы: 1. char c, где c - глобальная переменная, значением которой всегда будет сканируемая литера исходной программы.
2. int Class, где Class содержит целое число, которое характеризует класс литеры, находящейся в с. Будем считать, что если Class = 1 то это цифра, Class = 2 - буква, Class = 3 - литера ‘{‘, Class = 4 - оператор, Class = 5 - недопустимое выражение.
3. char s[20] - массив который будет содержать цепочку литер, составляющих символ.
4. void Getchar(char, int&) - функция, задача которой состоит в том, чтобы выбрать следующую литеру исходной программы и поместить ее в с, а класс литера в Class.
5. int LOOKUP(char* ) - функция которая осуществляет поиск символа, набранного в s, по таблице служебных слов и логических операций. Если символ является служебным словом, то LOOKUP возвратит 1, если символ это логическая операция то LOOKUP вернет 2, в противном случае функция вернет 3.
1.3. Диаграмма состояний: Метка D используется вместо любой из меток 0, 1, 2, … , 9, т. е. D представляет класс цифр. Это делается для упрощения диаграммы. Аналогично метка L представляет класс буквы А, Б, … , Я, а, б, … , я, а DELIM представляет класс разделителей (операторов). Литера { обрабатывается особым образом.
Некоторые дуги не помечены. Эти дуги будут выбраны, если сканируемая литера не совпадает ни с одной из литер, которыми помечены другие дуги.
Добавим семантику в диаграмму состояний. Введем команду Gc, сокращенно обозначив таки образом функцию void Getchar(char, int&). Под первой дугой, ведущей к состоянию S, записана команда init, которая указывает на необходимость выполнения подготовительных действий и начальных установок, а именно проверка содержимого с, и если там пробел, то повторно вызывается void Getchar(char, int&) до тех пор, пока в с не окажется литера, отличная от пробела если команда init определит конец файла то программа будет завершена. Команда ADD означает, что литера с добавляется к строке s. В состоянии Print int печатается определенное программой целое число, в Print sl - служебное слово, в Print log - логическая операция, в Print id - идентификатор, в Print com - комментарий, в Print error - недопустимое выражение. Из любого состояния Print дуги ведут в состояние S до тех пор, пока init не определит конец файла.
Рисунок 1. Диаграмма состояний с семантическими процедурами.
2. Текст программы: #include
#include
#include
#include
#include
#include
#include int Prov_itn(); //Проверка на ввод целого положительного числа int LOOKUP (char*); //Поиск символа по таблице служебных слов void Getchar(char,int&);//Определяет класс литеры void main()
//Проверка на ввод целого положительного числа int Prov_itn()
{ char k1[5],k2[5];
int nn;
cin>>k1;
nn=atoi(k1);
itoa(nn,k2,10);
if (strlen(k1)!=strlen(k2)) return 0;
return nn;
}
3. Инструкция пользователю: В данной программе пользователю предоставляется выбор из двух альтернатив: ввести текст вручную либо считать из файла. После выбора ввода программа в тексте определит служебные слова, идентификаторы, операторы, логические операции, комментарии, если таковые имеются.
4. Тестовый пример: ---------------------
¦ 1.Ввод с клавиатуры.¦
¦ 2.Ввод с файла. ¦
---------------------
Ваш выбор:2
Введите имя файла ввода: in.txt
Список литературы
В настоящей работе была показана работа сканера, при которой выполняется полный лексический анализ исходной программы.
Список использованных источников: 1. Грис Д. Конструирование компиляторов для цифровых вычислительных машин. М.: Мир, 1975;
2. Хантер Р. Проектирование и конструирование компиляторов. М.: Финансы и статистика, 1984.