南航金城学院编译原理课程设计杨阳教的
标准实验报告(PL0编译程序)

[标准实验报告]南昌航空大学实验报告年月日课程名称:编译原理实验名称:扩充的PL/0编译程序班级:姓名:同组人:指导教师评定:签名:一、实验目的进一步熟悉编译程序的整体框架,给出整个编译程序的流程结构,用C 或vc++语言编写程序;并将编制的编译程序进行调试、实现PL/0编译程序。
二、实验要求(1)根据所选的程序设计语言,修改并调试。
(2)举出例子程序,在程序中进行编译。
(3)用此编译程序对有关语句进行编译,并输出目标指令。
(4)书写出合格的实验报告。
三、实验步骤1.输入文件中变量的声明形如:var a,b,c; 以var保留字开始,不同变量以”,”分隔,最后以”;”结束。
2.read语句格式为read(a)或者read(a,b);3.write语句格式为write(a),括号里面没有字符串常量,注意与书后的形如write(‘a=’,a)是不相同的。
4.的声明形如:”procedure proname;”不含参数表。
5.一维数组形如:变量类型array 数组名[数组下标]。
6.条件语句形如:if <条件>then<语句> {;else,语句>}7.扩充的记录型数据类型形如:for 循环语句及带参数的过程。
四、参考源代码#include<stdio.h>/*#include"plo.h"*/#include"string.h"#define stacksize 500typedef enum{false,true}bool;enum object{procedur , constant ,variable};#define norw 13#define txmax 100#define nmax 14#define al 10#define levmax 3#define cxmax 200#define amax 2047#define symnum 32enum symbol{nul, ident, number, plus, minus,times, slash, oddsym, eql, neq,lss, leq, gtr, geq, lparen,rparen, comma, semicolon, period, becomes,beginsym, endsym, ifsym, thensym, whilesym,writesym, readsym, dosym, callsym, constsym,varsym, procsym,};enum fct {lit, opr, lod,sto, cal, inte,jmp, jpc,};#define fctnum 8struct instruction{enum fct f;int l;int a;};FILE* fas;FILE* fa;FILE* fal;FILE* fa2;bool listswitch;bool tableswitch;char ch;enum symbol sym;char id[al+1];int num;int cc,ll;int cx;char line[81];char a [al+1];int num ;int cc,ll;int cx;char line [81];char a [al+1];struct instruction code [cxmax]; char word [norw][al];struct instruction code [cxmax]; char word [norw][al];enum symbol wsym [norw]; enum symbol ssym [256]; char mnemonic [fctnum][5]; bool declbegsys [symnum]; bool statbegsys [symnum]; bool facbegsys [symnum]; bool facstatbegsys[symnum]; struct tablestruct{char name [al];enum object kind ;int val;int level;int adr;int size;};struct tablestruct table [txmax]; FILE * fin;FILE * fout;char fname [al];int err;#define getsymdo if(-1==getsym())return -1#define getchdo if(-1==getch())return -1#define testdo(a,b,c) if(-1==test(a,b,c))return -1#define gendo(a,b,c) if(-1==gen(a,b,c))return -1#define expressiondo(a,b,c) if(-1==expression(a,b,c))return -1#define factordo(a,b,c) if(-1==factor(a,b,c))return -1#define termdo(a,b,c) if(-1==term(a,b,c))return -1#define conditiondo(a,b,c) if(-1==condition(a,b,c))return -1#define statementdo(a,b,c) if(-1==statement(a,b,c))return -1#define constdeclarationdo(a,b,c) if(-1==constdeclaration(a,b,c))return -1 #define vardeclarationdo(a,b,c) if(-1==vardeclaration(a,b,c))return -1 void error(int n);int getsym();int getch();void init();int gen(enum fct x,int y,int z);int test(bool *sl,bool *s2,int n);int inset (int e,bool *s);int addset (bool* sr,bool* sl,bool *s2,int n);int subset (bool* sr,bool* sl,bool *s2,int n);int mulset (bool* sr,bool* sl,bool *s2,int n);int block (int lev,int tx,bool* fsys);void interpret();int factor (bool* fays,int * ptx,int lev);int term (bool* fays,int * ptx,int lev);int condition (bool* fays,int * ptx,int lev);int expression (bool* fays,int * ptx,int lev);int statement (bool* fays,int * ptx,int lev);void listcode(int cx0);int vardeclaration (int * ptx,int lev,int * pdx);int constdeclaration (int * ptx,int lev ,int * pdx);int position (char * idt,int tx);void enter (enum object k,int * ptx ,int lev ,int *pdx);int base (int l,int * s,int b);int main(){bool nxtlev[symnum];printf("input pl/o file?");scanf("%s",fname);fin=fopen(fname,"r");if(fin){printf("list objeck code? (Y/N)");scanf("%s",fname);/*listwitch=(fname[0]=='y'||fname[0]=='Y');*/ printf("list symbol table? (Y/N)");scanf("%s",fname);tableswitch=(fname[0]=='y'||fname[0]=='Y'); fal=fopen("fal.tmp","w");fprintf(fal,"input pl/o file?");fprintf(fal,"%s",fname);init();err=0;cc=cx=ll=0;ch='';if(-1 !=getsym()){ fa=fopen("fa.tmp","w");fas=fopen("fas.tmp","w");addset(nxtlev,declbegsys,statbegsys,symnum); nxtlev[period]=true;if(-1==block(0,0,nxtlev)){fclose(fa);fclose(fal);fclose(fas);fclose(fin);printf("\n");return 0;}fclose(fa);fclose(fal);fclose(fas);if(sym!=period){error(9);}if(err==0){fa2=fopen("fa2.tmp","w");interpret();fclose(fa2);}else{printf("error in pl/o program"); }}fclose(fin);}else{printf("can't open file! \n");}printf("\n");return 0;}/*chushihua*/void init(){ int i;for (i=0;i<=255;i++){ssym[i]=nul;}ssym['+']=plus;ssym['-']=minus;ssym['*']=times;ssym['/']=slash;ssym['(']=lparen;ssym[')']=rparen;ssym['=']=eql;ssym[',']=comma;ssym['.']=period;ssym['#']=neq;ssym[';']=semicolon;strcpy(&(word[0][0]),"begin"); strcpy(&(word[1][0]),"call"); strcpy(&(word[2][0]),"const"); strcpy(&(word[3][0]),"do");strcpy(&(word[4][0]),"end");strcpy(&(word[5][0]),"if");strcpy(&(word[6][0]),"odd"); strcpy(&(word[7][0]),"procedure"); strcpy(&(word[8][0]),"read"); strcpy(&(word[9][0]),"then"); strcpy(&(word[10][0]),"var"); strcpy(&(word[11][0]),"while"); strcpy(&(word[12][0]),"write");wsym[0]=beginsym;wsym[1]=callsym;wsym[2]=constsym;wsym[3]=dosym;wsym[4]=endsym;wsym[5]=ifsym;wsym[6]=oddsym;wsym[7]=procsym;wsym[8]=readsym;wsym[9]=thensym;wsym[10]=varsym;wsym[11]=whilesym;wsym[12]=writesym;strcpy(&(mnemonic[lit][0]),"lit"); strcpy(&(mnemonic[opr][0]),"opr"); strcpy(&(mnemonic[lod][0]),"lod"); strcpy(&(mnemonic[sto][0]),"sto"); strcpy(&(mnemonic[cal][0]),"cal"); strcpy(&(mnemonic[inte][0]),"inte"); strcpy(&(mnemonic[jmp][0]),"jmp"); strcpy(&(mnemonic[jpc][0]),"jpc");for(i=0;i<symnum;i++){declbegsys[i]=false;statbegsys[i]=false;facbegsys[i]=false;}declbegsys[constsym]=true;declbegsys[varsym]=true;declbegsys[procsym]=true;statbegsys[beginsym]=true;statbegsys[callsym]=true;statbegsys[ifsym]=true;statbegsys[whilesym]=true;facstatbegsys[ident]=true; facstatbegsys[number]=true; facstatbegsys[lparen]=true;}int inset(int e,bool*s){return s[e];}int addset(bool* sr,bool * s1,bool* s2,int n) {int i ;for(i=0;i<n;i++){sr[i]=s1[i]||s2[i];}return 0;}int subset(bool* sr,bool * s1,bool* s2,int n) {int i ;for(i=0;i<n;i++){sr[i]=s1[i]&&(!s2[i]);}return 0;}int mulset(bool* sr,bool * s1,bool* s2,int n) {int i ;for(i=0;i<n;i++){sr[i]=s1[i]&&(s2[i]);}return 0;}void error(int n){char space[81];memset(space,32,81);space[cc-1]=0;printf("*****%s!%d\n",space,n);fprintf(fal,"********%s!%d\n",space,n); err++;}int getch(){if(cc==ll){if(feof(fin)){printf("program,incomplete");return -1;}ll=0;cc=0;printf("%d",cx);fprintf(fal,"%d",cx);ch='';while(ch!=10){if(EOF==fscanf(fin,"%c",&ch)){line[ll]=0;break;}printf("%c",ch);fprintf(fal,"%c",ch);line[ll]=ch;++ll;}printf("\n");fprintf(fal,"\n");}ch=line[cc];cc++;return 0;}/*****************************8 */int getsym(){int i,j,k;while (ch==''||ch==10||ch==9){getchdo;}if(ch>='a'&& ch<='z'){k=0;do{if(k<al){a[k]=ch;k++;}getchdo;}while(ch>='a'&& ch<='z'||ch>='0'&& ch<='9');a[k]=0;strcpy(id,a);i=0;j=norw-1 ;do{k=(i+j)/2 ;if(strcmp(id,word[k])<=0) {j=k-1;}if(strcmp(id,word[k])>=0)i=k+1;}while(i<=j);if(i-1>j){sym=wsym[k];}else{sym=ident;}}else{if(ch>='0'&&ch<='9'){k=0;num=0;sym=number;do{num=10*num+ch-'0';k++;getchdo;}while (ch>='0'&&ch<='9');k--;if(k>nmax){error(30);}}else{if(ch==';'){getchdo;if(ch=='='){sym=becomes;getchdo;}else{sym=nul;}}else{if (ch=='<'){getchdo;if(ch=='='){sym=leq;getchdo;}else{sym=lss;}}else{if(ch=='>'){getchdo;if(ch=='='){sym=geq;getchdo;}else{sym=gtr;}}else{sym=ssym[ch];if(sym!=period){getchdo;}}}}}}return 0;}int gen(enum fct x,int y,int z){if(cx>=cxmax){printf("program too ling ");return -1;}code[cx].f=x;code[cx].l=y;code[cx].a=z;cx++;return 0;}int test(bool * s1,bool * s2,int n){if(! inset(sym,s1)){error(n);while((! inset(sym,s1))&&(! inset(sym,s2))) {getsymdo;}}return 0;}int block(int lev,int tx,bool* fsys){int i;int dx;int txo;int cxo;bool nxtlev[symnum];dx=3;txo=tx;table[tx].adr=cx;gendo(jmp,0,0);if(lev>levmax){error(32);}do{if(sym==constsym){getsymdo;do{constdeclarationdo(&tx,lev,&dx);while(sym==comma){getsymdo;constdeclarationdo(&tx,lev,&dx);}if (sym==semicolon) {getsymdo;}else{error(5);}}while(sym==ident);}if(sym==varsym) {getsymdo;do{vardeclarationdo(&tx,lev,&dx); while(sym==comma) {getsymdo; vardeclarationdo(&tx,lev,&dx); }if(sym==semicolon) {getsymdo;}else{error(5);}}while(sym==ident);}while(sym==procsym) {getsymdo;if(sym==ident){enter(procedur,&tx,lev,&dx); getsymdo;}else{error(4);}if(sym==semicolon) {getsymdo;}else{error(5);}memcpy(nxtlev,fsys,sizeof(bool)*symnum); nxtlev[semicolon]=true;if(-1==block(lev+1,tx,nxtlev)){return -1;}if(sym==semicolon){getsymdo;memcpy(nxtlev,statbegsys,sizeof(bool) * symnum); nxtlev[ident]=true;nxtlev[procsym]=true;testdo(nxtlev,fsys,6);}else{error(5);}}memcpy(nxtlev,statbegsys,sizeof(bool) * symnum); nxtlev[ident]=true;nxtlev[period]=true;testdo(nxtlev,declbegsys,7);}while(inset(sym,declbegsys));code[table[txo].adr].a=cx;table[txo].adr=cx;table[txo].size=dx;cxo=cx;gendo(inte,0,dx);if(tableswitch){printf("TABLE:\n");if(txo+1>tx){printf("NULL\n");}for(i=txo+1;i<=tx;i++){switch(table[i].kind){case constant:printf("%d const %s",i,table[i].name);printf("val=%d\n",table[i].val);fprintf(fas,"%d const %s",i,table[i].name);fprintf(fas,"val=%d\n",table[i].val);break;case variable:printf("%d var %s",i,table[i].name);printf("lev=%d addr=%d\n",table[i].level,table[i].adr);fprintf(fas,"%d var %s",i,table[i].name);fprintf(fas,"lev=%d addr=%d\n",table[i].level,table[i].adr);break;case procedur:printf("%d proc %s",i,table[i].name);printf("lev=%d addr=%d size=%d\n",table[i].level,table[i].adr,table[i].size); fprintf(fas,"%d proc %s",i,table[i].name);fprintf(fas,"lev=%d addr=%d size=%d\n",table[i].level,table[i].adr,table[i].size); break;}}printf("\n");}memcpy(nxtlev,fsys,sizeof(bool) * symnum);nxtlev[semicolon]=true;nxtlev[endsym]=true;statementdo(nxtlev,&tx,lev);gendo(opr,0,0);memset(nxtlev,0,sizeof(bool) * symnum);testdo(fsys,nxtlev,8);listcode(cxo);return 0;}void enter(enum object k , int * ptx , int lev , int * pdx){(*ptx)++;strcpy(table[(*ptx)].name,id);table[(*ptx)].kind=k;switch(k){case constant:if(num>amax){error(31);num=0;}table[(*ptx)].val=num;break;case variable:table[(*ptx)].level=lev;table[(*ptx)].adr=(*pdx);(*pdx)++;break;case procedur:table[(*ptx)].level=lev;break;}}int position(char*idt,int tx){int i;strcpy(table[0].name,idt);i=tx;while(strcmp(table[i].name,idt)!=0){i--;}return i;}int constdecalration(int *ptx,int lev,int *pdx) {if(sym==ident){getsymdo;if(sym==eql||sym==becomes){if(sym==becomes)error(1);getsymdo;if(sym==number){enter(constant,ptx,lev,pdx);getsymdo;}else{error(2);}}else{error(3);}}else{error(4);}return 0;}int constdeclaration(int * ptx,int lev,int * pdx){if (sym==ident){getsymdo;if (sym==eql||sym==becomes){if (sym==becomes){error(1);}getsymdo;if (sym ==number){enter(constant,ptx,lev,pdx);getsymdo;}else{error(2);}}else{error(3);}}else{error(4);}return 0;}int vardeclaration(int* ptx,int lev,int* pdx){if (sym==ident){enter(variable,ptx,lev,pdx);getsymdo;}else{error(4);}return 0;}void listcode(int cx0){int i;if (listswitch){for (i=cx0;i<cx;i++){printf("%d %d %d %d\n",i,mnemonic[code[i].f],code[i].l,code[i].a);fprintf(fa,"%d %s %d %d\n",i,mnemonic[code[i].f],code[i].l,code[i].a);}}}int statement(bool* fsys,int* ptx,int lev){int i,cxl,cx2;bool nxtlev[symnum];if (sym==ident){i=position(id,*ptx);if (i==0){error(11);}else{if(table[i].kind !=variable){error(12);i=0;}else{getsymdo;if(sym==becomes){getsymdo;}else{error(13);}memcpy(nxtlev,fsys,sizeof(bool)*symnum);expressiondo(nxtlev,ptx,lev);if(i!=0){gendo(sto,lev-table[i].level,table[i].adr);}}}/*if(i==0)*/}else{if(sym==readsym){getsymdo;if(sym!=lparen){error(34);}else{do{getsymdo;if(sym==ident){i=position(id,*ptx);}else{i=0;}if(i==0){error(35);}else{gendo(opr,0,16);gendo(sto,lev-table[i].level,table[i].adr) ;}getsymdo;}while(sym==comma);}if(sym!=rparen){error(33);while(! inset(sym,fsys)){getsymdo;}}else{getsymdo;}}else{if(sym==writesym){getsymdo;if(sym==lparen){do{getsymdo; memcpy(nxtlev,fsys,sizeof(bool)*symnum);nxtlev[rparen]=true;nxtlev[comma]=true;expressiondo(nxtlev,ptx,lev);gendo(opr,0,14);}while(sym==comma);if(sym!=rparen){error(33);}else{getsymdo;}}gendo(opr,0,15);}else{if(sym==callsym){getsymdo;if(sym!=ident){error(14);}else{i=position(id,*ptx);if(i==0){error(11);}else{if(table[i].kind==procedur){gendo(cal,lev-table[i].level,table[i].adr);}else{error(15);}}getsymdo;}}else{if(sym==ifsym){getsymdo;memcpy(nxtlev,fsys,sizeof(bool)*symnum);nxtlev[thensym]=true;nxtlev[dosym]=true;conditiondo(nxtlev,ptx,lev);if(sym==thensym){getsymdo;}else{error(16);}cxl=cx;gendo(jpc,0,0);statementdo(fsys,ptx,lev);code[cxl].a=cx;}else{if(sym==beginsym){getsymdo;memcpy(nxtlev,fsys,sizeof(bool)*symnum);nxtlev[semicolon]=true;nxtlev[endsym]=true;statementdo(nxtlev,ptx,lev);while(inset(sym,statbegsys)||sym==semicolon){if(sym==semicolon){getsymdo;}else{error(10);}statementdo(nxtlev,ptx,lev);}if(sym==endsym){getsymdo;}else{error(17);}}else{if(sym==whilesym){cxl=cx;getsymdo;memcpy(nxtlev,fsys,sizeof(bool)*symnum);nxtlev[dosym]=true;conditiondo(nxtlev,ptx,lev);cx2=cx;gendo(jpc,0,0);if(sym==dosym){getsymdo;}else{error(18);}statementdo(fsys,ptx,lev);gendo(jmp,0,cxl);code[cx2].a=cx;}else{testdo(fsys,nxtlev,19);}}}}}}}return 0;}int expression(bool * fsys,int * ptx,int lev){enum symbol addop;bool nxtlev[symnum];if(sym==plus||sym==minus){addop=sym;getsymdo;memcpy(nxtlev,fsys,sizeof(bool)*symnum);nxtlev[plus]=true;nxtlev[minus]=true;termdo(nxtlev,ptx,lev);if(addop==minus){gendo(opr,0,1);}}else{memcpy(nxtlev,fsys,sizeof(bool)*symnum);nxtlev[plus]=true;nxtlev[minus]=true;termdo(nxtlev,ptx,lev);}while(sym==plus||sym==minus){addop=sym;getsymdo;memcpy(nxtlev,fsys,sizeof(bool)*symnum);nxtlev[plus]=true;nxtlev[minus]=true;termdo(nxtlev,ptx,lev);if(addop==plus){gendo(opr,0,2);}else{gendo(opr,0,3);}}return 0;}int term(bool*fsys,int*ptx,int lev){enum symbol mulop;bool nxtlev[symnum];memcpy(nxtlev,fsys,sizeof(bool)*symnum);nxtlev[times]=true;nxtlev[slash]=true;factordo(nxtlev,ptx,lev);while(sym==times||sym==slash){mulop=sym;getsymdo;factordo(nxtlev,ptx,lev);if(mulop==times){gendo(opr,0,4);}else{gendo(opr,0,5);}}return 0;}int factor(bool*fsys,int*ptx,int lev){int i;bool nxtlev[symnum];testdo(facbegsys,fsys,24);while(inset(sym,facbegsys)){if(sym==ident){i=position(id,*ptx);if(i==0){error(11);}else{switch(table[i].kind){case constant:gendo(lit,0,table[i].val);break;case variable:gendo(lod,lev-table[i].level,table[i].adr);break;case procedur:error(21);break;}}getsymdo;}else{if(sym==number){if(num>amax){error(31);num=0;}gendo(lit,0,num);getsymdo;}else{if(sym==lparen){getsymdo;memcpy(nxtlev,fsys,sizeof(bool)*symnum);nxtlev[rparen]=true;expressiondo(nxtlev,ptx,lev);if(sym==rparen){getsymdo;}else{error(22);}}testdo(fsys,facbegsys,23);}}}return 0;}int condition(bool*fsys,int*ptx,int lev){enum symbol relop;bool nxtlev[symnum];if(sym==oddsym){getsymdo;expressiondo(fsys,ptx,lev);gendo(opr,0,6);}else{memcpy(nxtlev,fsys,sizeof(bool)*symnum);nxtlev[eql]=true;nxtlev[neq]=true;nxtlev[lss]=true;nxtlev[leq]=true;nxtlev[gtr]=true;nxtlev[geq]=true;expressiondo(nxtlev,ptx,lev);if(sym!=eql&&sym!=neq&&sym!=lss&&sym!=leq&&sym!=gtr&&s ym!=geq){error(20);}else{relop=sym;getsymdo;expressiondo(fsys,ptx,lev);switch(relop){case eql:gendo(opr,0,8);break;case neq:gendo(opr,0,9);break;case lss:gendo(opr,0,10);break;case geq:gendo(opr,0,11);break;case gtr:gendo(opr,0,12);break;case leq:gendo(opr,0,13);break;}}}return 0;}void interpret(){int p,b,t;struct instruction i;int s[stacksize];printf("start pl0\n");t=0;b=0;p=0;s[0]=s[1]=s[2]=0;do{i=code[p];p++;switch(i.f){case lit:s[t]=i.a;t++;break;case opr:switch(i.a){case 0:t=b;p=s[t+2];b=s[t+1]; break;case 1:s[t-1]=-s[t-1]; break;case 2:t--;s[t-1]=s[t-1]+s[t]; break;case 3:t--;s[t-1]=s[t-1]-s[t]; break;case 4:t--;s[t-1]=s[t-1]*s[t]; break;case 5:t--;s[t-1]=s[t-1]/s[t]; break;case 6:t--;s[t-1]=s[t-1]%2; break;case 8:t--;s[t-1]=(s[t-1]==s[t]); break;case 9:t--;s[t-1]=(s[t-1]!=s[t]); break;case 10:t--;s[t-1]=(s[t-1]<s[t]); break;case 11:t--;s[t-1]=(s[t-1]>=s[t]); break;case 12:t--;s[t-1]=(s[t-1]>s[t]); break;case 13:t--;s[t-1]=(s[t-1]<=s[t]); break;case 14:printf("%d",s[t-1]); fprintf(fa2,"%d",s[t-1]); t--;break;case 15:printf("\n");fprintf(fa2,"\n"); break;case 16:printf("?");fprintf(fa2,"?");scanf("%d",&(s[t])); fprintf(fa2,"%d\n",s[t]);t++;break;}break;case lod:s[t]=s[base(i.l,s,b)+i.a];t++;break;case sto:t--;s[t]=s[base(i.l,s,b)+i.a]=s[t]; break;case cal:s[t]=base(i.l,s,b);s[t+1]=b;s[t+2]=p;b=t;p=i.a;break;case inte:t+=i.a;break;case jmp:p=i.a;break;case jpc:t--;if(s[t]==0)p=i.a;break;}}while(p!=0);}int base(int l,int *s,int b) {int b1;b1=b;while(l>0){b1=s[b1];l--;}return b1;}五、实验结果1.输入PL/0源程序const a=10;var b,c;procedure pbeginc:=b+aend;beginread (b);while b#0 dobegincall p;write(2*c);read(b)endend.2. 输入分别输入b值的结果当b=2;输出结果为24当b=3;输出结果为26当b=1;出结果为22当b=0;结束程序六、实验体会通过该实验,本人学会了应用C语言调试和扩充PL/0编译程序的能力,此实验完成了PL/0词法分析、语法分析、语义分析、代码生成和代码优化等功能,并在此基础上实现了PL/0语言的扩充能力,从实际的应用中深刻领悟了编译程序的原理,更加深刻的学习了理论知识。
c语言课程设计--通讯录管理系统

