编译原理 语法分析 联系客服

发布时间 : 星期日 文章编译原理 语法分析更新完毕开始阅读

福州大学 数学与计算机科学(软件)学院 03928 bH; f(i>i)i=i+iei=ni@ 根据B->bH;规约 02 B f(i>i)i=i+iei=ni@ 移入 027 Bf (i>i)i=i+iei=ni@ 移入 02713 Bf( i>i)i=i+iei=ni@ 移入

0271320 Bf(i >i)i=i+iei=ni@ 根据F->i规约 0271319 Bf(F >i)i=i+iei=ni@ 根据T->F规约 0271318 Bf(T >i)i=i+iei=ni@ 根据E->T规约 0271334 Bf(E >i)i=i+iei=ni@ 移入 027133435 Bf(E> i)i=i+iei=ni@ 移入

02713343520 Bf(E>i )i=i+iei=ni@ 根据F->i规约 02713343519 Bf(E>F )i=i+iei=ni@ 根据T->F规约 02713343518 Bf(E>T )i=i+iei=ni@ 根据E->T规约 02713343536 Bf(E>E )i=i+iei=ni@ 根据K->E>E规约 0271330 Bf(K )i=i+iei=ni@ 移入 027133043 Bf(K) i=i+iei=ni@ 移入 0271330435 Bf(K)i =i+iei=ni@ 移入 027133043511 Bf(K)i= i+iei=ni@ 移入

02713304351120 Bf(K)i=i +iei=ni@ 根据F->i规约 02713304351119 Bf(K)i=F +iei=ni@ 根据T->F规约 02713304351118 Bf(K)i=T +iei=ni@ 根据E->T规约 02713304351117 Bf(K)i=E +iei=ni@ 移入 0271330435111737 Bf(K)i=E+ iei=ni@ 移入

027133043511173720 Bf(K)i=E+i ei=ni@ 根据F->i规约 027133043511173719 Bf(K)i=E+F ei=ni@ 根据T->F规约 027133043511173738 Bf(K)i=E+T ei=ni@ 根据E->E+T规约 02713304351117 Bf(K)i=E ei=ni@ 根据D->i=E规约 02713304331 Bf(K)D ei=ni@ 移入 0271330433132 Bf(K)De i=ni@ 移入 02713304331325 Bf(K)Dei =ni@ 移入 0271330433132511 Bf(K)Dei= ni@ 移入 027133043313251121 Bf(K)Dei=n i@

5b ERROR

心得体会:

通过实验,明白了LL(1),LR(1),SLR(1),LALR这几个文法的区别,同时由于自己编程的能力,对分析表的构造采用了人工手法,但是从中掌握了分析表构造的原理,经过自己亲手实践,对分析表有了更深的了解。LR(1)语法分析移进和规约如何对程序进行分析。实验过程中也碰到很多麻烦,比如分析表的构造由于文法多,状态多,容易出错,赋值分析表过程中,也需要人力。程序还不够完善,删减了一些文法,使测试数据不是很完整。出错处理不到位,只能做到检测错误,无法跳过错误,重新下一行的分析。不管怎样,最后我们还是完成了实验,还是挺满足的,付出劳动,总有收获的。

9

福州大学 数学与计算机科学(软件)学院

实验代码:

#include #include #include #include #include

using namespace std;

