Міністерство освіти та науки України
Національний університет «Львівська політехніка»
кафедра прикладної математики
ЛАБОРАТОРНА РОБОТА №5
з системного програмування на тему:
«Польський інверсний запис»
Мета: написати програму, що перетворює звичайний запис арифметичних виразів в програмі в інверсний польський тип запису. Попередньо програма аналізує вхідні дані з файлу у вигляді програми написаної на мові Pascal, проводить лексичний, синтаксичний та семантичний аналізи. Вихідні дані – ланцюжок чисел, що ідентифікують однозначно ту чи інше операцію або змінну записаних у порядку польського інверсного запису. Перед тим потрібно скласти таблиці ідентифікаторів, цілочисельних констант та операцій.
Варіант №9.
Завдання:
Розглянути підмножину мови Pascal, у якій є ідентифікатори (довжина – не більше 10 символів), цілі константи (довжина – не більше 6 символів), які використовуються у операторах опису (типи змінних – real , integer,boolean), оператори присвоєння, оператори циклу типу while (умова – логічний вираз, утворений з логічних змінних і відповідних логічних операцій).
Код програми:
#include <fstream.h>
#include <string.h>
#include <stdio.h>
#include <iostream.h>
#include <ctype.h>
#include <windows.h>
//*********************Opus Global'nuh zminnuh***********************//
FILE *in;
char *f1 = "input.txt";
char *lex, syn, lit = ' ', ch = 0;
int cl = 9, f = 0, num = 1, id_num = 0, co_num = 0, op_num = 0, pol = 0, t = 0, k = 0, w = 0, br = -1, bz = -1, temp_while1 = 0, temp_while2 = 0;
struct st
{
char *id;
int type;
};
st M_id[100];
char *M_co[100];
char *M_op[100];
int Pol_Zap[100];
char *Pol_Zap_True[100];
//************************Prototupu fynkcij**************************//
int getlit();
int zarezerv(char*);
void scan();
void S();
void R();
void P();
void Z();
void Y();
void T();
void A();
void B();
void V();
void W();
void L();
void U();
void M();
void N();
void G();
void D();
void Vudilutu_Lexemy();
void New_Id();
int Check_Id();
void SetWindowRect();
void Check_Type();
void Add_Const();
void Add_Operator();
int Search_Const();
int Search_Operator();
int Search_Id();
void Out_Tables();
void Out_Polskuj_Zapus();
//****************************MAIN***********************************//
void main(void)
{
SetWindowRect();
in=fopen(f1, "r");
S();
if(f) Vudilutu_Lexemy();
else cout<<"\n\nV programi nemae pomulok...\n";
Out_Tables();
Out_Polskuj_Zapus();
fclose(in);
}
//*************************Opus fynkcij******************************//
int getlit()
{
lit = fgetc(in);
if(ch != 0) putchar(ch);
ch = lit;
if(lit >= 'A' && lit <= 'Z') lit -= 'A' - 'a';
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)
{
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,"true")) {syn ='Y';return 1;}
if (!stricmp(lex,"false")) {syn ='Z';return 1;}
return 0;
}
void scan()
{
int i;
lex=new char[30];
if(cl&&!feof(in))
{
i=0;
while (lit==' ' || lit=='\n' || lit=='\t')
{
if(lit == '\n') num++;
cl=getlit();
}
...