5.4《C语言程序设计》课程设计实验报告封面南京航空航天大学金城学院《C语言程序设计》课程设计实验报告题目:班级:学号:姓名:成绩:指导教师:完成日期:年月日目录1.第一章:前言 (2)2.第二章:概述 (3)3.第三章:主要流程图 (4)4.第四章:算法分析 (5)5.第五章:测试及输出结果 (9)6.第六章:课程设计体会…………………………………………7.第七章:参考文献……………………………………………8.第八章:程序源代码………………………………………………通过一个学期的学习,我认为要学好C语言程序这门课程,不仅要认真学习课本知识,更重要的是要通过上机实践实现对知识的强化与巩固。
C语言博大精深,需要我们认真体会,小心求证,不断实践。
C语言课程设计则对我们有以下几点帮助:1. 进一步掌握和利用C语言进行程序设计的能力;2. 进一步理解和运用结构化程序设计的思想和方法;3. 初步掌握开发一个小型实用系统的基本方法;4. 学会调试一个较长程序的基本方法;5. 学会利用流程图或N-S图表示算法;6. 掌握书写程设计开发文档的能力 (书写课程设计报告) 。
目的和意义:本课程设计可加深对课堂理论学习的理解,增强动手能力,以培养学生合作的能力,为毕业设计作好实践环节上的准备。
通讯录系统是在学校常见的计算机信息管理系统。
它的主要任务是对学生信息进行管理,如学生信息的输入、查询、修改、增加、删除,迅速准确地完成各种学生信息的统计和查询。
主要内容:本系统有分6个功能:(1)添加数据(2)查询数据(3)删除数据(4)修改数据(5)全部输出(6)退出其主要利用结构类型,指针,数组,函数等C语言知识来实现。
1.添加数据:输入姓名、电话号码及地址,即可添加数据。
2.查询数据:输入所要查询的姓名即可查询。
3.修改数据:输入所要修改的姓名,进行修改,保存后即成功。
4.删除数据:输入所要删除的姓名,确定后即成功。
5.输出数据:点击后即可查看所有保存的通讯录数据。
南邮编译原理课程设计

