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

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

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

Рік:
2010
Тип роботи:
Лабораторна робота
Предмет:
Системне програмування
Група:
ПМ-31

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

Міністерство освіти та науки України Національний університет «Львівська політехніка» кафедра прикладної математики ЛАБОРАТОРНА РОБОТА №2 з системного програмування на тему: «Лексичний аналіз» Мета: розбити всі елементарні конструкції мови на класи, визначити формат лексеми-дескриптора, розбити всі літери вхідної мови на класи(для ідентифікації класу чергової лексеми), побудувати скінченний автомат. Написати програму лексичного аналізу коду програми, що отримує на вході – текст програми на запропонованій підмножині мови програмування (у вхідному файлі), на виході – потік лексем-дескрипторів (у вихідному файлі). Лексичний аналізатор організувати як підпрограму, що викликається у циклі головною програмою для формування чергової лексеми-дескриптора. Варіант №9. Завдання: Розглянути підмножину мови Pascal, у якій є ідентифікатори (довжина – не більше 10 символів), цілі константи (довжина – не більше 6 символів), які використовуються у операторах опису (типи змінних – real , integer,boolean), оператори присвоєння, оператори циклу типу while (умова – логічний вираз, утворений з логічних змінних і відповідних логічних операцій). Дескриптори лексем: zminna – A 4uslo – B not – C <> – D zm<10 – E 4uslo<6 – F begin – G <= – H integer – I < – J := – K boolean – L program – M end – N or – O = – P >= – Q real – R > – S do – T and – U while – W var – V inwuj – X true – Y false – Z Код програми: #include<fstream.h> #include<string.h> #include<stdio.h> #include<iostream.h> FILE * in; char *f1="input.txt",* f2="output.txt"; char *lex, syn, lit; int cl=9; ofstream out; int getlit(); //z4utyvannja literu int zarezerv(char*); //perevirka nalezhnosti ident. do zarezervovanuh sliv void scan(); //jadro algorutmy void main(void) { in=fopen(f1,"r"); out.open(f2); lit=' '; scan(); cout<<"DONE!!!"; } int getlit() { lit=fgetc(in); switch (lit) { case '+':return 3; break; case '-':return 3; break; case '*':return 3; break; case '/':return 3; break; case ';':return 3; break; case '(':return 3; break; case ')':return 3; break; case ',':return 3; break; case '.':return 3; break; case '<':return 4; break; case ':':return 5; break; case '=':return 6; break; case '>':return 7; break; } if(isalpha(lit)) return 1; else if(isdigit(lit))return 2; else return 9; } int zarezerv(char* lex) { int pr=0; if (!stricmp(lex,"begin")) {syn ='G';return 1;} if (!stricmp(lex,"end")) {syn ='N';return 1;} if (!stricmp(lex,"integer")) {syn ='I';return 1;} if (!stricmp(lex,"real")) {syn ='R';return 1;} if (!stricmp(lex,"boolean")) {syn ='L';return 1;} if (!stricmp(lex,"do")) {syn ='T';return 1;} if (!stricmp(lex,"while")) {syn ='W';return 1;} if (!stricmp(lex,"var")) {syn ='V';return 1;} if (!stricmp(lex,"program")) {syn ='M';return 1;} if (!stricmp(lex,"or")) {syn ='O';return 1;} if (!stricmp(lex,"and")) {syn ='U';return 1;} if (!stricmp(lex,"not")) {syn ='C';return 1;} if (!stricmp(lex,"program")) {syn ='M';return 1;} return pr; } void scan() { int i; lex=new char[30]; while((cl)&&(!(feof(in)))) { i=0; while ((lit==' ')||(lit=='\n')||(lit=='\t')) { cl=getlit(); } switch(cl) { case 1: lex[i++]=lit; cl=getlit(); while ((cl<=2)&&(cl!=0)) {lex[i++]=lit;cl=getlit();} lex[i]='\0'; if(zarezerv(lex)) { break;} else {if(i<=10) syn='A'; else {syn='E';break;}} break; case 2: lex[i++]=lit; cl=getlit(); while ((cl==2)&&(cl!=0)) {lex[i++]=lit; cl=getlit();} lex[i]='\0'; if(i<6) syn='B';else syn='E';break; case 3: lex[0]=lit;lex[1]='\0'; syn=lit; cl=getlit();break; case 4: lex[i++]=lit; cl=getlit(); if (cl==7) {lex[i++]=lit; lex[i]='\0'; syn='D'; cl=getlit();break;} else {if (cl==6) {lex[i++]=lit; lex[i]='\0'; syn='H'; cl=getlit();break;}} lex[i]='\0';syn='J';break; case 5: lex[i++]=lit; cl=getlit(); if (cl==6) {lex[i++]=lit; lex[i]='\0'; syn='K'; cl=getlit();break;} lex[i]='\0';syn=lit;break; case 6: lex[i++]=lit;lex[i]='\0'; cl=getlit(); syn='P';break; case 7: lex[i++]=lit;cl=getlit(); if (cl==6) {lex[i++]=lit; lex[i]='\0'; syn='Q'; cl=getlit();break;} lex[i]='\0';syn='R';break; case 9: lex[0]=lit;lex[1]='\0'; syn='E';cl=getlit();break; } out<<syn<<"\t"<<lex<<"\n"; } } Контрольний приклад: Приклад вхідного файлу: program fd; var abcd12345678:real; {b}:integer; begin a:=(b/b)+b; if (a<=4)then while (b<>5) do begin b:=123; end;{ 1234567 1234.34 123.3456778 end . Приклад вихідного файду: M program A fd ; ; V var E abcd12345678 r : R real ; ; E { A b E } i : I integer ; ; G begin A a K := ( ( A b / / A b ) ) + + A b ; ; A if ( ( A a H <= B 4 ) ) A then W while ( ( A b D <> B 5 ) ) A do G begin A b K := B 123 ; ; N end ; ; E { E 1234567 B 1234 . . B 34 B 123 . . E 3456778 N end . . Висновок: На цій лабораторній я ознайомився з принципами лексичного аналізу в системному програмуванні, написав програму що аналізує лексичну структуру програми, ділить її на лексеми, класифікує їх та записує в файл ці лексеми та відповідні їм односимвольні лексичні класи.
Антиботан аватар за замовчуванням

01.01.1970 03:01-

Коментарі

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

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

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

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

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

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

Admin

26.02.2023 12:38

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