Лексичний аналіз текстів

Інформація про навчальний заклад

ВУЗ:
Національний університет Львівська політехніка
Інститут:
Інститут комп’ютерних наук та інформаційних технологій
Факультет:
КН
Кафедра:
Кафедра автоматизованих систем управління

Інформація про роботу

Рік:
2024
Тип роботи:
Розрахункова робота
Предмет:
Алгоритмізація та програмування

Частина тексту файла (без зображень, графіків і формул):

Міністерство освіти і науки Національний університет «Львівська політехніка» Інститут комп’ютерних наук та інформаційних технологій Кафедра автоматизованих систем управління  Розрахункова робота з дисципліни: Алгоритмізація та програмування Тема: «Лексичний аналіз текстів» Зміст Вступ Теоретичні відомості Алгоритм розв’язування задачі Опис програми Таблиця змінних Блок-схема Код програми Приклад реалізації Висновок Список використаних джерел Вступ Лексичний розбір — це процес перетворення послідовності символів в послідовність токенів (груп символів що відповідають певним шаблонам), та визначення їх типів. Програма, чи функція, що виконує лексичний аналіз, називається лексичним аналізатором, чи сканером. Часто сканер є звичайною функцією що використовується парсером (синтаксичним аналізатором), для отримання наступного токена з потоку вхідних символів в процесі компіляції. Також часто лексичний аналіз використовують для підсвітки синтаксису певних мов. Теоретичні відомості Позначка (лексема/токен) — це рядок літералів, впорядкованих відповідно до правил (наприклад, IDENTIFIER, NUMBER, COMMA). Процес утворення позначок з вихідного потоку називається видобуванням позначок (англ. tokenization) і розбирач впорядковує їх за відповідними типами. Лексичний розбирач зазвичай нічого не робить з об'єднаннями позначок, це завдання припадає на синтаксичний розбирач. Наприклад, типовий лексичний розбирач розпізнає дужки як позначки, але перевіряє відповідність '(' і ')' дужок. Позначки часто визначаються за допомогою регулярних виразів, що зрозумілі генераторам лексичних розбирачів таким як lex. Лексичний розбирач (чи створений автоматично приладдям на кшталт lex або вручну) читає потік символів, визначає лексеми в потоці, і впорядковує їх як позначки. Це називається «видобуванням позначок». Якщо розбирач натрапляє на непридатну позначку, він звітує про помилку. Наступним кроком іде синтаксичний розбір. Звідти, витрактовані дані можуть бути завантажені в структури даних для загального використання, інтерпретації, компіляції. Алгоритм розв’язування задачі У головній функції main задається ім’я файла, який буде опрацьовуватися; Відкриваємо даний файл та робимо перевірку чи вдалося його відкрити; Створюємо функції для: Підрахування букв Підрахування речень Підрахування складів Підрахування абзаців Визначення популярності букви Рейтинг популярності букв організовуємо в main; Закриваємо файл. Опис програми Файл з кодом програми має назву “ЛексАналіз” із розширенням *.срр Кількість рядків програми, включаючи коментарі та відступи між функціями, становить 123 рядки. Складається із таких користувацьких функцій: int Bukvy (int sym) – параметром функції є символ, який зчитується з файлу. Дана функція звіряє заданий символ з масивом розділових знаків (пробіл, крапка, кома і т. п.). Якщо умова виконалась, то функція повертає нуль, в інакшому випадку одиницю. int KilkistRech (int sym) - параметром функції є символ, який зчитується з файлу. Дана функція перевіряє чи заданий символ не є крапкою. Якщо умова виконалась, то функція повертає одиницю, в інакшому випадку нуль. int KilkistSklad (int sym) - параметром функції є символ, який зчитується з файлу. Ця функція перевіряє чи заданий символ не є голосною буквою. Якщо умова виконалась, то функція повертає одиницю, в інакшому випадку нуль. int KilkisAbzaciv (char buf[]) – параметром функції є рядок, зчитаний з файла. Функція перевіряє чи заданий рядок є пустим. Якщо умова виконалась, то функція повертає одиницю, в інакшому випадку нуль. void PopularBukv (int sym) - параметром функції є символ, який зчитується з файлу. Спершу дана функція перевіряє чи заданий символ є буквою. Якщо це буква, то функція збільшує на один відповідне число в масиві popul, згідно абетки. У функції main відкривається файл із заданим ім’ям, та виконується перевірка чи цей файл відкрився. У разі невідкриття програма завершує роботу. В інакшому випадку виводиться вміст файлу (текст) на екран. За допомогою функції fseek повертаємо вказівник на початок файлу. Організовуємо цикл в якому послідовно зчитуєм кожен символ файла і викликаємо функції Bukvy, KilkistRech, KilkistSklad, KilkisAbzaciv, PopularBukv, перевіряючи заданий символ. Функція повертає одиницю або нуль, тому кожного разу ми збільшуємо відповідний лічильник на один або на нуль. Знову ж використовуючи fseek повертаємось на початок файла. Організовуємо цикл для підрахування абзаців за таким самим принципом, але зчитуючи не посимвольно, я цілими рядками. Далі створюємо цикл який виводить рейтинг популярності кожної букви. Спочатку виводиться буква, а навпроти неї відповідна кількість рисок, згідно з популярністю цієї букви. В кінці програми файл закривається. Таблиця змінних № тип Назва Область видимості Призначення  1. char popul глобальна Масив для збереження популярності кожної букви  2. char fname локальна Назва файла  3. FILE* fp локальна Вказіврник на файл  4. char buf локальна Збереження рядка, який зчитується з файла  5. int sym локальна Збереження символа, який зчитується з файла  6. char znaky локальна Масив розділових знаків  7. char holos локальна Масив голосних букв  8. char vel локальна Масив великих букв  9. char mal локальна Масив малих букв   Блок – схема / Код програми #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <Windows.h> #include <iostream> #include <locale> #define MAX 200 char popul[26]; //масив для збереження популярності кожної букви int Bukvy (int sym); //підрахування кількості букв int KilkistRech (int sym); //підрахування кількості речень int KilkistSklad (int sym); //підрахування кількості складів int KilkisAbzaciv (char buf[]); // підрахування кількості абзаців void PopularBukv (int sym); //підрахування популярності букви int main (void) { SetConsoleCP(1251); SetConsoleOutputCP(1251); FILE* fp; char fname[]="Text.txt"; fp = fopen(fname, "r"); if (fp == NULL){ printf("Файл не було відкрито."); getchar(); return 0; } char buf[MAX]; int sym, i, j; int buk=0, krap=0, skld = 0; /*Виведення вмісту файла на екран*/ while((fgets (buf, MAX, fp)) != NULL){ fputs(buf, stdout); } fseek (fp, 0L, SEEK_SET); //повернення вказівника на початок файла /*Цикл для опрацювання кожного символа заданого файла*/ while((sym = fgetc (fp)) != EOF){ buk = buk + Bukvy (sym); krap = krap + KilkistRech (sym); skld = skld + KilkistSklad (sym); PopularBukv (sym); } fseek (fp, 0L, SEEK_SET); int abz = 0; char vel[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; char mal[] = "abcdefghijklmnopqrstuvwxyz"; char* vel1; while((fgets (buf, MAX, fp)) != NULL){ abz = abz + KilkisAbzaciv(buf); } /*Виведення отриманих даних*/ printf ("\n\nКількість букв: %d\n\n", buk); printf ("Кількість речень: %d\n\n", krap); printf ("Кількість складів: %d\n\n", skld); printf ("Кількість абзаців: %d\n\n", abz); printf ("Середня довжина речення %d букв.\n\n\n", buk/krap); printf ("\t\t\tПопулярність літер в абетковому порядку\n"); for (i=0; i<26; i++){ printf ("\n%c%c ", vel[i], mal[i]); for(j=0; j<popul[i]; j++) printf("|"); } fclose (fp); getchar(); } int Bukvy (int buk) { int i; char znaky[] = " .,:;!?-()'"; if(buk != '\n'){ for(i=0; i<12; i++) if(buk == znaky[i]) return 0; } else return 0; return 1; } int KilkistRech (int krap) { if(krap == '.') return 1; return 0; } int KilkistSklad (int skl) { int i; char holos[] = "EUIOAeuioa"; char* hl; for(hl = holos; *hl != '\0'; hl++){ if(skl == *hl) return 1; } return 0; } int KilkisAbzaciv (char buf[]) { if(*buf == '\n') return 1; return 0; } void PopularBukv (int sym) { if (Bukvy (sym) == 0) return; int i; char vel[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; char mal[] = "abcdefghijklmnopqrstuvwxyz"; for(i=0; i<26; i++){ if(sym == vel[i] || sym == mal[i]) popul[i] = popul[i]+1; } } Результати / Висновок Дана програма зчитує вміст файла, в якому є англомовний текст. Для наочності даний текст виводиться на екран. Для цього виконується звчитування рядка з файла за допомогою функції fgets та виводиться за допомогою функції fputs та стандартного потоку виведення stdout. Окремі функції підраховують кількість букв, речень, складів, абзаців, а також популярність букв. Для зчитування з файлу одного символа використовується функція fgetc, а для зчитування цілого рядка – fgets. Остання зчинує рядок поки не зустрінеться “\n”, але не більше ніж MAX символів. В головній функції main організовується цикл, для створення рейтингу популярності букв. Навпроти кожної букви виводиться стільки рисок, скільки раз вона зустрічається в тексті. В кінці програми файл закривається.
Антиботан аватар за замовчуванням

09.10.2017 10:10-

Коментарі

Ви не можете залишити коментар. Для цього, будь ласка, увійдіть або зареєструйтесь.

Ділись своїми роботами та отримуй миттєві бонуси!

Маєш корисні навчальні матеріали, які припадають пилом на твоєму комп'ютері? Розрахункові, лабораторні, практичні чи контрольні роботи — завантажуй їх прямо зараз і одразу отримуй бали на свій рахунок! Заархівуй всі файли в один .zip (до 100 МБ) або завантажуй кожен файл окремо. Внесок у спільноту – це легкий спосіб допомогти іншим та отримати додаткові можливості на сайті. Твої старі роботи можуть приносити тобі нові нагороди!
Нічого не вибрано
0%

Оголошення від адміністратора

Антиботан аватар за замовчуванням

Подякувати Студентському архіву довільною сумою

Admin

26.02.2023 12:38

Дякуємо, що користуєтесь нашим архівом!