南邮编译原理课程设计一、课程目标知识目标:1. 理解编译原理的基本概念,掌握编译器的各个阶段及其功能;2. 学习并掌握词法分析、语法分析、语义分析的基本方法;3. 了解目标代码生成和代码优化的一般方法。
技能目标:1. 能够运用形式语言和自动机理论分析编程语言;2. 学会使用编译器构造工具,如lex和yacc,进行简单的编译器编写;3. 能够运用所学知识对简单程序进行编译过程的调试和分析。
情感态度价值观目标:1. 培养学生对编译原理的兴趣,激发学生自主学习、深入研究的热情;2. 培养学生的团队合作精神,提高学生在团队中的沟通协作能力;3. 使学生认识到编译技术在计算机科学与技术领域的重要地位,增强学生的专业认同感。
课程性质分析:本课程为计算机科学与技术专业核心课程,涉及编译原理的基础知识和实践技能。
课程注重理论与实践相结合,培养学生对编译过程的理解和编译器的构造能力。
学生特点分析:南邮学生具备一定的编程基础和计算机科学理论知识,对编译原理有一定了解,但可能缺乏系统性的认识和实际操作经验。
教学要求:1. 结合实际案例,深入浅出地讲解编译原理的基础知识;2. 强化实践环节,通过实际操作,使学生掌握编译器构造的基本方法;3. 注重培养学生的主动学习能力和团队合作精神,提高学生的综合素质。
二、教学内容1. 编译原理概述:介绍编译器的定义、编译过程及其各个阶段的作用,引导学生理解编译器的整体框架。
教材章节:第一章2. 词法分析:讲解词法分析的基本概念、词法分析器的功能及其实现方法,包括正则表达式和有限自动机理论。
教材章节:第二章3. 语法分析:介绍语法分析的基本概念、语法分析器的功能及其实现方法,包括上下文无关文法、递归下降分析和LL(1)分析法等。
教材章节:第三章4. 语义分析:讲解语义分析的作用、类型检查和符号表等基本概念,探讨语义分析的方法和实现。
教材章节:第四章5. 中间代码生成与优化:介绍中间代码的特点、生成方法以及常见的优化技术。
关于开展第二届教师讲课-南京航空航天大学金城学院

