Лабораторна робота
З системного програмування
Лабораторна робота №1
ЗАВДАННЯ:
Побудувати скінченний автомат для розпізнавання простого (без дужок) арефметичного виразу. У виразі можуть зустрічатися ідентифікатори(скл тільки з букв), та цілих десяткових чисел і довільної кількості односимвольних арифметичних операцій.
АВТОМАТ
0
1..9
B
*,+
-
/
Доп стани
П
1
2
3
Е
5
Е
0
1
Е
Е
Е
4
5
6
1
2
1
2
3
4
5
6
1
3
1
2
3
4
5
6
1
4
1
2
3
Е
Е
Е
0
5
1
2
3
Е
Е
Е
0
6
Е
2
3
Е
Е
Е
0
Е
Е
Е
Е
Е
Е
Е
0
ТЕКСТ ПРОГРАМИ:
# include <stdio.h>
# include <conio.h>
# include <math.h>
main()
{
int i,j,st,pr,a;
char *vyr;
printf ("\nvvedit vyraz\n");
gets (vyr);
/*Перегляд виразу і його аналіз за можл станами*/
pr=1;i=-1;st=0;
while ((pr==1)&(i<(strlen(vyr)-1))) { i++; pr=0;
if ((vyr[i] >='0') & (vyr[i]<='9')&((st==1)||(st==0)||(st==3)))
{ pr=1;st=1;}
if((vyr[i]>='a')&(vyr[i]<='z') &((st==3)||(st==2)||(st==0)))
{ st=2;pr=1;}
if((vyr[i]=='+'||vyr[i]=='-'||vyr[i]=='*')&((st==1)||(st==2)))
{pr=1;st=3; }
if((vyr[i]=='/')&(vyr[i+1]!='0')&(st!=3)&(st!=0))
{pr=1;st=3;}
if((vyr[i]=='-')&(st==0))
{pr=1;st=3;}
}
/*Перевірка правильності виразу*/
a=(strlen(vyr)-1);
if((vyr[a]=='+')||(vyr[a]=='-')||(vyr[a]=='*')||(vyr[a]=='/'))
i=i+1;
if ((i== (strlen(vyr)-1))&(pr==1))
printf ("danyj vyraz pravylnyj\n");
else
printf("danyj vyraz ne pravylnyj\n");
printf("\npress any key to continue");getch();
}
Лабораторна робота №2
Завдання:
Розглянути підмножину мови Pascal. Розглядаються оператори опису, оператор присвоєння, константи цілого типу, змінні цілого типу. Також умовний оператор вигляду:
IF (умова) THEN (1 оператор)
ELSE (1 оператор)
Текст програми.
#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include<conio.h>
FILE *fr, *fw;
char str[30], lit, *syn;
int cl, i;
void scan();
void getlit();
void writ();
int por();
void main()
{ /*
clrscr();
fr = fopen("d:/vova/my/scien/sysprog/la2/l2.txt", "rt");
fw = fopen("d:/vova/my/scien/sysprog/la2/lrez2.txt", "wt");
lit=' '; scan();
fcloseall();
}
/*Зчитування з файла вх програми, розбиття її на окремі слова*/
/*аналіз і запис у файл з відпов коментарем*/
void scan()
{i=0;
while (!(feof(fr))) {
while ((lit==' ') || (lit=='\t') || (lit=='\n')) getlit();
switch(cl) {
case 1: str[i++]=lit; while (cl==1) {getlit();if(isdigit(lit))str[i++]=lit;}
str[i++]='\x0'; syn='c';
writ(); break;
case 2: while (cl<=2) {str[i++]=lit; getlit();};str[i++]='\x0';
if (por()==0) {syn='z'; writ();};break;
case 3: str[i++]=lit; str[i++]='\x0'; syn=lit; writ(); getlit(); break;
case 4: str[i++]=lit; syn=lit;
if (cl!=5) {str[i++]='\x0';syn=str[0]; writ();} else {str[i++]=lit; syn='s'; str[i]='\x0'; writ();}getlit(); break;
case 5: str[i++]=lit;str[i++]='\x0'; syn=lit;writ();getlit(); break;
case 10: str[i++]=lit; do {getlit();} while ((lit=='\n')||(lit=='\t')||
(lit==' ')); if(cl!=10) {str[i++]='\x0';syn='e';writ();}break;
}
}}
/*Проц зчит і визнач символа*/
void getlit(){
fscanf(fr, "%c", &lit); cl=10;
if (isalpha(lit)) cl=2;
if (isdigit(lit)) cl=1;
if ((lit=='*') || (lit=='/') || (lit=='+') || (lit=='(') || (lit==')') ||
(lit=='-') || (lit==';') || (lit=='.') || (lit==',') ) cl=3;
if ((lit==':')||(lit=='>')||(lit=='<')) cl=4;
if (lit=='=') cl=5;
}
/*Проц запису у файл*/
void writ() {
fprintf(fw, "%c \t %s\n", syn, str);
str[0]='\0'; i=0;
}
/*Проц пошуку чи слово не є службовим*/
int por(){
int j;
char *kw[11]={"program", "var", "double","integer", "begin", "end",
"if", "then","else","true","false"};
j=0;while (strcmp(str, kw[j]) && (j!=11))j++;
if (j<11) { syn='s'; writ(); return 1;};return 0;
}
Контрольний приклад:
Вхідна програма:
program Vova2
var
i,j:integer;
j,k:real;
begin
if i>2 then write('hello);
else write(good buy);
end;
Результат:
s program
z Vova2
s var
z i
, ,
z j
: :
s integer
; ;
z j
, ,
z k
: :
z real
; ;
s begin
s if
z i
> >
c 2
s then
z write
( (
e '
z hello
) )
; ;
s else
z write
( (
z good
z buy
) )
; ;
s end
; ;