Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

лаба 5

.docx
Скачиваний:
2
Добавлен:
04.03.2022
Размер:
370.15 Кб
Скачать

Федеральное агентство связи ордена Трудового Красного Знамени Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования Московский Технический Университет связи и информатики

Кафедра «Математической кибернетики и информационных технологий»

Лабораторная работа №5 Генератор лексических анализаторов Flex

Выполнила

студентка группы БСТ1904

Пантелеева К.А.

Вариант №8

Оглавление

1 Задание 3

2 Ход лабораторной работы 3

2.1 Код программы 3

2.2 Тестирование программы 5

3 Вывод 7

Список использованных источников 7

1 Задание

  1. Написать программу на языке Flex, которая выполняет лексический анализ входного текста в соответствии с заданием и порождает таблицу лексем с указанием их типов. Программа должна выдавать сообщения о наличии во входном тексте ошибок, которые могут быть обнаружены на этапе лексического анализа.

  2. Входной язык содержит логические выражения, разделённые символом ; (точка с запятой). Логические выражения состоят из идентификаторов, констант true и false, знака присваивания (:=), операций or, xor, and, not и круглых скобок.

2 Ход лабораторной работы

2.1 Код программы

%option noyywrap yylineno

%{

#include <stdio.h>

#include <string.h>

#define SIZE 6

char* filename;

char* keywords[SIZE] = {"not", "and", "or", "xor"};

%}

letter [a-zA-Z]

digit [0-9]

delim [;]

t[True]

f[False]

keyw [()]

end[$]

ws [ \t\n]

%%

{t} {

printf("%s:%d SYMBOL %s\n", filename, yylineno, yytext);

}

{f} {

printf("%s:%d SYMBOL %s\n", filename, yylineno, yytext);

}

({letter}|"_")({letter}|{digit}|"_")* {

if(resWord(yytext))

{

printf("%s:%d KEYWORD %s\n", filename, yylineno, yytext);

}else{

printf("%s:%d IDENTIFIER %s\n", filename, yylineno,

yytext);

}

}

{digit}+ {

printf("%s:%d NUMBER %s\n", filename, yylineno, yytext);

}

":=" {

printf("%s:%d ASSIGN %s\n", filename, yylineno, yytext);

}

"$" {

printf("%s:%d END %s\n", filename, yylineno, yytext);

}

{delim} {

printf("%s:%d DELIMITER %s\n", filename, yylineno,

yytext);

}

{keyw} {

printf("%s:%d KEYWORD %s\n", filename, yylineno,

yytext);

}

{ws}+ ;

. {

printf("%s:%d Unknown character '%s'\n", filename,

yylineno, yytext);

}

%%

int resWord(char* id)

{

int i;

for(i = 0; i < SIZE; i++)

{

if(strcmp(id, keywords[i]) == 0)

{

return 1;

}}

return 0;

}

int main(int argc, char** argv)

{

if(argc < 2)

{

perror("Input file name is not specified");

return 1;

}

yyin = fopen(argv[1], "r");

if(yyin == NULL)

{

perror(argv[1]);

return 1;

}

filename = strdup(argv[1]);

yylineno = 1;

yylex();

return 0;

}

2.2 Тестирование программы

Входные данные представлены на рисунке 1.

Рисунок 1 – Данные

Результат работы программы представлен на рисунке 2.

Рисунок 2 – Результат работы

Теперь посмотрим, как работает программа, когда текст с ошибкой. Для этого изменим входные данные (рисунок 3).

Рисунок 3 – Данные с ошибкой

А результат работы приведен на рисунке 4.

Рисунок 4 – Результат работы

3 Вывод

В результате данной работы я научилась работать с лексическим анализатором Flex.

Список использованных источников

1) ГОСТ 7.1-2001 СИБИД. Библиографическая запись. Библиографическое описание. Общие требования и правила составления [электронный ресурс] URL: https://internet-law.ru/gosts/gost/1560 (дата обращения 28.03.2020)

2) ГОСТ 7.32-2001 СИБИД. Отчет о научно-исследовательской работе. Структура и правила оформления (с Изменением N 1) [электронный ресурс] URL: http://docs.cntd.ru/document/gost-7-32-2001-sibid (дата обращения 28.03.2020)

Соседние файлы в предмете Теория языков программирования