关于开展第三届教师讲课比赛半决赛的通知各教学部门:根据学院《关于开展南航金城学院第三届教师讲课比赛的通知》精神与要求,各教学单位通过组织选拔赛,并择优推荐,共推荐31位教师进入第三届教师讲课比赛半决赛阶段(其中理工组16人,经管文艺组15人。
具体名单见附件)。
现将半决赛参赛事宜通知如下:一、比赛方式和内容(一)比赛方式半决赛比赛采用分组集中授课、集中评审的方式进行。
参赛教师分为理工、经管文艺两个组别集中比赛。
参赛教师现场授课,评选专家现场打分。
根据评审专家打分情况排定各组参赛教师名次。
每位参赛教师现场授课时间不超过15分钟。
(二)参赛内容参赛教师半决赛参赛内容以报名时上报授课内容为准(具体内容见附件)。
(三)选拔规则根据评审专家打分结果,分别在两组中选拔出得分较高的前50%参赛教师(理工组共16人,选拔出前8名,文艺经管组15人,选拔出前7名)进入决赛。
二、比赛时间与地点(一)比赛时间2015年12月14日(第16周周一),上午8:30开始。
(二)比赛地点理工组:A4N308经管文艺组:A4N207三、其他注意事项各参赛教师需在12月11日上午9:00在德馨楼321办公室参加抽签,决定比赛顺序。
请各位参赛教师认真做好本阶段竞赛的授课安排及准备。
参赛时,需提供所授课程的教案、课件等教学资料的纸质档供评审专家审阅。
各教学部门需选派至少5名教师观摩比赛,并需在12月11日下午16:00前将参加观摩教师名单报至教务处教研科。
特此通知。
南航金城学院教务处二〇一五年十二月九日附件:南航金城学院第三届教师讲课比赛半决赛教师名单。
《编译原理》课程思政教学案例(一等奖)精选全文

