网站整体风格设计,企业网站做的好的有什么公司,扫黄打非网站建设,张家界网站制作公司一、题目要求
题目#xff1a;
选择部分C语言的语法成分#xff0c;设计其词法分析程序、语法语义分析程序。 要求#xff1a;
设计并实现一个一遍扫描的词法语法语义分析程序#xff0c;将部分C语言的语法成分#xff08;包含赋值语句、if语句、while循环语句#xf…一、题目要求
题目
选择部分C语言的语法成分设计其词法分析程序、语法语义分析程序。 要求
设计并实现一个一遍扫描的词法语法语义分析程序将部分C语言的语法成分包含赋值语句、if语句、while循环语句翻译成三地址代码要求有一定的出错提示和错误恢复功能。
二、源码
#include stdio.h
#include string.h
#include stdlib.h#define BUFFSIZE 5000
char prog[BUFFSIZE],token[8];
char ch,ch1;
int syn,p,q,m,n,sum,i1,k0,kk,flag0;
char *rwtab[32]{main,break,case,char,define,continue,default,do,double,else,what,extern,float,for,goto,if,int,long,stack,return,short,fopen,sizeof,static,struct,switch,typedef,enum,unsigned,void,fclose,while};int main() /*主函数*/
{void scaner();int lrparser();FILE *fp;if((fpfopen(test.txt,r))NULL){ printf(无法打开文件\n);exit(1);}p0;while(!feof(fp)){ prog[p]fgetc(fp);if(p5000){ printf(缓冲区容量不够!\n);exit(1);}}/*把文件test中的内容存入数组prog中*/fclose(fp);printf(%s\n,prog);p0;
printf(输出词法分析结果\n);do{scaner();switch(syn){case 34:printf((%d,%d),,syn,sum);break;case -1:printf(error,);break;default:printf((%d,%s),,syn,token);}}while(syn!0);p0;printf(\n语法语义的分析开始\n);scaner();lrparser();system(pause);return 0;
}void scaner()
{for(n0;n8;n) token[n]NULL;m0;sum0;chprog[p];while(ch ||ch\n){ p;chprog[p];}/*读下一个字符*/if((chAchZ)||(chachz)){ while((chAchZ)||(chachz)||(ch0ch9)){ token[m]ch;m;p;chprog[p];}token[m]\0;syn33;for(n0;n32;n)if(strcmp(token,rwtab[n])0){ synn1;break;}}/*判断输入字符是否为标识符或者关键字的情况*/elseif(ch0ch9){ while(ch0ch9){ sumsum*10ch-0;p;chprog[p];}syn34;}/*判断输入字符是否为整型常数的情况*/elseswitch(ch){case :token[m]ch;p;chprog[p];if(ch){ syn42;m;token[m]ch;p;}/*出现的情况*/else if(ch){ syn43;m;token[m]ch;p;}/*出现的情况*/else{ syn41;}break;case :token[m]ch;p;chprog[p];if(ch){ syn45;m;token[m]ch;p;}/*出现的情况*/else{syn44;}break;case ::token[m]ch;p;chprog[p];if(ch){ syn40;m;token[m]ch;p;}/*出现:的情况*/else{syn39;}break;case /:token[m]ch;p;chprog[p];if(ch*){ syn51;q0;m;token[m]ch;p;qp1;while(prog[p]!*||prog[q]!/){p;q;}}/*出现注释/*的情况*/else{syn38;}break;case *:token[m]ch;p;chprog[p];if(ch/){ syn52;m;token[m]ch;p;}else{syn37;}break;case :syn35;token[0]ch;p;break;case -:syn36;token[0]ch;p;break;case :syn46;token[0]ch;p;break;case ;:syn47;token[0]ch;p;break;case (:syn48;token[0]ch;p;break;case ):syn49;token[0]ch;p;break;case %:syn50;token[0]ch;p;break;case {:syn53;token[0]ch;p;break;case }:syn54;token[0]ch;p;break;case ,:syn55;token[0]ch;p;break;case #:syn0;token[0]ch;p;break;default:syn-1;}}void emit(char *result,char *ag1,char *op,char *ag2)
{printf((%d) %s%s%s%s\n,i,result,ag1,op,ag2);i;return;
}char *newtemp(void)
{char *p;char m[8];p(char *)malloc(8);k;itoa(k,m,10);strcpy(p1,m);p[0]t;return(p);
}int lrparser()
{ int yucu();int schain0;kk0;if(syn!1){printf(缺main错误\n);flag;}scaner();if(syn!48){printf(main后缺括号\n);flag;}else scaner();if(syn!49){printf(main后缺)括号\n);flag;}else scaner();if(syn!53){printf(main后缺{括号\n);flag;}else scaner();schainyucu();if(syn54){ scaner();if(syn0kk0flag0)/*kk是用来记录其他错误的标识*/printf(语法与语义分析结束。分析结果为success\n);elseprintf(程序存在着%d个错误\n,flag);}else{if(kk!1)printf(缺}错误);kk1;}return(schain);
}int yucu()
{int statement();int schain0;schainstatement();while(syn47){ scaner();schainstatement();}return(schain);
}int statement()
{char *expression();char tt[8],eplace[8];int schain0;switch(syn){ case 33:strcpy(tt,token);scaner();if(syn46){ scaner();strcpy(eplace,expression());emit(tt,eplace, , );schain0;}else{printf(赋值号错误);kk1;}return(schain);break;}
}char *expression(void)
{ char *term();char *tp,*ep2,*eplace,*tt;tp(char *)malloc(12);ep2(char *)malloc(12);eplace(char *)malloc(12);tt(char *)malloc(12);strcpy(eplace,term());while(syn35||(syn36)){ strcpy(tt,token);scaner();strcpy(ep2,term());strcpy(tp,newtemp());emit(tp,eplace,tt,ep2);strcpy(eplace,tp);}return(eplace);
}char *term(void)
{char *factor();char *tp,*ep2,*eplace,*tt;tp(char *)malloc(12);ep2(char *)malloc(12);eplace(char *)malloc(12);tt(char *)malloc(12);strcpy(eplace,factor());while(syn37||(syn38)){ strcpy(tt,token);scaner();strcpy(ep2,factor());strcpy(tp,newtemp());emit(tp,eplace,tt,ep2);strcpy(eplace,tp);}return(eplace);
}char *factor(void)
{char *fplace;fplace(char *)malloc(12);strcpy(fplace, );if(syn33){strcpy(fplace,token);scaner();}else if(syn34){itoa(sum,fplace,10);scaner();}else if(syn48){scaner();fplaceexpression();if(syn49)scaner();else{printf(缺‘)’错误!!\n);kk1;flag;}}else{printf(表达式错误\n);kk1;flag;}return(fplace);
}