
- •6.040303 Системний аналіз
- •Завдання на лабораторну роботу
- •Лабораторна робота № 2 Лексичний аналізатор
- •Теоретичний вступ
- •Завдання на лабораторну роботу
- •Лабораторна робота № 3 Граматичний аналізатор
- •Теоретичний вступ
- •Результат
- •Лабораторна робота № 4 Семантичний аналізатор
- •Теоретичний вступ
- •Результат
Завдання на лабораторну роботу
Написати програму, яка дозволяє виділити лексеми програми, написаної на мові Паскаль.
#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
. .