精选全文完整版(可编辑修改)《编译原理》课程思政教学案例(一等奖)一、课程和案例的基本情况课程名称:编译原理授课对象:计算机科学与技术专业课程性质:专业核心课课程简介:《编译原理》是计算机科学与技术专业本科生的专业核心课程,课程内容为计算机编译程序设计和构造的基本原理和实现技术,包括词法分析、语法分析、语义分析和中间代码生成、代码优化和目标代码生成等五个典型阶段。
编译程序是计算机重要的系统软件,编译技术是我国自主可控计算机核心系统研发及技术突破的关键技术之一。
课程以形式语言与自动机为理论基础,特点是理论抽象、系统性强、理论性强、实践性强,其理论和思想蕴含着计算机科学中抽象问题和解决问题的思想和方法,也是计算机科学中理论和实践相结合的典范。
基于课程特点和认知规律,以学生思想方法启迪和思维能力培养为着眼点,深度融合课程思政与课程教学,将方法论和辩证思维融入编译的原理、技术和实现,引领知识传授、能力培养和价值塑造,提升课程的思想内涵和教学高度。
1.案例简介该案例的教学内容“LR语法分析法”(以下称“LR分析法”)是语法分析中的自下而上分析法,处于课程的中期阶段,位于词法分析之后。
主要内容:(1)LR分析法分析问题和解决问题的基本思想,活前缀和可归前缀概念引入和形式定义;(2)LR(0)分析基本方法和最左归约的实现,进一步引出LR(0)分析器逻辑结构以及LR(0)分析过程。
LR分析法是迄今为止最年轻的计算机图灵奖获得者高德纳.克努斯提出的,分析法堪称经典,也是课程的难点。
方法论和辩证思维的运用和体现,深层次诠释了LR分析法的思想真谛和科学思维。
2.本讲内容的教学目标知识传授启发思想:领会LR分析法的理论依据和总体思想;理解活前缀和可归前缀的形式定义以及与句柄的关系;掌握LR(0)分析器逻辑结构和LR(0)分析实现过程。
重点理解LR分析问题和解决问题的思想和方法,提高专业素养。
将方法论融入教学内容中,在知识传授的同时初步体会方法论之认识世界和改造世界的方法和运用。
编译原理课程设计内容

编译原理课程设计内容一、教学目标本节课的教学目标是使学生掌握编译原理的基本概念和基本方法,能够理解源程序的词法分析、语法分析和语义分析等过程,并能够运用这些知识对简单的程序进行编译。
通过本节课的学习,学生应达到以下具体目标:1.知识目标:了解编译原理的基本概念、编译过程和编译器的基本结构;掌握源程序的词法分析、语法分析和语义分析的基本方法。
2.技能目标:能够运用编译原理的基本知识对简单的程序进行编译;能够使用至少一种编译器进行程序设计。
3.情感态度价值观目标:培养学生对计算机科学和编程的兴趣和热情,提高学生分析问题和解决问题的能力。
二、教学内容本节课的教学内容主要包括以下几个部分:1.编译原理的基本概念和编译过程;2.源程序的词法分析、语法分析和语义分析的基本方法;3.编译器的基本结构和工作原理;4.简单程序的编译实例。
三、教学方法为了达到本节课的教学目标,将采用以下几种教学方法:1.讲授法:通过讲解编译原理的基本概念、编译过程和编译器的基本结构,使学生掌握相关知识。
2.案例分析法:通过分析具体程序的编译过程,使学生理解和掌握词法分析、语法分析和语义分析的方法。
3.实验法:让学生亲自使用编译器进行程序设计,提高学生的实际操作能力。
四、教学资源为了支持本节课的教学内容和教学方法的实施,将准备以下教学资源:1.教材:《编译原理》;2.参考书:相关编译原理的专著和论文;3.多媒体资料:关于编译原理的PPT、视频等;4.实验设备:计算机和编译器。
五、教学评估为了全面、公正地评估学生在编译原理课程中的学习成果,将采用以下几种评估方式:1.平时表现:通过观察学生在课堂上的参与程度、提问回答等情况,评估学生的学习态度和理解程度;2.作业:布置与课程内容相关的编程作业,评估学生的实际操作能力和对知识的掌握程度;3.考试:进行期中考试和期末考试,评估学生对课程知识的全面理解和运用能力。
六、教学安排本学期的编译原理课程安排如下:1.教学进度:按照教材《编译原理》的章节顺序进行教学,确保每个章节都有足够的时间进行讲解和讨论;2.教学时间:每周两节课,每节课45分钟,共计18周;3.教学地点:计算机实验室,以便学生进行实验和实践。
南京航空航天大学金城学院3

