Міністерство освіти та науки України
Національний університет «Львівська політехніка»
кафедра прикладної математики
ЛАБОРАТОРНА РОБОТА №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();
}
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='F';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;}
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=':';break;
case 6:
lex[i++]=lit;cl=getlit();
lex[i]='\0'; 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='S';break;
case 9:
lex[0]=lit;lex[1]='\0'; syn='X';cl=getlit();break;
}
}
}
void S()
{
scan();
if(syn != 'M'){f = 1; cout<<"\n\n!!!ERROR!!!\n\nLine "<<num<<": Programa povuna po4unatus' zi slova Program!!!\n"; return;}
scan();
if(syn != 'A'){f = 1; cout<<"\n\n!!!ERROR!!!\n\nLine "<<num<<": Nekorektne imja programu!!!\n"; return;}
New_Id();
scan();
if(syn != ';'){f = 1; cout<<"\n\n!!!ERROR!!!\n\nLine "<<num<<": O4ikyet'sja ';'!!!\n"; return;}
scan();
if(syn != 'V' && syn != 'G'){f = 1; cout<<"\n\n!!!ERROR!!!\n\nLine "<<num<<": O4ikyet'sja BEGIN abo VAR!!!\n"; return;}
if(syn == 'V')
R();
if(f) return;
T();
}
void R()
{
if(f) return;
scan();
P();
}
void P()
{
if(f) return;
Z();
if(f) return;
if(syn != ':'){f = 1; cout<<"\n\n!!!ERROR!!!\n\nLine "<<num<<": O4ikyjet'sja ':'!!!\n"; return;}
scan();
Y();
if(f) return;
if(syn != ';'){f = 1; cout<<"\n\n!!!ERROR!!!\n\nLine "<<num<<": O4ikyjet'sja ';'!!!\n"; return;}
scan();
while(syn != 'G')
{
Z();
if(f) return;
if(syn != ':'){f = 1; cout<<"\n\n!!!ERROR!!!\n\nLine "<<num<<": O4ikyjet'sja ':'!!!\n"; return;}
scan();
Y();
if(f) return;
if(syn != ';'){f = 1; cout<<"\n\n!!!ERROR!!!\n\nLine "<<num<<": O4ikyjet'sja ';'!!!\n"; return;}
scan();
}
}
void Z()
{
if(f) return;
if(syn != 'A'){f = 1; cout<<"\n\n!!!ERROR!!!\n\nLine "<<num<<": O4ikyjet'sja identufikator!!!\n"; return;}
New_Id();
if(f) return;
scan();
while(syn != ':')
{
if(syn != ','){f = 1; cout<<"\n\n!!!ERROR!!!\n\nLine "<<num<<": O4ikyjet'sja ':'!!!\n"; return;}
scan();
if(syn != 'A'){f = 1; cout<<"\n\n!!!ERROR!!!\n\nLine "<<num<<": O4ikyjet'sja identufikator!!!\n"; return;}
New_Id();
if(f) return;
scan();
}
}
void Y()
{
if(f) return;
if(syn != 'I' && syn != 'R' && syn != 'L'){f = 1; cout<<"\n\n!!!ERROR!!!\n\nLine "<<num<<": Nevidomuj typ danuh!!!\n"; return;}
int j = id_num - 1;
while(M_id[j].type == 4)
{
if(syn == 'I') M_id[j--].type = 1; //Integer
else
if(syn == 'R') M_id[j--].type = 2; //Real
else
if(syn == 'L') M_id[j--].type = 3; //Boolean
}
scan();
}
void T()
{
if(f) return;
if(syn != 'G'){f = 1; cout<<"\n\n!!!ERROR!!!\nLine "<<num<<": O4ikyjet'sja BEGIN!!!\n"; return;}
scan();
A();
if(f) return;
if(syn != 'N'){f = 1; cout<<"\n\n!!!ERROR!!!\nLine "<<num<<": O4ikyjet'sja END!!!\n"; return;}
scan();
if(feof(in)) {printf(" "); lex = " ";}
if(syn != '.'){f = 1; cout<<"\n\n!!!ERROR!!!\nLine "<<num<<": O4ikyjet'sja '.'!!!\n"; return;}
}
void A()
{
if(f) return;
if(syn != 'N')
B();
if(f) return;
while(syn != 'N')
{
if(syn != ';'){f = 1; cout<<"\n\n!!!ERROR!!!\nLine "<<num<<": O4ikyjet'sja ';'!!!\n"; return;}
scan();
if(syn == 'N') break;
B();
if(f) return;
}
}
void B()
{
if(f) return;
if(syn == 'W')
W();
else
if(syn == 'G')
L();
else
if(syn == 'A')
V();
else
{f = 1; cout<<"\n\n!!!ERROR!!!\nLine "<<num<<": Neo4ikyvani symvolu!!!\n"; return;}
}
void V()
{
if(f) return;
if(Check_Id() == -1){f = 1; cout<<"\n\n!!!ERROR!!!\nLine "<<num<<": Zminna '"<<lex<<"' ne opusana!!!\n"; return;}
t = Check_Id();
Pol_Zap_True[pol] = lex;
Pol_Zap[pol++] = 100 + Search_Id();
if(f) return;
scan();
if(syn != 'K'){f = 1; cout<<"\n\n!!!ERROR!!!\nLine "<<num<<": O4ikyjet'sja ':='!!!\n"; return;}
Add_Operator();
int temp_pr = Search_Operator();
scan();
U();
Pol_Zap_True[pol] = M_op[temp_pr];
Pol_Zap[pol++] = 300 + temp_pr;
}
void W()
{
if(w == 0) w = 1;
if(f) return;
k = 1;
G();
temp_while1 = pol++;
Pol_Zap_True[pol] = "BZ";
Pol_Zap[pol++] = 300 + bz;
if(f) return;
scan();
if(f) return;
if(syn != 'T'){f = 1; cout<<"\n\n!!!ERROR!!!\nLine "<<num<<": O4ikyjet'sja DO!!!\n"; return;}
scan();
k = 0;
B();
Pol_Zap_True[pol] = "temp_while1";
Pol_Zap[pol++] = temp_while1 + 3;
Pol_Zap_True[pol] = "BR";
Pol_Zap[pol++] = 300 + br;
Pol_Zap_True[temp_while1] = "temp_while2";
Pol_Zap[temp_while1] = pol + 1;
temp_while2 = pol + 1;
temp_while1 = temp_while1 + 3;
}
void L()
{
if(f) return;
scan();
A();
if(f) return;
if(syn != 'N'){f = 1; cout<<"\n\n!!!ERROR!!!\nLine "<<num<<": O4ikyjet'sja END!!!\n"; return;}
scan();
}
void G()
{
scan();
if(syn == '(')
{
scan();
G();
if(f) return;
if(syn != ')'){f = 1; cout<<"\n\n!!!ERROR!!!\nLine "<<num<<": O4ikyjet'sja ')'!!!\n"; return;}
return;
}
U();
D();
int temp_vidn = Search_Operator();
scan();
U();
Pol_Zap_True[pol] = M_op[temp_vidn];
Pol_Zap[pol++] = 300 + temp_vidn;
}
void U()
{
if(f) return;
M();
if(f) return;
if(syn == '+' || syn == '-' || syn == 'O')
{
Add_Operator();
int temp_op = Search_Operator();
if(syn == 'O' && (t == 1 || t == 2))
{f = 1; cout<<"\n\n!!!ERROR!!!\nLine "<<num<<": Nevidpovidnist' tupiv(OR povertaje BOOLEAN)!!!\n"; return;}
if((syn == '+' || syn == '-') && t == 3)
{f = 1; cout<<"\n\n!!!ERROR!!!\nLine "<<num<<": Nevidpovidnist' tupiv(+ abo - ne povertaje BOOLEAN)!!!\n"; return;}
scan(); U();
Pol_Zap_True[pol] = M_op[temp_op];
Pol_Zap[pol++] = 300 + temp_op;
}
}
void M()
{
if(f) return;
N();
if(f) return;
if(syn == '*' || syn == '/' || syn == 'U')
{
Add_Operator();
int temp_op = Search_Operator();
if(syn == '/' && t == 1)
{f = 1; cout<<"\n\n!!!ERROR!!!\nLine "<<num<<": Nevidpovidnist' tupiv(dilennja povertaje REAL)!!!\n"; return;}
if(syn == 'U' && (t == 1 || t == 2))
{f = 1; cout<<"\n\n!!!ERROR!!!\nLine "<<num<<": Nevidpovidnist' tupiv(AND povertaje BOOLEAN)!!!\n"; return;}
if((syn == '*' || syn == '/') && t == 3)
{f = 1; cout<<"\n\n!!!ERROR!!!\nLine "<<num<<": Nevidpovidnist' tupiv(* abo / ne povertaje BOOLEAN)!!!\n"; return;}
scan(); M();
Pol_Zap_True[pol] = M_op[temp_op];
Pol_Zap[pol++] = 300 + temp_op;
}
}
void N()
{
if(f) return;
if(syn == '(')
{
scan();
U();
if(f) return;
if(syn != ')'){f = 1; cout<<"\n\n!!!ERROR!!!\nLine "<<num<<": O4ikyjet'sja ')'!!!\n"; return;}
}
else
if(syn == 'C')
{
Add_Operator();
int temp_op = Search_Operator();
if(t != 3)
{f = 1; cout<<"\n\n!!!ERROR!!!\nLine "<<num<<": Nevidpovidnist' tupiv(NOT povertaje BOOLEAN)!!!\n"; return;}
scan(); N();
Pol_Zap_True[pol] = M_op[temp_op];
Pol_Zap[pol++] = 300 + temp_op;
return;
}
else
if(syn == 'E'){f = 1; cout<<"\n\n!!!ERROR!!!\nLine "<<num<<": Dovzhuna identufikatora <= 10!!!\n"; return;}
else
if(syn == 'F'){f = 1; cout<<"\n\n!!!ERROR!!!\nLine "<<num<<": Dovzhuna ciloji konstantu <= 6!!!\n"; return;}
else
if(syn != 'A' && syn != 'B' && syn != 'Y' && syn != 'Z'){f = 1; cout<<"\n\n!!!ERROR!!!\nLine "<<num<<": Pomulka y vurazi!!!\n"; return;}
Add_Const();
if(syn == 'A') {Pol_Zap_True[pol] = lex; Pol_Zap[pol++] = 100 + Search_Id();}
if(syn == 'B' || syn == 'Y' || syn == 'Z') {Pol_Zap_True[pol] = lex; Pol_Zap[pol++] = 200 + Search_Const();}
Check_Type();
if(f) return;
scan();
}
void D()
{
if(f) return;
if(syn != 'P' && syn != 'J' && syn != 'S' && syn != 'D' && syn != 'H' && syn != 'Q')
{f = 1; cout<<"\n\n!!!ERROR!!!\nLine "<<num<<": O4ikyet'sja logi4na operacija!!!\n"; return;}
Add_Operator();
}
void Vudilutu_Lexemy()
{
int X, Y;
CONSOLE_SCREEN_BUFFER_INFO csbi;
COORD coord;
GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi);
X = coord.X = csbi.dwCursorPosition.X;
Y = coord.Y = csbi.dwCursorPosition.Y;
coord.X -= strlen(lex);
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 192);
printf(lex);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7);
while(!feof(in))
{
lit = fgetc(in);
if(ch != 0) putchar(ch);
ch = lit;
}
}
void SetWindowRect()
{
COORD BufCoord = {80, 300};
SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), BufCoord);
SMALL_RECT WinRect = {0, 0, 79, 38};
SMALL_RECT* WinSize = &WinRect;
SetConsoleWindowInfo(GetStdHandle(STD_OUTPUT_HANDLE), true, WinSize);
}
void New_Id()
{
for(int j = 0; j < id_num; j++)
if(!strcmp(M_id[j].id, lex))
{f = 1; cout<<"\n\n!!!ERROR!!!\nLine "<<num<<": Povtornuj opus zminnoji!!!\n"; return;}
M_id[id_num].id = lex;
M_id[id_num++].type = 4;
}
int Check_Id()
{
for(int j = 0; j < id_num; j++)
if(!strcmp(M_id[j].id, lex)) return M_id[j].type;
return -1;
}
void Check_Type()
{
if(k && (syn == 'A' || syn == 'B')) {if(Check_Id() == 3) t = 3; else t = 2;}
k = 0;
if(syn == 'A' && Check_Id() == -1){f = 1; cout<<"\n\n!!!ERROR!!!\nLine "<<num<<": Zminna '"<<lex<<"' ne opusana!!!\n"; return;}
if(f) return;
if(t == 1 && (syn != 'B' && syn == 'A' && Check_Id() != 1 || syn == 'Y' || syn == 'Z'))
{if(f) return; f = 1; cout<<"\n\n!!!ERROR!!!\nLine "<<num<<": Nevidpovidnist' tupiv(o4ikyet'sja rezyl'tat INTEGER - \n"<<
" zminna tupy REAL/BOOLEAN)!!!\n"; return;}
if(t == 2 && (syn != 'B' && syn == 'A' && Check_Id() == 3 || syn == 'Y' || syn == 'Z'))
{if(f) return; f = 1; cout<<"\n\n!!!ERROR!!!\nLine "<<num<<": Nevidpovidnist' tupiv(o4ikyet'sja rezyl'tat REAL - \n"<<
" zminna tupy BOOLEAN)!!!\n"; return;}
if(t == 3 && (syn == 'B' || syn == 'A' && Check_Id() != 3))
{if(f) return; f = 1; cout<<"\n\n!!!ERROR!!!\nLine "<<num<<": Nevidpovidnist' tupiv(o4ikyet'sja rezyl'tat BOOLEAN - \n"<<
" zminna tupy REAL/INTEGER/4USLO)!!!\n"; return;}
}
void Add_Const()
{
if((syn == 'Y' || syn == 'Z' || syn == 'B') && Search_Const() == -1)
M_co[co_num++] = lex;
}
void Add_Operator()
{
if(w == 1)
{
M_op[op_num] = "BR"; br = op_num++;
M_op[op_num] = "BZ"; bz = op_num++;
w = 2;
}
if(Search_Operator() == -1)
M_op[op_num++] = lex;
}
int Search_Const()
{
for(int j = 0; j < co_num; j++)
if(!strcmp(lex, M_co[j])) return j;
return -1;
}
int Search_Operator()
{
for(int j = 0; j < op_num; j++)
if(!strcmp(lex, M_op[j])) return j;
return -1;
}
int Search_Id()
{
for(int j = 0; j < id_num; j++)
if(!strcmp(M_id[j].id, lex)) return j;
return -1;
}
void Out_Tables()
{
char c = (char)(205);
char b = (char)(186);
cout<<"\n\tTablucja identufikatoriv\n";
cout<<"\t"<<(char)(201);
for(int i = 0; i < 7; i++) cout<<c;cout<<(char)(203);
for(i = 0; i < 7; i++) cout<<c;cout<<(char)(203);
for(i = 0; i < 7; i++) cout<<c;cout<<(char)(187)<<"\n";
cout<<"\t"<<b<<" Nomer\t"<<b<<" Nazva\t"<<b<<" Tup\t"<<b<<"\n ";
for(i = 0; i < id_num; i++)
{
cout<<"\t"<<(char)(204);for(int j = 0; j < 7; j++) cout<<c; cout<<(char)(206);
for(j = 0; j < 7; j++) cout<<c; cout<<(char)(206);
for(j = 0; j < 7; j++) cout<<c; cout<<(char)(185);
cout<<"\n\t"<<b<<" "<<i<<"\t"<<b<<" "<<M_id[i].id<<"\t"<<b<<" "<<M_id[i].type<<"\t"<<b<<"\n ";
}
cout<<"\t"<<(char)(200);
for(i = 0; i < 7; i++) cout<<c;cout<<(char)(202);
for(i = 0; i < 7; i++) cout<<c;cout<<(char)(202);
for(i = 0; i < 7; i++) cout<<c;cout<<(char)(188)<<"\n";
cout<<"\n\tTablucja konstant\n";
cout<<"\t"<<(char)(201);
for(i = 0; i < 7; i++) cout<<c;cout<<(char)(203);
for(i = 0; i < 15; i++) cout<<c;cout<<(char)(187)<<"\n";
cout<<"\t"<<b<<" Nomer\t"<<b<<" Zna4ennja\t"<<b<<"\n ";
for(i = 0; i < co_num; i++)
{
cout<<"\t"<<(char)(204);for(int j = 0; j < 7; j++) cout<<c; cout<<(char)(206);
for(j = 0; j < 15; j++) cout<<c; cout<<(char)(185);
cout<<"\n\t"<<b<<" "<<i<<"\t"<<b<<" "<<M_co[i]<<"\t"<<b<<"\n ";
}
cout<<"\t"<<(char)(200);
for(i = 0; i < 7; i++) cout<<c;cout<<(char)(202);
for(i = 0; i < 15; i++) cout<<c;cout<<(char)(188)<<"\n";
cout<<"\n\tTablucja operatoriv\n";
cout<<"\t"<<(char)(201);
for(i = 0; i < 7; i++) cout<<c;cout<<(char)(203);
for(i = 0; i < 8; i++) cout<<c;cout<<(char)(187)<<"\n";
cout<<"\t"<<b<<" Nomer\t"<<b<<"Operator"<<b<<"\n ";
for(i = 0; i < op_num; i++)
{
cout<<"\t"<<(char)(204);for(int j = 0; j < 7; j++) cout<<c; cout<<(char)(206);
for(j = 0; j < 8; j++) cout<<c; cout<<(char)(185);
cout<<"\n\t"<<b<<" "<<i<<"\t"<<b<<" "<<M_op[i]<<"\t "<<b<<"\n ";
}
cout<<"\t"<<(char)(200);
for(i = 0; i < 7; i++) cout<<c;cout<<(char)(202);
for(i = 0; i < 8; i++) cout<<c;cout<<(char)(188)<<"\n";
}
void Out_Polskuj_Zapus()
{
cout<<"Pol'skuj zapus vuraziv programu:\n";
for(int i = 0; i < pol; i++) {cout<<" "<<i + 1<<"."<<Pol_Zap[i]; if((i + 1)%8 == 0) cout<<"\n";}
cout<<"\n\nPol'skuj zapus v zvu4ajnomy vugljadi:\n";
for(i = 0; i < pol; i++)
{
if(Pol_Zap_True[i] == "temp_while1") cout<<" "<<temp_while1;
else
if(Pol_Zap_True[i] == "temp_while2") cout<<" "<<temp_while2;
else
cout<<" "<<Pol_Zap_True[i];
if((i + 1)%20 == 0) cout<<"\n";
}
cout<<"\n";
}
Контрольний приклад:
program a34;
var
abcd2, f: real;
b, a, s: integer;
se, c, d: BooLeAn;
efw,dwewe,we:Real;
Begin
f:=(b*b)+a*s - f* s+b;
while
((s>= (s*a/s)) do
begin
bEgin
b:=143;
c:= not true;
end;
end;
d:=not false or (not se or d);
c := not c and se or false;
se := TrUe or FaLsE and d or not c;
end.
V programi nemae pomulok...
Tablucja identufikatoriv
╔═══════╦═══════╦═══════╗
║ Nomer ║ Nazva ║ Tup ║
╠═══════╬═══════╬═══════╣
║ 0 ║ a34 ║ 2 ║
╠═══════╬═══════╬═══════╣
║ 1 ║ abcd2 ║ 2 ║
╠═══════╬═══════╬═══════╣
║ 2 ║ f ║ 2 ║
╠═══════╬═══════╬═══════╣
║ 3 ║ b ║ 1 ║
╠═══════╬═══════╬═══════╣
║ 4 ║ a ║ 1 ║
╠═══════╬═══════╬═══════╣
║ 5 ║ s ║ 1 ║
╠═══════╬═══════╬═══════╣
║ 6 ║ se ║ 3 ║
╠═══════╬═══════╬═══════╣
║ 7 ║ c ║ 3 ║
╠═══════╬═══════╬═══════╣
║ 8 ║ d ║ 3 ║
╠═══════╬═══════╬═══════╣
║ 9 ║ efw ║ 2 ║
╠═══════╬═══════╬═══════╣
║ 10 ║ dwewe ║ 2 ║
╠═══════╬═══════╬═══════╣
║ 11 ║ we ║ 2 ║
╚═══════╩═══════╩═══════╝
Tablucja konstant
╔═══════╦═══════════════╗
║ Nomer ║ Zna4ennja ║
╠═══════╬═══════════════╣
║ 0 ║ 143 ║
╠═══════╬═══════════════╣
║ 1 ║ true ║
╠═══════╬═══════════════╣
║ 2 ║ false ║
╚═══════╩═══════════════╝
Tablucja operatoriv
╔═══════╦════════╗
║ Nomer ║Operator║
╠═══════╬════════╣
║ 0 ║ := ║
╠═══════╬════════╣
║ 1 ║ * ║
╠═══════╬════════╣
║ 2 ║ + ║
╠═══════╬════════╣
║ 3 ║ - ║
╠═══════╬════════╣
║ 4 ║ BR ║
╠═══════╬════════╣
║ 5 ║ BZ ║
╠═══════╬════════╣
║ 6 ║ >= ║
╠═══════╬════════╣
║ 7 ║ / ║
╠═══════╬════════╣
║ 8 ║ not ║
╠═══════╬════════╣
║ 9 ║ or ║
╠═══════╬════════╣
║ 10 ║ and ║
╚═══════╩════════╝
Pol'skuj zapus vuraziv programu:
1.102 2.103 3.103 4.301 5.104 6.105 7.301 8.102
9.105 10.301 11.103 12.302 13.303 14.302 15.300 16.105
17.105 18.104 19.105 20.307 21.301 22.306 23.34 24.305
25.103 26.200 27.300 28.107 29.201 30.308 31.300 32.25
33.304 34.108 35.202 36.308 37.106 38.308 39.108 40.309
41.309 42.300 43.107 44.107 45.308 46.106 47.310 48.202
49.309 50.300 51.106 52.201 53.202 54.108 55.310 56.107
57.308 58.309 59.309 60.300
Pol'skuj zapus v zvu4ajnomy vugljadi:
f b b * a s * f s * b + - + := s s a s /
* >= 34 BZ b 143 := c true not := 25 BR d false not se not d or
or := c c not se and false or := se true false d and c not or or :=
Press any key to continue
Висновок:
Отже під час виконання даної лабораторної я ознайомився з поняттям польського інверсного запису, побудував програму, що аналізує вхідну програму та будує для кожного виразу польський запис. При цьому я використовую попередньо написані лексичний, синтаксичний, семантичний аналізатори.