Разработка синтаксического анализатора
Автор: Guzel_N • Сентябрь 16, 2020 • Лабораторная работа • 12,852 Слов (52 Страниц) • 283 Просмотры
Федеральное государственное бюджетное образовательное учреждение
высшего образования
«Уфимский государственный нефтяной технический университет»
Кафедра «Вычислительная техника и инженерная кибернетика»
ОТЧЕТ
по лабораторной работе № 3
«РАЗРАБОТКА СИНТАКСИЧЕСКОГО АНАЛИЗАТОРА»
Вариант 8
Выполнил ст. гр.
______________
подпись, дата
Проверил: преподаватель Салихова М.А.
______________
оценка, дата, подпись
Уфа 2020
Лабораторная работа №3
- Постановка задачи
Разработать синтаксический анализатор в соответствии с вариантом задания. В P:\Салихова М.А\ТЯПиМТ\БПО\дополнительные материалы\Примеры найдете программу, реализующую распознаватель вложенности скобок методом рекурсии (BracRec.zip) и с помощью автомата с магазинной памятью (BracStack.zip). А в файле P:\Салихова М.А\ТЯПиМТ\БПО\дополнительные материалы\Основы построения компиляторов(Легалов).doc есть описание построения синтаксического анализатора. Подготовить отчет.
- Текст программы:
Analys.h
bool isit(lc_type it) {
if(ilex[pos]!=it)
return false; //ошибка, это не то!
else {
printf("\nRaspoznal %17s pos=%d",lc[pos],pos);
fprintf(outfil,"\nRaspoznal %17s pos=%d",lc[pos],pos);
str+=lv[pos]; str+=" "; code=str.toLatin1().data();
pos++;
return true; } //Ок, следующая лексема
}
bool Opisanie() { //$описание = идентификатор { "," $идентификатор } ":" [ vector "[" $целое "]" of ] $тип.
fprintf(outfil,"\nOpisanie");
if(isit(lexId)){
while (isit(lexComma)){
if(!isit(lexId))
return false; //ошибка описания нескольких переменных
}
if(!isit(lexColon))
return false; //ошибка описания нехаватает ":"
if(isit(kwVector)){
if(!isit(lexLftSqBr)) return false; //ошибка нехватает [
if(!isit(lexInteger)) return false; //ошибка должно быть число после [
if(!isit(lexRghSqBr)) return false; //ошибка должно быть ] после числа
if(!isit(kwOf)) return false; //ошибка нехватает of
if(!(isit(kwInteger) || isit(kwReal))) return false; //ошибка в типе
return true; //описание успешно
}
else {
if(!(isit(kwInteger) || isit(kwReal))) return false; //ошибка в типе
return true; //описание успешно
}
}
else return false; //ошибка описания первой переменной
}
bool Operator() { //$оператора = [метка] непомеченный.
fprintf(outfil,"\nOperator");
if(Nepomecheniy()) return true;
if(Metka()) {
if(!Nepomecheniy()) return false;
return true;
}
return false;
}
bool Metka(){ //$метка = имя_метки ":".
fprintf(outfil,"\nMetka");//
if(!isit(lexId)) return false;
if(!isit(lexColon)) return false;
return true;
}
bool Imya_metki(){ //$имя_метки = буква {буква \ цифра}.
fprintf(outfil,"\nImya_metki");
if(!isit(lexId)) return false; //Настоящая метка
else return true;
}
bool Nepomecheniy() {
fprintf(outfil,"\nNepomecheniy"); //$непомеченный = составной | присваивания | перехода | условный | цикла | пустой | ввода | вывода.
if(Sostavnoy()) return true;
if(Prisvaivaniya()) return true;
if(Perehoda()) return true;
if(Uslovniy()) return true;
if(Cikla()) return true;
if(Vvoda()) return true;
if(Vivoda()) return true;
return false; //Ошибка оператора
}
bool Sostavnoy(){
fprintf(outfil,"\nSostavnoy"); // $составной = BST {/ оператор ";" /} EST.
if(!isit(kwBegin)) return false; //Не составной
if(!Operator()) return false; //Ошибка в операторе
if(!isit(lexSemicolon)) return false;
while(Operator()){
...