南京航空航天大学金城学院《C语言程序设计》课程设计实验报告题目:五子棋游戏班级:20110222姓名:张冲学号:2011022221指导老师:谢金国日期:2012 年2月16 日一、课题要求:在一个方阵上通过两人对弈的形式,依次在棋盘上放置两种颜色的棋子,哪一方先让五个棋子形成一条直线(包括横、竖、对角线3个方向),即为获胜,本程序实现用键盘控制的五子棋游戏。
游戏初始运行界面应为如下:游戏操作规则:按左右上下方向键移动棋子按空格键确定落棋子禁止在棋盘外按空格你是否接受上述的游戏规则(Y/N)如果输入Y,才可以进行游戏,进入正式的游戏界面,要绘制五子棋的棋盘,设置棋子颜色。
二、程序设计代码(C语言)#include<stdio.h>#include<stdlib.h>#include<graphics.h>#include<bios.h>#include<conio.h>#define LEFT 0×4b00#define RIGHT 0×4d00#define DOWN 0×5000#define UP 0×4800#define ESC 0×011b#define SPACE 0×3920#define BILI 20#define JZ 4#define JS 3#dfine N19int box[N][N];int step_x,step_y;int key;int flag=1;void draw_box();void draw_cicle(int x,int y,int color)void change();void judgewho(int x,int y);void judgekey();int judgeresult(int x,int y);void attention();void attention(){char ch;window(1,1,80,25);textbackground(LIGHTBLUE);textcolor(YELLOW);clrscr();gotoxy(15,2);printf("游戏操作规则:");gotoxy(15,4);printf("Play Rules:");gotoxy(15,6);printf("1、按左右上下方向键移动棋子");gotoxy(15,8);printf("1.Press Left,Right,Up,Down Key to move piece");gotoxy(15,10);printf("2、按空格确定落棋子");gotoxy(15,12);printf("2.Press Space to place the Piece");gotoxy(15,14);printf("3、禁止在棋盘外按空格");gotoxy(15,16);printf("3.DO NOT press Space outside of the chessboard"); gotoxy(15,18);printf("你是否接受上述的游戏规则(Y/N)");gotoxy(15,20);printf("Do you accept the above Playing Rules?[Y/N]:"); while(1){gotoxy(60,20);ch=getche();if(ch=='Y'||ch=='y')break;else if(ch=='N'||ch=='n')window(1,1,80,25);textbackground(BLACK);textcolor(LIGHTGRAY);clrscr();exit(0);}gotoxy(51,12);Printf("");}}void draw_box(){int x1,x2,y1,y2;setbkcolor(LIGHTBLUE);setcolor(YELLOW);gotoxy(7,2);printf("Left,Right,Up,Down KEY to move,Space to put ,ESC-quit."); for(x1=1,y1=1,y2=18;x1<=18;x1++)line((x1+JZ)*BILI,(y1+JS)*BILI,(x1+JZ)*BILI,(y2+JS)*BILI); for(x1=1,y1=1,x2=18;y1<=18,y1++)line((x1+JZ)*BILI,(y1+JS)*BILI,(x2+JZ)*BILI,(y1+JS)*BILI); For(x1=1;x1<=18;x1++)For(y1=1;y1<=18;y1++)Box[x1][y1]=0;}V oid draw_circle(int x,int y,int color){Setcolor(color);Setlinestyle(SOLID_LINE,0,1);X=(x+JZ)*BILI;Y=(y+JS)*BILI;Circle(x,y,8);}V oid judgekey(){Int i;Int j;Switch(key){Case LEFT;If(step_x-1<0)Break;ElseFor(i=step_x-1,j=step_y;i>=1;i--)If(box[i][j]==0){Draw_circle(step_x,step_y,LIGHTBLUE); Break;}If(i<1)break;Step_x=i;Judgewho(step_x,step_y);Break;}Case RIGHT;If(step_x+1>18)Break;Else{For(i=step_x+1,j=step_y;i<=18,i++)If(box[i][j]==0){Draw_circle(step_x,step_y,LIGHTBLUE); Break;}If(i>18)break;Step_x=i;Judgewho(step_x,step_y);Break;}Case DOWN:If((step_y+1)>18Break;Else{For(i=step_x,j=step_y+1;j<=18;j++)If(box[i][j]==0){Draw_circle(step_x,step_y,LIGHTBLUE); Break;}If(j>18)break;Step_y=j;Judgewho(step_x,step_y);Break;}Case UP;If((step_y-1)<0)Break;Else{For(i=step_x,j=step_y-1;j>=1;j--)If(box[i][j]==0){Draw_circle(step_x,step_y,LIGHTBLUE);Break;}If(i<1)break;Step_y=j;Judgewho(step_x,step_y);Break;}Case ESC:Break;Case SPACE:If(step_x>=1&&step_x<=18&&step_y>=1&&step_y<=18) {If(box[step_x][step_y]==0){box[step_x][step_y]=flag;If(judgeresult(step_x,step_y)==1){Sound(1000);Delay(1000);Nosound();Gotoxy(30,4);If(flag==1){Setbkcolor(BLUE);Cleardevice();Setviewport(100,100,540,380,1);/*定义一个图形窗口*/Setfillstyle(1,2);/*绿色以实填充*/Setcolor(YELLOW);Rectangle(0,0,439,279);Floodfill(50,50,14);Setcolor(12);Settextstyle(1,0,5);/*三重笔划字体,水平放5倍*/Outtextxy(20,20,"The White Win!"); Setcolor(15);Settextstyle(3,0,5);/*无衬笔划字体,水平放大5倍*/ Outtextxy(120,120,"The White Win!"); Setcolor(14);Settextstyle(2,0,8);Getch();Closegraph();Exit(0);}If(flag==2){Setbkcolor(BLUE);Cleardevice();Setviewport(100,100,540,380,1);/*定义一个图形窗口*/Setfillstyle(1,2);/*绿色以实填充*/Setcolor(YELLOW);Rectangle(0,0,439,279);Floodfill(50,50,14);Setcolor(12);Settextstyle(1,0,8);/*三重笔划字体,水平放大8倍*/ Outtextxy(20,20,"The Red Win!"); Setcolor(15);Settextstyle(3,0,5);/*无衬笔划字体,水平放大5倍*/ Outtextxy(120,120,"The Red Win!"); Setcolor(14);Settextstyle(2,0,8);Getch();Closegraph();Exit(0);}}Change();Break;}}Else break;}}V oid change(){If(flag==1)Flag==2;else flag=1;}V oid judgewho(int x,int y) {If(flag==1)Draw_circle(x,y,15);If(flag==2)Draw_circle(x,y,4);}Int judgeresult(int x,int y) {Int j,k,n1,n2;While(1){ n1=0; n2=0; /*水平向左数*/For(j=x,k=y,j>=1;j--){If(box[j][k]==flag)n1++;else break;}/*水平向右数*/For(j=x,k=y,j<=18;j++){If(box[j][k]==flag)N2++;else break;}If(n1+n2-1>=5){Return(1);Break;}/*垂直向上数*/N1=0;N2=0;For(j=x,k=y,k>=1,k--){If(box[j][k]==flag)N1++;else break;}/*垂直向下数*/For(j=x,k=y;k<=18;k++) {If(box[j][k]==flag)N2++;else break;}If(n1+n2-1>=5){Return(1);Break;}/*向左上方数*/N1=0;N2=0;For(j=x,k=y;j>=1,k>=1;j--,k--){If(box[j][k]==flag)N1++;else break;}/*向右下方数*/For(j=x,k=y;j<=18,k<=18;j++,k++) {If(box[j][k])==flag)N2++;else break;}If(n1+n2-1>=5){Return(1);Break;}/*向右上方数*/N1=0;N2=0;For(j=x,k=y;j<=18,k>=1;j++,k--) {If(box[j][k]==flag)N1++;else break;}/*向左下方数*/For(j=x,k=y;j>=1,k<=18;j--,k++) {If(box[j][k]==flag)N2++;else break;}If(n1+n2-1>=5){Return(1);Break;}Return(0);Break;}} void main(){Int gdriver=VGA,gmode=VGAHI; Clrscr();Attention();Initgraph(&gdriver,&gmode,"c:\\tc"); /*setwritemode(XOR_PUT);*/Flag=1;Draw_box();Do{Step_x=0;Step_y=0;/*draw_circle(step_x,step_y,8);*/ Judgewho(step_x-1,step_y-1);Do{While(bioskey(1)==0);Key=bioskey(0);Judgekey();}While(key!=SPACE&&key!=ESC) }While(key!=ESC);Closegraph();}三、流程图设计四、心得体会第一次接触课程设计,在完成这份任务的同时,遇到了很多困难。
编译原理课设报告ll0

