Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lab_Matlogika.doc
Скачиваний:
6
Добавлен:
13.11.2019
Размер:
1.99 Mб
Скачать

Завдання на лабораторну роботу

Написати програму, яка дозволяє виділити лексеми програми, написаної на мові Паскаль.

#include<stdio.h>

#include<ctype.h>

#include<conio.h>

#include<string.h>

FILE *fr, *fw;

char lit=' ', syn, lex[30];

int cl,i;

void getlit(void)

{

lit=fgetc(fr);

cl = 7;

if ((lit>='a')&&(lit<='z')) cl = 1;

if (isdigit(lit)) cl = 2;

if ((lit=='(') || (lit==')') || (lit==';') || (lit=='/') || (lit==',')||

(lit=='+') || (lit=='-') || (lit=='*') || (lit=='.')) cl = 3;

if ((lit=='<') || (lit=='>')) cl = 4;

if (lit==':') cl = 5;

if (lit=='=') cl = 6;

}

char sword()

{

if (strcmp(lex,"program")==0) syn = 'p';

else

{

if(strcmp(lex,"var")==0) syn = 'v';

else

{

if(strcmp(lex,"integer")==0) syn = 'g';

else

{

if(strcmp(lex,"real")==0) syn = 'r';

else

{

if(strcmp(lex,"begin")==0) syn = 'b';

else

{

if(strcmp(lex,"repeat")==0) syn = 'y';

else

{

if(strcmp(lex,"until")==0) syn = 't';

else

{

if(strcmp(lex,"end")==0) syn = 'z';

else

{ if(strcmp(lex,"true")==0) syn = 'u';

else

{ if(strcmp(lex,"false")==0) syn = 's';

else

{ if(strcmp(lex,"and")==0) syn = 'a';

else

{ if(strcmp(lex,"or")==0) syn = 'o'; else { if(strcmp(lex,"not")==0) syn = '!';

else

{

if(strcmp(lex,"boolean")==0) syn = 'd';

else syn = 'i'; }

}}}}}}}}}}

}

}

return syn;

}

void scan(void)

{

i=0;

while ((lit==' ') || (lit=='\t') || (lit=='\n'))

{ getlit();

if (feof(fr)) return; }

switch(cl)

{

case 1: lex[i++] = lit;

getlit();

while ((cl <= 2))

{

lex[i++] = lit;

getlit();

}

lex[i] = '\0';

if (strlen(lex) > 10) syn='e';

else syn = sword();

break;

case 2: lex[i++] = lit;

getlit();

while ((cl == 2) && (i<=6))

{

lex[i++] = lit;

getlit();

}

lex[i] = '\0';

if (strlen(lex) > 6) syn='e';

else syn = 'c'; break;

case 3: lex[0] = lit; lex[1] = '\0'; syn = lit; getlit(); break;

case 4: lex[i++] = lit;

getlit();

if ((cl==6))

{

if (lex[i] == '<') syn = 'm';

if (lex[i] == '>') syn = 'b';

}

else

{lex[1] = '\0'; syn = '<';}

getlit(); break;

case 5: lex[i++] = lit;

getlit();

if (cl==6)

{

lex[i++] = lit;lex[i]='\0'; syn = 'n';

}

else

{ lex[1] = '\0'; syn = ':';}

getlit(); break;

case 6: lex[0] = lit; lex[1] = '\0'; syn = lit; getlit(); break;

default: lex[0]=lit;

lex[1]='\0';syn='e';break;

}

}

void main(void)

{

fr = fopen("3.txt", "rt");

fw = fopen("2.txt", "wt");

while (!(feof(fr)))

{

scan();

printf("%c \t %s\n", syn, lex);

fprintf(fw, "%c \t %s\n", syn, lex);

lex[0]='\0'; syn=' ';

}

fclose(fr);

fclose(fw);

getch();

}

Приклад:

Вхідний файл:

program abc;

var a, b : real;

i, n : integer;

p, : boolean;

begin

a:=2555555;

i:=15;

repeat

a= b+2;

n= true

until ( not p )

p:= true;

end.

Вихідний файл:

p program

i abc

; ;

v var

i a

, ,

i b

: :

r real

; ;

i i

, ,

i n

: :

g integer

; ;

i p

, ,

: :

d boolean

; ;

b begin

i a

n :=

e 2555555

; ;

i i

n :=

c 15

; ;

y repeat

i a

= =

i b

+ +

c 2

; ;

i n

= =

u true

t until

( (

! not

i p

) )

i p

n :=

u true

; ;

z end

. .

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]