лаба 5
.docx
Федеральное агентство связи ордена Трудового Красного Знамени Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования Московский Технический Университет связи и информатики
Кафедра «Математической кибернетики и информационных технологий»
Лабораторная работа №5 Генератор лексических анализаторов Flex
Выполнила
студентка группы БСТ1904
Пантелеева К.А.
Вариант №8
Оглавление
1 Задание 3
2 Ход лабораторной работы 3
2.1 Код программы 3
2.2 Тестирование программы 5
3 Вывод 7
Список использованных источников 7
1 Задание
Написать программу на языке Flex, которая выполняет лексический анализ входного текста в соответствии с заданием и порождает таблицу лексем с указанием их типов. Программа должна выдавать сообщения о наличии во входном тексте ошибок, которые могут быть обнаружены на этапе лексического анализа.
Входной язык содержит логические выражения, разделённые символом ; (точка с запятой). Логические выражения состоят из идентификаторов, констант 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)