编译原理课设报告ll0编译原理课设报告LL(0)。
一、引言。
编译原理是计算机科学与技术领域的重要课程之一,它研究如何将高级程序语言翻译成机器语言。
LL(0)是一种重要的语法分析方法,它是一种自顶向下的分析方法,通过构建语法树来实现对程序语言的分析和翻译。
本报告将介绍LL(0)语法分析的原理、算法以及课设的设计与实现。
二、LL(0)语法分析原理。
LL(0)语法分析是一种基于预测分析表的自顶向下语法分析方法。
它通过预测下一个输入符号,根据文法规则进行推导,最终构建出语法树。
LL(0)的意思是“左侧扫描、左推导、0个向前看符号”。
LL(0)语法分析的关键是构建预测分析表,该表包含了文法的非终结符和终结符的组合,以及对应的产生式。
通过分析输入串和预测分析表,可以确定下一个推导所使用的产生式,从而构建语法树。
三、LL(0)语法分析算法。
1. 构建First集和Follow集。
在LL(0)语法分析中,需要先构建每个非终结符的First集和Follow集。
First集表示该非终结符能够推导出的终结符集合,Follow集表示在该非终结符的右侧能够出现的终结符集合。
2. 构建预测分析表。
根据文法的产生式和First集、Follow集,构建预测分析表。
预测分析表的行表示文法的非终结符,列表示文法的终结符。
表中的每个格子填写对应的产生式。
3. 进行语法分析。
根据输入串和预测分析表,进行语法分析。
从左到右扫描输入串,根据当前输入符号和栈顶符号,在预测分析表中查找对应的产生式。
将产生式右侧的符号入栈,并将输入串向右移动一个位置。
重复这个过程,直到输入串为空或者出现错误。
四、课设设计与实现。
1. 文法设计。
根据课设要求,设计符合LL(0)语法分析方法的文法。
文法应该满足左递归消除、左因子消除等要求,以便于构建预测分析表。
2. 构建预测分析表。
根据设计的文法,构建预测分析表。
根据文法的非终结符和终结符,填写预测分析表中的产生式。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
产生式主程序:Program-> main () {DefList; StmtList}定义变量:DefList-> Def; DefListDefList-> DefDef-> Type IDListType-> intType-> floatIDList-> id, IDListIDList-> id定义语句:StmtList-> Stmt; StmtListStmtList-> Stmt;赋值语句:Stmt-> id:=E条件分支语句Stmt-> if (BE) {StmtList} else {StmtList}算数表达式:(1) 自上而下分析法(2) 自下而上分析法E-> TE’E-> TE’-> +TE’E-> E+TE’-> εT-> FT-> FT’T-> T*FT’-> *FT’F-> (E)T’-> εF-> idF-> (E) F-> numF-> id F-> floatnumF-> intnumF-> floatnum布尔表达式:BE-> id < idBE-> id > idBE-> id = idBE-> id < intnumBE-> id > intnumBE-> id = intnum课程设计要实现的内容:(1)设计词法分析器设计各单词的状态转换图,并为不同的单词设计种别码。
功能包括:a. 能够拼出语言中的各个关键字、运算符和界符;b. 能够识别出标识符和不同类型的常量;c. 能对输入的一段文本程序输出其词法成分的各种别编码和属性值(对关键字,输出其种别编码,属性值为空;对常量,输出其种别编码和常量的值;对变量,输出其种别编码和变量名)。
(2)语法分析要求用递归下降分析法、LL(1)分析法或SLR(1)分析法,对词法分析的结果进行语法分析。
(实现对标识符表的插入和查找,见(3))若语法正确,则输出一棵语法树。
若语法错误,则报错。
(3)设计标识符表,并实现一定的语义分析(可选)标识符表应至少包括名字栏和数据类型栏。
在语法分析中:对在声明语句中出现的关于标识符的声明,如果该名字在符号表中不存在,则将其加入到符号表中,并将数据类型填入。
若名字已经存在被声明过,则报错。
对一般语句中出现的标识符,可以查找标识符表,若标识符不在表中,则报错。
验收要求1、有标识符表的构造说明文档(可选)2、有种别编码表的说明文档3、有词法分析的DFA图4、若使用了递归下降分析法需要有根据产生式构造的first/follow集、若使用了LL(1)分析法需要有预测分析表,若使用了SLR(1)分析法需要有SLR(1)分析表5、有可执行的源程序,能输出词法分析的结果、语法分析的语法树(和标识符表)源程序:#include <iostream>#include<string>using namespace std;#include<stdio.h>#include<stdlib.h>#include<sstream>int i,j,k,flag,number,status,m=0,n=0,d,dian;//d为在计算小数时除以0.1的次数/*status which is use to judge the string is keywords or not!*/char ch;float number1;char words[10] = {" "};char program[500];int flags[500]; //存储输入句子string cnt[500];//标识符int temp=0; //数组下标int is_right=1; //判断输出信息char num[500];//-----------------------词法分析-----------------------------int Scan(char program[]){char *keywords[9] = {"int","char","float","if","else","do","while","printf","main"}; //关键字number=0;status=0;j=0;ch=program[i++];//遍历while(ch==' '||ch=='\n') //跳过空字符(无效输入)ch=program[i++];if ((ch >= 'a') && (ch <= 'z' )) //字母{while ((ch >= 'a') && (ch <= 'z' )){words[j++]=ch;ch=program[i++];}i--;words[j++] = '\0';for (k = 0; k < 9; k++)if (strcmp (words,keywords[k]) == 0) //判断是否为关键字switch(k){case 0:{flag = 1;status = 1;break;}case 1:{flag = 2;status = 1;break;}case 2:{flag = 3;status = 1;break;}case 3:{flag = 4;status = 1;break;}case 4:{flag = 5;status = 1;break;}case 5:{flag = 6;status = 1;break;}case 6:{flag = 7;status = 1;break;}case 7:{flag = 8;status = 1;break;}case 8:{flag = 9;status = 1;break;}}if (status == 0){flag = 100; //标识符()}}else if ((ch >= '0') && (ch <= '9')||ch=='.') //数字(){dian=1;number = 0;number1=0;d=0;if(ch!='.'){while ((ch >= '0' ) && (ch <= '9' )){number = number*10+(ch-'0');ch = program[i++];}}//当ch=‘。
’时,就是小数.if(ch=='.'){dian=0;ch=program[i++];while((ch>='0')&&(ch<='9')){d++;number1=number1*10+(ch-'0');ch=program[i++];}}if(dian==1){flag = 200;}else{flag=201;}i--;}else switch (ch) //运算符和标点符号{case '=':{if (ch == '=')words[j++] = ch;words[j] = '\0';ch = program[i++];if (ch == '='){words[j++] = ch;words[j] = '\0';flag = 401;}else{i--;flag = 402;}break;}case'>':{if (ch == '>')words[j++] = ch;words[j] = '\0';ch = program[i++];if (ch == '='){words[j++] = ch;words[j] = '\0';flag = 403;}else{i--;flag = 404;}break;}case'<':{if (ch == '<') words[j++] = ch; words[j] = '\0';ch = program[i++]; if (ch == '='){words[j++] = ch; words[j] = '\0'; flag = 405;}else{i--;flag = 406;}break;}case'!':{if (ch == '!') words[j++] = ch; words[j] = '\0';ch = program[i++]; if (ch == '='){words[j++] = ch; words[j] = '\0'; flag = 407;}else{i--;flag = 408;}break;}case'+':{if (ch == '+') words[j++] = ch; words[j] = '\0';ch = program[i++]; if (ch == '='){words[j++] = ch; words[j] = '\0'; flag = 409;}else if (ch == '+') {words[j++] = ch; words[j] = '\0'; flag = 410;}else{i--;flag = 411;}break;}case'-':{if (ch == '-') words[j++] = ch; words[j] = '\0';ch = program[i++]; if (ch == '='){words[j++] = ch; words[j] = '\0'; flag = 412;}else if( ch == '-') {words[j++] = ch; words[j] = '\0'; flag = 413;}else{i--;flag = 414;}break;}case'*':{if (ch == '*') words[j++] = ch; words[j] = '\0';ch = program[i++]; if (ch == '='){words[j++] = ch; words[j] = '\0'; flag = 415;}else{i--;flag = 416;}break;}case'/':{if (ch == '/') words[j++] = ch; words[j] = '\0';ch = program[i++]; if (ch == '='){words[j++] = ch; words[j] = '\0'; flag = 417;}else{i--;flag = 418;}break;}case'^':{words[j] = ch; words[j+1] = '\0'; flag = 419;break;}case';':{words[j] = ch; words[j+1] = '\0'; flag = 501; break;}case'(':{words[j] = ch; words[j+1] = '\0'; flag = 502; break;}case')':{words[j] = ch; words[j+1] = '\0'; flag = 503; break;}case'[':{words[j] = ch; words[j+1] = '\0'; flag = 504; break;}case']':{words[j] = ch; words[j+1] = '\0'; flag = 505; break;}case'{':{words[j] = ch; words[j+1] = '\0'; flag = 506; break;}case'}':{words[j] = ch; words[j+1] = '\0'; flag = 507; break;}case':':{words[j] = ch; words[j+1] = '\0'; flag = 508; break;}case'"':{words[j] = ch; words[j+1] = '\0'; flag = 509; break;}case'%':{if (ch == '%') words[j++] = ch; words[j] = '\0';ch = program[i++]; if (ch == '='){words[j++] = ch; words[j] = '\0'; flag = 510;}else{i--;flag = 511;}break;}case',':{words[j] = ch; words[j+1] = '\0';break;}case'#':{words[j] = ch;words[j+1] = '\0';flag = 513;break;}case'@':{words[j] = ch;words[j+1] = '\0';flag = 514;break;}case' '://空格{words[j] ='_';words[j+1] = '\0';flag = 515;break;}case'$':{words[j] = '#';words[j+1] = '\0';flag = 0;break;}default:{flag = -1;break;}}return flag;}//------------------语法分析(递归下降)--------------------------- void E();void E1();void T1();void F();void E(){cout<<"S->TE' "<<endl;T();E1();}void E1(){if(flags[temp]==411){cout<<"S'->+E"<<endl;temp++;T();E1();}}void T(){cout<<"T->FT'"<<endl;F();T1();}void T1(){if(flags[temp]==416){cout<<"T'->*F"<<endl;temp++;F();T1();}}void F(){if(flags[temp]==100||flags[temp]==200||flags[temp]==201){cout<<"F->"<<cnt[temp]<<endl;temp++;}else if(flags[temp]==502){cout<<"F->("<<endl;temp++;E();if(flags[temp]==503){cout<<"F->)"<<endl;temp++;if(flags[temp]==0||flags[temp]==501){is_right=1;temp++;}}else is_right=0;}else is_right =0;}void main(){int i=0,num=0;cout<<"请输入测试程序或者表达式,以$结束"<<endl;do{ch =getchar();program[i++] = ch;}while(ch != '$');i = 0;cout<<"词法分析:"<<endl;do{flag = Scan(program);//词法分析if (flag == 200){cout<<"("<<flag<<","<<number<<")"<<endl;flags[num]=flag;stringstream stream;stream<<number;stream>>cnt[num];stream.clear();num++;}else if(flag==201){for(i=d;i>0;i--){number1=number1*0.1;}number1=number1+number;cout<<"("<<flag<<","<<number1<<")"<<endl; flags[num]=flag;stringstream stream;stream<<number;stream>>cnt[num];stream.clear();num++;}else if (flag == -1){cout<<"error!"<<endl;}else{cout<<"("<<flag<<","<<words<<")"<<endl;if(flag!=515){flags[num]=flag;cnt[num]=words;num++;}}}while (flag != 0);flags[num]=0;is_right=1;cout<<"语法分析:"<<endl;E();if(is_right){cout<<"分析成功"<<endl;}else{cout<<"分析失败"<<endl;}system("pause");}。