Цель работы
Целью данной лабораторной работы является применение на практике алгоритма рекурсивного спуска на основе библиотеки обработки входной строки.
Инструменты
Для выполнения данной лабораторной работы Вам потребу-ется любой компилятор языка С, способный генерировать 32-раз-рядные программы для той ОС, с которой Вы работаете. Для ОС Windows рекомендуется использовать бесплатную среду разра-ботки Microsoft Visual C++ Express.
Основная Ваша работа будет заключаться в формировании программы перевода выражения в постфиксную запись, которая была разобрана на лекции. Для первичной обработки строк пред-лагается использовать модуль match.
Процедура рекурсивного спуска
prim()
{
int s;
if (match("(")) {
if (expr()==0) return 0;
if (!match(")")) { cerror(ERIGHTBRACKET); return 0; }
}
else if (a=numb(&s)) {
printf(”%d ”, s);
} else { cerror(EEXPRESSSINTAX); return 0; }
return 1;
}
mult()
{
if (prim()==0) return 0;
while (1) {
if (match("*")) {
if (prim()==0) return 0;
printf(”* ”);
} else if (match("/")) {
if (prim()==0) return 0;
printf(”/ ”);
} else break;
}
return 1;
}
add()
{
if (mult()==0) return 0;
while (1) {
if (match("+")) {
if (mult()==0) return 0;
printf(”+ ”);
} else if (match("-")) {
if (mult()==0) return 0;
printf(”- ”);
} else break;
}
return 1; }
Модуль match
Данный модуль предназначен для первичной обработки строк и позволяет выделять из строки лексемы. Здесь описаны интерфейсные функции модуля match.
void match_init(char* line);
Процедура инициализации. Разбор строки всегда начинается с вызова этой функции. В качестве параметра передается входная строка.
void match_done(void);
Процедура деинициализации. После разбора строки необхо-димо вызвать данную функцию.
int match(char *lit);
Поиск указанной подстроки в начале входной строки. Если есть, то найденная подстрока удаляется и функция возвращает 1.
int amatch(char *lit, int len);
Аналогично предыдущему, но дополнительно указывается длина подстроки. Это используется для того, чтобы различать выражения типа ’for’ и ’formula’, где первое, это ключевое слова, а второе — идентификатор.
int symname(char *sname);
Ищет идентификатор (метку) во входной строке. Метка на-чинается с подчеркивания или буквы, далее следуют буквы, под-черкивание или цифры.
int number(int val[]);
Ищет целое знаковое число во входной строке
void skipblanks(void);
Пропускает последовательность пробельных символов (пробел, табуляция) во входной строке.
skipchars(void);
Пропускает лексемы и следующие пустые символы. Ис-пользуется для обработки ошибок.
Задание
1. Реализовать программу рекурсивного спуска выражения и перевода в постфиксный вид.
2. Реализовать главную программу, считывающую строки из входного потока и выдающую в конце сообщения «OK» в случае успешного разбора или «FAIL» в случае неуспешного разбора.
3. Добавить в процедуру разбора задание по номеру вариан-та.
4. (Дополнительное.) Изучить разработку make файлов и разработать make файл для сборки проекта из двух модулей.
5. (Дополнительное.) Функция разбора вещественного числа в инженерной форме.
Вариант 3. Строки.
Обеспечить поддержку строки. Строки записываются в кавычках. Дополнительно необходимо обеспечить ввод кавычки в виде последовательности из двух кавычек. На выходе строки выдавать в следующем формате:
string("")
где строка есть последовательность символов. Кавычка, если она была в исходной строке, должна быть заменена последовательностью символов \".
Например
"Hello World!" на выходе string("Hello World!")
"Hello "