logo资料库

编译原理之算符优先算法-迭代法.doc

第1页 / 共4页
第2页 / 共4页
第3页 / 共4页
第4页 / 共4页
资料共4页,全文预览结束
编译原理之求算符优先函数的方法—迭代法 若已知运算符之间的优先关系,可按如下步骤构造优先函数: 1、对每个运算符 a(包括#在内)令 f(a)=g(a)=1 2、如果 a⋗ b 且 f(a)<=g(b)令 f(a)=g(b)+1 3、如果 a⋖ b 且 f(a)>=g(b)令 g(b)= f(a)+1 4、如果 a≐ b 而 f(a) ≠g(b),令 min{f(a),g(b)}=max{f(a),g(b)} 5、重复 2~4,直到过程收敛。如果重复过程中有一个值大于 2n,则 表明不存在算符优先函数。
程序实现代码为: #include #include #define MaxSize 100 #define MaxOp 9 struct { char ch; int pri; //运算符 //优先级 } lpri[]={{'+',1},{'-',1},{'*',1},{'/',1},{'(',1},{')',1},{'#',1}}, rpri[]={{'+',1},{'-',1},{'*',1},{'/',1},{'(',1},{')',1},{'#',1}}; int f(char op) { //求左运算符 op 的优先级 int i; for (i=0;i
}*/ char Precede(char c1,char c2) { int i=0,j=0; static char array[49]={ '>', '>', '<', '<', '<', '>', '>', '>', '>', '<', '<', '<', '>', '>', '>', '>', '>', '>', '<', '>', '>', '>', '>', '>', '>', '<', '>', '>', '<', '<', '<', '<', '<', '=', '!', '>', '>', '>', '>', '!', '>', '>', '<', '<', '<', '<', '<', '!', '='}; switch(c1) /* i 为下面 array 的横标 */ { case '+' : i=0;break; case '-' : i=1;break; case '*' : i=2;break; case '/' : i=3;break; case '(' : i=4;break; case ')' : i=5;break; case '#' : i=6;break; } switch(c2) /* j 为下面 array 的纵标 */ { case '+' : j=0;break; case '-' : j=1;break; case '*' : j=2;break; case '/' : j=3;break; case '(' : j=4;break; case ')' : j=5;break; case '#' : j=6;break; } return (array[7*i+j]); /* 返回运算符 */ } void main()
{ int i,j,k=1; while(k!=0) { k=0; for(i=0;i<7;i++) { for(j=0;j<7;j++) { lpri[i].pri=rpri[j].pri+1;k=1;} if(Precede(lpri[i].ch,rpri[j].ch)=='>'&&f(lpri[i].ch)<=g(rpri[j].ch)) { else if(Precede(lpri[i].ch,rpri[j].ch)=='<'&&f(lpri[i].ch)>=g(rpri[j].ch)) { rpri[j].pri=lpri[i].pri+1;k=1;} } } } printf(" for(i=0;i<7;i++) "); printf("%3c",lpri[i].ch); printf("\n"); printf("入栈优先函数 f:"); for(i=0;i<7;i++) printf("%3d",lpri[i].pri); printf("\n"); printf("比较优先函数 g:"); for(i=0;i<7;i++) printf("%3d",rpri[i].pri); printf("\n"); } 运行结果:
分享到:
收藏