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