南航金城学院编译原理课程设计杨阳教的
标准实验报告(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. 构建预测分析表。
根据设计的文法,构建预测分析表。
根据文法的非终结符和终结符,填写预测分析表中的产生式。
编译原理课程教学大纲教案
编译原理课程教学大纲教案《编译原理》课程教案一、课程基本信息课程编号:10134045课程类别:专业课适用于专业:计算机科学与技术学分:理论教学学分3学分总学时:48学时其中理论学时:48学时;实验学时:0学时先修成课程:c语言程序设计、数据结构、汇编语言程序设计时程课程:课程简介:本课程就是计算机专业的一门很关键的专业课,主要了解编程理论基础知识,词法分析、自上而下语法分析、优先分析法、自下而上语法分后法、中间代码生成、代码优化和目标代码生成的基本理论和基础知识。
主要教学方法与手段:课堂多媒体课件结合黑板板书。
教材:1.薛联凤、秦振松,《编程原理及编译程序结构》(第二版),东南大学出版社,2021。
选修书目:1.吕映芝、张素琴等编著,《编译原理》,清华大学出版社,2021。
2.陈火旺等编著,《程序设计语言与编译原理(第3版)》,国防工业出版社,20213.张幸儿,《计算机编程理论》(第三版),科学出版社,2021。
二、课程总目标:本课程教学目标是使学生理解编译的基本理论知识和实现方法,了解自动机语言的形式化定义、编译技术的各种概念以及具体实现过程的方法。
从形式语言理论角度讨论词法分析和语法分析技术,为学生将来从事系统软件开发打下良好的基础。
三、课程教学内容与教学要求1、教学内容与学时分配课程总学时:64学时,其中讲授学时:48学时;实验(上机)学时:16学时第1页共8页教学内容与学时分配建议如下表中:学时分配序序教学章节名称教学章节名称号谈实号课验第六章lr分析法及分析1第一章讲义26程序自动结构第七章语法制导译者并2第二章编程基础知识47产生中间代码第八章运转时数据区的3第三章词法分析68管理4第四章自上而下语法分析69第九章中间代码优化1第十章目标代码生成5第五章优先分析法602、教学要求:合计学时分配讲实课验8824248第一章引论(2学时)教学目标:介绍编译程序与高级程序设计语言的关系;编程和表述的概念;编译程序的几个阶段所顺利完成的任务及撰写编译程序的主要方法;认知编程理论和课堂教学结合的重要性;掌控编程的各个阶段及其主要任务教学内容:第一节程序设计语言与编程一、程序设计语言二、编译的概念三、编译的过程第二节编译程序概述一、词法分析二、语法分析三、中间代码生成四、优化五、目标代码生成六、表格与表格管理七、失效处置八、不下第三节编译程序的构造第2页共8页一、编译程序的生成方法二、编译程序的设计方法教学要求:重点介绍编译的概念;编译的几个阶段及其所需完成的任务。
编译原理的课课程设计
编译原理的课课程设计一、教学目标本课程的教学目标是使学生掌握编译原理的基本概念、理论和方法,能够运用编译原理解决实际问题。
具体分为以下三个部分:1.知识目标:学生需要掌握编译原理的基本概念,包括编译器的基本结构、词法分析、语法分析、语义分析、中间代码生成、目标代码生成和优化等。
2.技能目标:学生需要具备使用编译原理解决实际问题的能力,包括能够使用编译器开发工具,进行词法分析、语法分析和语义分析等操作。
3.情感态度价值观目标:通过本课程的学习,使学生认识到编译原理在软件工程中的重要性,增强学生对计算机科学的热爱和责任感。
二、教学内容本课程的教学内容主要包括以下几个部分:1.编译器的基本结构:包括前端和后端的基本组成部分,以及它们之间的交互关系。
2.词法分析:包括词法规则的定义、词法分析器的实现和词法分析的过程。
3.语法分析:包括语法规则的定义、语法分析树的构建和语法分析的方法。
4.语义分析:包括语义规则的定义、语义分析的方法和语义分析的实现。
5.中间代码生成:包括中间代码的定义、中间代码生成的方法和中间代码优化的方法。
6.目标代码生成:包括目标代码的定义、目标代码生成的方法和目标代码优化的方法。
三、教学方法本课程采用多种教学方法,以激发学生的学习兴趣和主动性:1.讲授法:教师通过讲解编译原理的基本概念和理论,使学生掌握相关知识。
2.案例分析法:教师通过分析实际的编译器案例,使学生了解编译原理在实际中的应用。
3.实验法:学生通过动手实现编译器的基本功能,加深对编译原理的理解。
4.讨论法:学生通过分组讨论,共同解决问题,培养团队协作能力。
四、教学资源本课程的教学资源包括以下几个部分:1.教材:选用《编译原理》作为主要教材,为学生提供系统性的理论知识。
2.参考书:提供相关的参考书籍,为学生提供更多的学习资源。
3.多媒体资料:制作PPT、视频等多媒体资料,丰富课堂教学。
4.实验设备:提供计算机实验室,让学生能够实际操作编译器。
南航c语言课程设计
南航c语言 课程设计一、课程目标知识目标:1. 理解C语言的基本语法结构,掌握变量声明、数据类型、运算符和表达式等基本知识;2. 学会使用C语言进行顺序结构、选择结构和循环结构的编程;3. 了解C语言数组、函数和指针的基本概念及其应用;4. 掌握C语言中的文件操作,能够进行简单的文件读写。
技能目标:1. 能够运用C语言编写简单的程序,解决实际问题;2. 培养良好的编程习惯,掌握代码调试和错误处理方法;3. 学会分析问题,设计算法,并使用C语言实现;4. 提高逻辑思维能力和问题解决能力。
情感态度价值观目标:1. 培养对编程的兴趣和热情,树立正确的计算机科学观念;2. 培养团队协作精神,学会与他人分享和交流编程经验;3. 培养严谨、细致的学习态度,勇于面对编程挑战;4. 了解C语言在实际应用中的重要作用,激发学习更多编程语言的兴趣。
课程性质:本课程为南航C语言课程设计,旨在帮助学生掌握C语言的基本知识和编程技能,培养学生编程兴趣和逻辑思维能力。
学生特点:学生具备一定的计算机基础,对编程有一定了解,但C语言学习程度不一。
教学要求:结合学生特点,注重理论与实践相结合,通过案例分析和实际操作,使学生能够熟练掌握C语言的编程技能。
同时,关注学生的情感态度,激发学习兴趣,培养良好的编程习惯。
在教学过程中,将课程目标分解为具体的学习成果,以便于教学设计和评估。
二、教学内容1. C语言基础知识:变量声明、数据类型、常量、运算符和表达式;教材章节:第一章内容安排:2课时2. 控制结构:顺序结构、选择结构(if语句、switch语句)、循环结构(for循环、while循环、do-while循环);教材章节:第二章内容安排:4课时3. 数组:一维数组、二维数组、数组的使用;教材章节:第三章内容安排:2课时4. 函数:函数定义、调用、返回值、形参与实参、递归函数;教材章节:第四章内容安排:4课时5. 指针:指针的概念、指针与变量的关系、指针运算、指针数组、指向指针的指针;教材章节:第五章内容安排:4课时6. 文件操作:文件打开与关闭、文件读写、文件定位;教材章节:第六章内容安排:2课时7. 编程实践:结合所学知识,设计并实现一个小型项目;内容安排:4课时总计:20课时教学内容按照课程目标进行选择和组织,确保科学性和系统性。
编译原理简明教程第二版课程设计
编译原理简明教程第二版课程设计介绍编译原理是计算机科学中很重要的一门课程,它涉及到了计算机程序优化、语言翻译、程序分析等多个领域。
因此,对于计算机专业的学生来说,编译原理课程是非常重要的。
在本文中,我们将介绍编译原理简明教程第二版的课程设计内容。
设计内容课程要求在编译原理课程中,本次课程设计的要求是从头设计一个简单的编译器。
这个编译器需要能够识别一种类C语言的语法,并进行解析和生成目标代码。
同时,还需要实现优化功能,使生成的目标代码更加高效。
设计思路编译器的设计思路大致可以分为以下几个步骤:1.词法分析:将源代码转化为一个个token,每个token代表代码中的一个基本结构(如标识符、关键字、运算符等)。
2.语法分析:将token转化为语法树,并进行语法分析,判断其是否符合语法规范。
如果不符合,应该抛出错误信息。
3.语义分析:对语法树进行语义分析,识别出声明和定义、类型匹配、运算类型匹配等等错误信息。
4.代码生成:将语义分析后的语法树转化为目标代码,并对代码进行优化。
这一步通常需要生成中间代码,再将其转化为与机器指令集相匹配的代码。
实现细节在实现编译器时,我们需要注意以下几个细节:1.词法分析器和语法分析器的实现。
我们需要选择合适的算法,例如递归下降、自顶向下等算法。
2.语义分析器的实现。
在进行语义分析时,我们需要将所有的语法错误信息分类,然后逐个检查,并进行优化。
3.代码生成的实现。
我们需要将中间代码转化为和机器指令集相匹配的目标代码。
4.性能优化。
在编译器生成前端时,可以使用优化算法对源码进行优化,以减少后端的代码优化工作量。
算法选择在编译器中,算法的选择非常重要。
以下是一些常用的算法:•正则表达式和有穷自动机:用于词法分析。
•LL和LR语法分析器:用于语法分析。
•属性文法和类型检查机制:用于语义分析。
•虚拟机和栈式机器:用于代码生成。
以上算法中,正则表达式和有穷自动机常被用于实现词法分析器;LL语法分析器常用于递归下降算法,而LR语法分析器则常用于自底向上算法。
编译原理课程设计指导书
《编译原理》课程设计指导书一、 课程设计教学的目的与要求课程设计是对学生的一种全面综合训练,是与课堂听讲、自学和练习相辅相成的必不可少的一个教学环节。
通常,设计题中的问题比平时的练习题要复杂,也更接近实际。
编译原理这门课程安排的课程设计的目的是旨在要求学生进一步巩固课堂上所学的理论知识,深化理解和灵活掌握教学内容,选择合适的数据逻辑结构表示问题,然后编制算法和程序完成设计要求,从而进一步培养学生独立思考问题、分析问题、解决实际问题的动手能力。
要求学生在上机前应认真做好各种准备工作,熟悉机器的操作系统和语言的集成环境,独立完成文法及属性文法的设计、算法的制和程序代码的编写。
课程设计完成后由教师上机检查,通过上机检查后再撰写课程设计报告。
课程设计报告书正文的内容应包括:1系统描述(问题域描述);2文法及属性文法的描述;3语法分析方法及分析表设计;4给出中间代码形式的描述及中间代码序列的结构设计;5简要的分析与概要设计;6详细的算法描述(流程图或伪代码);7给出软件的测试方法和测试结果;8研制报告(研制过程,本设计的评价、特点、不足、收获与体会等);9参考文献(按公开发表的规范书写)。
开发工具:(1) DOS环境下使用Turbo C;(2) Windows环境下使用Visual C++ 。
(3) 其它熟悉的语言。
二、课程设计的内容:设计题一:算术表达式的翻译程序设计。
1.目的通过设计、编制、调试一个算术表达式的语法及语义分析程序,加深对语法及语义分析原理的理解,并实现词法分析程序对单词序列的词法检查和分析(如标识符、常数)。
2.设计内容及步骤对算术表达式:(1) 按给定的题目写出符合自身分析方法要求的文法和属性文法描述。
如文法:〈表达式〉∷= 单目算符〈表达式〉|〈项〉|〈表达式〉〈加法运算符〉〈项〉 〈项〉∷= 〈因子〉|〈项〉〈乘法运算符〉〈因子〉〈因子〉∷= 〈标志符〉|〈无符号整数〉|(〈表达式〉)〈无符号整数〉∷= 〈数字〉|〈无符号整数〉〈数字〉〈标志符〉∷= 〈字母〉|〈标志符〉〈字母〉|〈标志符〉〈数字〉〈加法运算符〉∷= +|-〈乘法运算符〉∷= *|/(2) 按给定的题目给出分析方法的思想及分析表设计。
大学编译原理作业设计教案
课程名称:编译原理授课对象:计算机科学与技术专业本科生授课学时:2学时教学目标:1. 使学生掌握编译原理的基本概念和基本方法。
2. 培养学生分析问题和解决问题的能力。
3. 提高学生编程和算法设计能力。
教学内容:1. 作业概述2. 作业要求3. 作业步骤4. 作业提交与评价教学过程:一、作业概述1. 向学生介绍本次作业的目的和意义。
2. 强调作业在课程学习中的重要性。
二、作业要求1. 作业内容:设计一个简单的编译器,实现词法分析、语法分析、语义分析和中间代码生成等功能。
2. 编译器输入:一个简单的源程序,如C语言程序。
3. 编译器输出:中间代码和错误信息。
三、作业步骤1. 分析源程序:对源程序进行词法分析,将源程序分解为一系列的词法单元。
2. 语法分析:根据词法单元,构建语法树,检查源程序的语法正确性。
3. 语义分析:对语法树进行语义分析,检查源程序的语义正确性。
4. 中间代码生成:根据语法树,生成中间代码。
5. 优化中间代码:对中间代码进行优化,提高程序运行效率。
6. 目标代码生成:将优化后的中间代码转换为特定目标机的目标代码。
7. 集成测试:对编译器进行集成测试,确保编译器能正确处理各种类型的源程序。
四、作业提交与评价1. 提交时间:作业截止日期前提交。
2. 提交方式:将编译器源代码和相关文档打包,发送至指定邮箱。
3. 评价标准:- 编译器功能:编译器能正确处理各种类型的源程序,包括正确性、完整性和健壮性。
- 编程质量:代码结构清晰、易读、易维护。
- 优化效果:中间代码优化效果明显,目标代码运行效率较高。
- 文档质量:文档完整、规范,能清晰地描述编译器的设计和实现。
教学总结:1. 总结本次作业的主要内容和要求。
2. 强调作业在课程学习中的重要性,鼓励学生在课后继续深入研究编译原理相关知识。
3. 提供一些参考资料和拓展练习,帮助学生提高编译原理的学习效果。
课后作业:1. 阅读相关资料,深入了解编译原理的基本概念和基本方法。
编译原理实验课程设计
编译原理实验课程设计一、教学目标本课程的教学目标是使学生掌握编译原理的基本概念、方法和技巧,培养学生对编译器设计和实现的基本技能,提高学生对程序设计语言和计算机体系结构的理解。
具体来说,知识目标包括:1.理解编译原理的基本概念,如源程序、目标程序、编译器等。
2.掌握编译过程中的各个阶段,包括词法分析、语法分析、语义分析、中间代码生成、目标代码生成和优化等。
3.了解编译器的数据结构和算法设计,如有限自动机、抽象语法树、中间代码表示等。
技能目标包括:1.能够使用编译器开发工具,如lex、yacc等,编写简单的编译器组件。
2.能够设计和实现简单的编译器,完成基本的词法分析、语法分析和语义分析功能。
3.能够对编译器进行性能优化,提高编译效率。
情感态度价值观目标包括:1.培养学生对编程语言和计算机科学的兴趣,提高学生对编译原理的学习热情。
2.培养学生的问题解决能力和创新思维,使学生能够独立思考和解决编译器设计和实现中的问题。
3.培养学生的团队合作意识和沟通能力,使学生能够在团队项目中有效合作,共同完成编译器的开发和优化。
二、教学内容本课程的教学内容主要包括编译原理的基本概念、编译过程的各个阶段、编译器的数据结构和算法设计。
具体来说,教学大纲的安排如下:1.第一章:编译原理概述,介绍编译器的基本概念和编译过程的阶段。
2.第二章:词法分析,讲解词法分析的基本方法和有限自动机的构建。
3.第三章:语法分析,介绍语法分析的基本方法和抽象语法树的处理。
4.第四章:语义分析,讲解语义分析的基本概念和方法。
5.第五章:中间代码生成,介绍中间代码的表示和生成方法。
6.第六章:目标代码生成和优化,讲解目标代码的生成和优化技巧。
教材选用《编译原理》(作者:Alfred V. Aho et al.),该教材是编译原理领域的经典著作,内容系统全面,理论与实践相结合。
三、教学方法本课程的教学方法将采用讲授法、讨论法、案例分析法和实验法相结合的方式。
编译原理》课程设计
编译原理》课程设计一、教学目标本课程旨在让学生了解编译原理的基本概念、方法和技巧,掌握源程序转换为目标程序的基本过程,包括词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成等。
通过本课程的学习,学生应能理解并应用编译原理的基本知识解决实际问题,培养分析问题和解决问题的能力。
具体的教学目标如下:1.知识目标:(1)了解编译原理的基本概念和任务。
(2)掌握源程序转换为目标程序的基本过程,包括词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成。
(3)熟悉各种编译器设计和实现技术。
2.技能目标:(1)能够使用编译原理的基本方法分析并解决实际问题。
(2)具备编写简单编译器的能力。
3.情感态度价值观目标:(1)培养学生对编译原理的兴趣,认识到编译原理在计算机科学中的重要性。
(2)培养学生团队合作、创新和持续学习的精神。
二、教学内容本课程的教学内容主要包括以下几个部分:1.编译原理的基本概念和任务。
2.源程序转换为目标程序的基本过程,包括词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成。
3.各种编译器设计和实现技术。
4.编译原理在实际应用中的案例分析。
5.编译原理相关的研究动态和发展趋势。
三、教学方法为了提高教学效果,本课程将采用多种教学方法,包括:1.讲授法:教师讲解编译原理的基本概念、方法和技巧,引导学生掌握知识要点。
2.讨论法:学生针对编译原理中的关键问题进行讨论,培养学生的思考和表达能力。
3.案例分析法:分析编译原理在实际应用中的案例,帮助学生更好地理解编译原理的应用价值。
4.实验法:安排学生进行编译器设计的实验,提高学生的实际操作能力和创新能力。
四、教学资源为了支持本课程的教学,我们将准备以下教学资源:1.教材:《编译原理》,为学生提供系统、全面的学习资料。
2.参考书:提供相关领域的经典著作和最新研究成果,供学生拓展阅读。
3.多媒体资料:制作课件、教学视频等,丰富教学手段,提高教学效果。
编译原理ll课程设计
编译原理ll课程设计一、课程目标知识目标:1. 让学生理解编译原理的基本概念,掌握编译过程的主要阶段及其功能。
2. 使学生掌握词法分析、语法分析、语义分析的基本方法,并能运用相关算法对简单程序进行解析。
3. 帮助学生了解目标代码生成和优化策略,提高程序执行效率。
技能目标:1. 培养学生运用形式语言和自动机理论对程序进行分析的能力。
2. 培养学生设计简单的编译程序,能够将高级语言转换为低级语言的能力。
3. 提高学生运用编译技术解决实际编程问题的能力。
情感态度价值观目标:1. 培养学生对编译原理的兴趣,激发学习热情,形成积极探究的学习态度。
2. 培养学生的团队协作精神,让学生在合作完成编译程序设计的过程中,学会沟通、共享和分工合作。
3. 培养学生严谨的学术态度,注重理论与实践相结合,提高学生的实际动手能力。
课程性质:本课程为计算机科学与技术专业核心课程,以理论教学为主,实践操作为辅。
学生特点:学生已具备一定的编程基础和离散数学知识,具有较强的逻辑思维能力和问题解决能力。
教学要求:结合学生特点,注重理论与实践相结合,通过案例分析和实际操作,使学生掌握编译原理的基本知识和技能。
同时,关注学生的情感态度价值观培养,提高学生的综合素质。
在教学过程中,将课程目标分解为具体的学习成果,便于教学设计和评估。
二、教学内容1. 编译原理概述:介绍编译原理的基本概念、编译过程及各阶段功能。
- 教材章节:第1章 编译原理概述- 内容:编译器的作用、编译过程、编译器结构。
2. 词法分析:讲解词法分析的基本任务、方法及相关算法。
- 教材章节:第2章 词法分析- 内容:词法规则、有限自动机、词法分析器设计。
3. 语法分析:介绍语法分析的基本概念、方法及语法分析器的构建。
- 教材章节:第3章 语法分析- 内容:上下文无关文法、语法分析树、自上而下和自下而上的语法分析方法。
4. 语义分析:讲解语义分析的任务、方法以及语义分析器的设计。
南航金城c语言课程设计
南航金城c语言课程设计一、教学目标本课程的教学目标是使学生掌握C语言的基本语法、数据结构、算法和编程思想,培养学生具备基本的程序设计能力。
具体分为以下三个部分:1.知识目标:学生需要掌握C语言的基本语法、数据类型、运算符、控制结构、函数、指针、数组、字符串等基本概念。
2.技能目标:学生需要能够运用C语言编写简单的程序,解决实际问题。
3.情感态度价值观目标:培养学生对计算机科学的兴趣,提高学生独立思考和解决问题的能力。
二、教学内容教学内容主要包括C语言的基本语法、数据结构、算法和编程思想。
具体安排如下:1.第一章:C语言基础知识,包括数据类型、变量、常量、运算符、输入输出等。
2.第二章:控制结构,包括条件语句、循环语句等。
3.第三章:函数,包括函数的定义、调用、参数传递、返回值等。
4.第四章:数组和字符串,包括一维数组、多维数组、字符串的基本操作等。
5.第五章:指针,包括指针的概念、指针的运算、指针与数组、指针与函数等。
6.第六章:高级编程技巧,包括结构体、共用体、位字段、动态内存分配等。
7.第七章:算法和数据结构,包括排序算法、查找算法、线性表、栈、队列等。
三、教学方法本课程采用多种教学方法,包括讲授法、案例分析法、实验法等。
1.讲授法:通过讲解C语言的基本概念、语法和编程技巧,使学生掌握C语言的基本知识。
2.案例分析法:通过分析实际编程案例,使学生理解编程思想,提高编程能力。
3.实验法:通过上机实验,使学生亲自编写程序,巩固所学知识,提高实际操作能力。
四、教学资源教学资源包括教材、实验设备等。
1.教材:选用《C程序设计语言》作为教材,辅助学生学习C语言的基本知识。
2.实验设备:为学生提供计算机实验室,方便学生进行上机实验,提高实际操作能力。
五、教学评估本课程的评估方式包括平时表现、作业和考试三个部分,以全面客观地评价学生的学习成果。
1.平时表现:通过课堂参与、提问、讨论等方式评估学生的学习态度和积极性。
- 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");}。