char Keywords[55][10] = {\\\\\\\\

\ \ \ \

\\

int f[45][30];// 分析表 赋值(s9=900,r1=1;acc=20) char

wf[20][15]={\D->f(K)DeD\n\文法单元;

char tempchr[10],p,in_put[100],table[100][10];//存放识别字符串; int t,j,val,b,flag;

char flag1,put[100],*arr;

int begin=0,forward=0,pos;// 开始符号和向前看指针;

int main() { f[0][8]=300;f[0][17]=4;//分析表 f[1][17]=20;

f[2][1]=500;f[2][3]=600;f[2][4]=700;f[2][6]=800; f[3][1]=1000; f[4][17]=2; f[5][14]=1100; f[6][15]=1200; f[7][15]=1300; f[8][15]=1400;

f[9][9]=1500;f[9][10]=2800; f[10][9]=5;f[10][10]=5;

f[11][1]=2000;f[11][2]=2100;f[11][15]=2200; f[12][1]=2300;

f[13][1]=2000;f[13][2]=2100;f[13][15]=2200; f[14][1]=2000;f[14][2]=2100;f[14][15]=2200; f[15][1]=1600;

10

福州大学 数学与计算机科学(软件)学院

f[16][9]=6;f[16][10]=6; f[17][12]=3700;f[17][17]=7;

f[18][11]=3900;f[18][12]=12;f[18][13]=12;f[18][16]=12;f[18][17]=12; f[19][11]=15;f[19][12]=15;f[19][13]=15;f[19][16]=15;f[19][17]=15; f[20][11]=16;f[20][12]=16;f[20][13]=16;f[20][16]=16;f[20][17]=16; f[21][11]=17;f[21][12]=17;f[21][13]=17;f[21][16]=17;f[21][17]=17; f[22][1]=2000;f[22][2]=2100; f[23][16]=2400; f[24][17]=8; f[25][16]=2600; f[26][7]=2700;

f[27][1]=500;f[27][3]=600;f[27][4]=700;f[27][6]=800;

f[28][17]=3;f[28][1]=3;f[28][3]=3;f[28][4]=3;f[28][6]=3;f[28][8]=3; f[29][1]=500;f[29][3]=600;f[29][4]=700;f[29][6]=800;f[29][17]=10; f[30][16]=4300; f[31][5]=3200;

f[32][1]=500;f[32][3]=600;f[32][4]=700;f[32][6]=800; f[33][17]=9; f[34][13]=3500;

f[35][1]=2000;f[35][2]=2100;f[35][15]=2200; f[36][12]=3700;f[36][16]=11;

f[37][1]=2000;f[37][2]=2100;f[37][15]=2200;

f[38][11]=3900;f[38][12]=13;f[38][13]=13;f[38][16]=13;f[38][17]=13; f[39][1]=2000;f[39][2]=2100;f[39][15]=2200; f[40][12]=3700;f[40][16]=4100;

f[41][11]=18;f[41][12]=18;f[41][13]=18;f[41][16]=18;f[41][17]=18; f[42][11]=14;f[42][12]=14;f[42][13]=14;f[42][16]=14;f[42][17]=14; f[43][1]=500;f[43][3]=600;f[43][6]=800;f[43][20]=3100; f[0][18]=100;f[0][19]=200; f[2][20]=400; f[3][21]=900;

f[11][23]=1700;f[11][24]=1800;f[11][25]=1900;

f[13][22]=3000;f[13][23]=3400;f[13][24]=1800;f[13][25]=1900; f[14][22]=2500;f[14][23]=3400;f[14][24]=1800;f[14][25]=1900; f[22][23]=4000;f[22][24]=1800;f[22][25]=1900; f[27][20]=2900; f[32][20]=3300;

f[35][23]=3600;f[35][24]=1800;f[35][25]=1900; f[37][24]=3800;f[37][25]=1900; f[39][25]=4200;

f[17][5]=7;f[18][5]=12;f[19][5]=15;f[20][5]=16;f[21][5]=17;f[24][5]=8; f[29][5]=10;f[33][5]=9;f[38][5]=13;f[41][5]=18;f[42][5]=14;

11

福州大学 数学与计算机科学(软件)学院

list list1;//链表定义 list list2; list::iterator it1; list::iterator it2; void print(int flag); int change(char flag1 ); int size,i=0; char ch; FILE *fp=fopen(\ if (fp==NULL){ return 0;} fseek(fp,0,2); size=ftell(fp); arr=new char[size]; if ((fp=fopen(\ while (!feof(fp)) { ch=fgetc(fp); arr[i++]=ch; } fclose(fp); size=i-1; int state;//状态; i=0; while(i<=size) { for(t=0;t<8;t++) tempchr[t]=0; if(begin==forward) { ch=arr[forward]; if(ch>='a'&&ch<='z'||ch>='A'&&ch<='Z') state=9; else if(ch>='0'&&ch<='9')state=12; else if(ch=='+'||ch=='-'||ch=='*'||ch=='/')state=25; else if(ch=='<'||ch=='>'||ch=='=')state=0; else if(ch==','||ch==';'||ch=='('||ch==')')state=30; else if (ch=='\\n'||ch=='\\t'||ch==' ') state=22; else state=31; }

12