загрузка...
 
6. 1 Пример выполнения курсовой работы
Повернутись до змісту

6. 1 Пример выполнения курсовой работы

Вариант задания курсовой работы

Составить программу на Си для лексического анализа программы на модифицированном языке SPL,в котором все ключевые слова переведены на русский язык и вместо  begin и end используются соответственно левая и правая фигурные скобки. Вывести в файл и на экран таблицу идентификаторов и их адресов.

Вариант программы на модифицированном языке SPL (вычисляет xy), где по условию задачи все ключевые слова заменены на соответствующие на русском языке, а вместо begin  и end используются соответственно {  и  }



exp(a,b)

{

 целый z;

z=1;

пока b делать

если b%2 тогда z=z*a };

a=a*a;b=b/2

};

возврат z

}

main()

 {

целый x,y;

читать x;

читать y;

печатать exp(x,y)    }


Замечание: жирным шрифтом выделены изменения, которые необходимо внести в предыдущую программу, согласно варианту задания.

#include

#include

#include

#include

#include

#include

/*Коды лексем языка SPL*/

enum{BEGINL=257,ENDL,IFL,THENL,WHILEL,DOL,RETRL,READL,PRITL,INTL,CONSTL,IDEN,NUMB};

     int nst=0;

     int lval,lex;

     static char nch='n';

FILE*PF,*padres;

void get(void);

void number(void);

void word(void);

char*add(char*nm);

int isalpharus(char c);

int isspace1(char c);

int isdigit1(char c);

void main(int ac,char*av[])

{

clrscr();

if(!ac)

puts("Hет исходного файла");

PF=fopen(av[1],"r");

padres=fopen("getrez.dan","w");

if(!PF)

puts("Файл не открывается");

else

get();

}

void get()

{

while(nch!=EOF)

{

while(isspace1(nch))

{

if(nch=='n')

nst++;

nch=getc(PF);

}

if(isdigit1(nch))

number();

else

if(isalpharus(nch))

word();

else

if(nch=='('||nch==')'||nch==','||nch==';'||nch=='='||nch=='+'||nch=='-'||nch=='*'||nch=='/'||nch=='%'||nch=='{'||nch=='}')

{

lex=nch;

nch=getc(PF);

}

}

if(nch==EOF)

lex=EOF;

else

puts("Hедопустимый символ");

return;

}

void number()

{

for(lval=0;isdigit1(nch);nch=getc(PF))

lval=lval*10+nch-'0';

lex=NUMB;

return;

}

void word()

{

static int cdl[]={BEGINL,ENDL,IFL,THENL,WHILEL,DOL,RETRL,READL,

PRITL,INTL,CONSTL,IDEN,NUMB};

static char*serv[]={"{","}","если","тогда","пока","делать","возврат","читать","печатать","целый","const"};

int i;

char tx[40];

char*p,*add();

for(p=tx;isdigit1(nch)||isalpharus(nch);nch=getc(PF))

*(p++)=nch;

*p='';

for(i=0;i<11;i++)

if(strcmp(tx,serv[i])==0)

{

lex=cdl[i];

return;

}

lex=IDEN;

 lval=(int)add(tx);

 printf("Адрес для %s =%pn",tx,lval);

  fprintf(padres,"Адрес для %s =%pn",tx,lval);

 return;

 }

  char TNM[400];

 char*ptn=TNM;

 char*add(char*nm)

 {

 char*p,*strcpy();

 for(p=TNM;p

 if(strcmp(p,nm)==0)

 return p;

 if((ptn+=strlen(nm)+1)>TNM+400)

 {

 puts("Переполнение таблицы");

 exit(0);

 }

 return(strcpy(p,nm));

 }

/* Добавляем к исходной программе функции пользователя для распознавания букв, специальных знаков и цифр */

int isalpharus(char c)

{

int v;

if(isalpha(c)||c=='а'||c=='б'||c=='в'||c=='г'||c=='д'||c=='е'

||c=='ж'||c=='з'||c=='д'||c=='е'||c=='ж'||c=='з'||c=='и'|| c=='й'||c=='к'||c=='л'||c=='м'||c=='н'||c=='о'||c=='п'|| c=='р'||c=='с'||c=='т'||c=='у'||c=='ф'||c=='х'||c=='ц'||c=='ч'||c=='ш'||c=='щ'||c=='ы'||c=='э'||c=='ю'||c=='я'||c== 'ь')

v=8;

else

v=0;

return v;

}

int isspace1(char c)

{

int v;

if(c==' '||c=='n'||c=='t'||c=='f')

v=1;

else

v=0;

return v;

}

int isdigit1(char c)

{

int v;

if(c=='0'||c=='1'||c=='2'||c=='3'||c=='4'||c=='5'||c=='6'||c=='7'||c=='8'||c=='9')

v=2;

else

v=0;

return v;

}



загрузка...