编译原理实验报告四

  • 格式:doc
  • 大小:223.00 KB
  • 文档页数:12

编译原理实验报告 题 目 表达式语法分析程序的构造 学 院 专 业 班 级 学 号 学生姓名 指导教师

西安思源学院教务处制 二〇一 年 实验四 表达式语法分析程序的构造 一、实验目的 1掌握C++语言编译的语法分析程序 2分别掌握LL(1)、算符优先、LR等语法分析方法的构造。

二、实验环境 Microsoft Visual C++ 6.0 三、实验内容 给定某一文法,试构造其简单优先矩阵(或LL(1)矩阵),并编制程序。 给出相应句子的语法分析过程,判其正确性。 例如:给定文法G: E→T E1 E1→+TE1/ε T→FT1 T1→*F/ε F→id/(E) (1)先构造其SELECT集合,判定其是否为LL(1)文法 (2)是则构造其分析表 (3)给出句子id+id*id$的语法分析过程

四、设计说明

LL(1): #include #include typedef int datatype; char a[N3]={'$','E'}; char c[N4]={'$','z','*','z','+','z'}; char *B[N1][N2]={ " ", "z ", "+ " , "*" , "(" , ")", "$ ", "E " , "xT", " " , " ", "xT", " ", " ", "x ", " ", "xT+", " ", " ", "", "", "T ", "yF", " ", " ", "yF ", " ", " ", "y ", " ", "", "yF*", " ", "" , "", "F ", "z", " ", " ", ")E(", " ", " ", }; void FXB() { int i,j; cout<<"分析表为: "TE'","E'->TE'/e","T->FT'","T'->*F/e","F->(E)/id"}; cout<<"文法为: "< for(s=0;s<5;s++) {cout<} void SELECT() { cout<<"SELECT集合为:"TE')=FIRST(TE')={(,id}"+TE')=FIRST(+TE')={+}"e)=FIRST(E)UFOLLOW(E')-{e}={$,)}"FT')={(,id}"*F)={*}"e)={+,),$}"(E))={(}"id)={id}"'Z') {printf("不是算符文法!\n"); exit(-1);} if(st[i][j]>='A'&&st[i][j]<='Z') { if(st[i][j+1]>='A'&&st[i][j+1]<='Z') {printf("不是算符文法!\n");exit(-1);} } } } for(i=0;i{for(j=0;st[i][j]!='\0';j++) {if((st[i][j]<'A'||st[i][j]>'Z')&&st[i][j]!='-'&&st[i][j]!='>'&&st[i][j]!='|') lable[k++]=st[i][j]; } } lable[k]='#';lable[k+1]='\0'; table(); printf("每个非终结符的FIRSTVT集为:\n"); //输出每个非终结符的FIRSTVT集 for(i=0;i{ printf("%c: ",st[i][0]); for(j=0;j{printf("%c ",first[i][j+1]);} printf("\n"); } printf("每个非终结符的LASTVT集为:\n"); //输出每个非终结符的LASTVT集 for(i=0;i{ printf("%c: ",st[i][0]); for(j=0;j{printf("%c ",last[i][j+1]);} printf("\n"); } printf("算符优先分析表如下:\n"); for(i=0;lable[i]!='\0';i++) printf("\t%c",lable[i]); printf("\n"); for(i=0;i{ printf("%c\t",lable[i]); for(j=0;j{printf("%c\t",data[i][j]);} printf("\n"); } printf("请输入文法输入符号串以#结束:"); scanf("%s",input); deal(); } int deal() { int i,j;int x,y; int z; //输入串的长度 k=1; s[k]='#'; //栈置初值 for(i=0;input[i]!='\0';i++); //计算输入串的长度 z=i--; i=0; while((a=input[i])!='\0') { if(zhongjie(s[k])) j=k; else j=k-1; x=xiabiao(s[j]); y=xiabiao(a); if(data[x][y]=='>') { out(1,k,s); printf("%c",a); out(i+1,z,input); printf("规约\n"); do { q=s[j]; if(zhongjie(s[j-1])) j=j-1; else j=j-2; x=xiabiao(s[j]); y=xiabiao(q); }while(data[x][y]!='<'); int m,n,N; for(m=j+1;m<=k;m++) { for(N=0;Nfor(n=1;string[N][n]!='\0';n++) {if(!zhongjie(s[m])&&!zhongjie(string[N][n])) {if(zhongjie(s[m+1])&&zhongjie(string[N][n+1]) &&s[m+1]==string[N][n+1]) {s[j+1]=string[N][0]; break;} } else if(zhongjie(s[m])) if(s[m]==string[N][n]) {s[j+1]=string[N][0]; break;} } } k=j+1; if(k==2&&a=='#') { out(1,k,s);printf("%c",a);out(i+1,z,input);printf("结束\n"); printf("输入串符合文法的定义!\n"); return 1; //输入串符合文法的定义 } } else if(data[x][y]=='<'||data[x][y]=='=') { //移进 out(1,k,s); printf("%c",a);out(i+1,z,input);printf("移进\n");