1、(二)DO-WHILE 循环语句的翻译程序设计(简单优先法、输出四元式)一、1.简单优先法的基本思想根据优先关系的定义,将简单优先文法中各文法符号之间的这种关系用一个矩阵表示,称作简单优先矩阵。PDA 读入一个单词后,比较栈顶符号和该单词的优先级,若栈顶符号优先级低于该单词,继续读入;若栈顶符号优先级高于或等于读入符号,则找句柄进行归约,找不到句柄就继续读入。直到最后栈内只剩下开始符号,输入串读到“”为止。此时识别正确。可分点描述如下:(1) 、对句型中相邻的文法符号规定优先关系,以寻找句型中的句柄;(2) 、规定句柄内各相邻符号之间具有相同的优先级;(3) 、规定句柄两端符号优先级要比位于句
2、柄之外而又和句柄相邻的符号的优先级高,以先归约句柄;(4) 、对于文法中所有符号,只要它们可能在某个句型中相邻,就要为它们规定相应的优先关系,若某两个符号永远不可能相邻,则它们之间就无关系.2.简单优先矩阵用于表示文法符号之间的简单优先关系的矩阵。3.简单优先法的优缺点优点:技术简单,当做简单优先矩阵是要求较短。缺点:适用范围小,分析表尺寸太大。二、源代码实现:#include#define MAX 35#include#include#includeusing namespace std;#define TABLE_LEN 8#define STR_LEN 256int zhlen;char
3、 sTableTABLE_LEN+1 = “+-*/()i#“;/顺序索引int ShipTableTABLE_LENTABLE_LEN = /优先表 1, 1,-1,-1,-1, 1,-1, 1, 1, 1,-1,-1,-1, 1,-1, 1, 1, 1, 1, 1,-1, 1,-1, 1, 1, 1, 1, 1,-1, 1,-1, 1,-1,-1,-1,-1,-1, 0,-1,-2, 1, 1, 1, 1,-2, 1,-2, 1, 1, 1, 1, 1,-2, 1,-2, 1,-1,-1,-1,-1,-1,-2,-1, 0;char X,a;char VN11=K,L,P,S,E,G,T,
4、R,F,Q,0;char VT15=i,=,+,-,*,/,(,),d,w,;,#,0;char p186=“dLwS0“,“SP0“,“;SP0“,“0“,“iQE0“,“TG0“,“+TG0“,“-TG0“,“0“,“FR0“,“*FR0“,“/FR0“,“0“,“(E)0“,“i0“,“=0“,“0“;char stackMAX;char queueMAX;int sp,front;intM1014= -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
5、-1,-1,-1,-1,-1,-1,-1,3,2,-1,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,5,-1,-1,-1,-1,-1,-1,-1,5,-1,-1,-1,-1,-1,-1,-1,-1,-1,6,7,-1,-1,-1,-1,-1,8,8,8,9,-1,-1,-1,-1,-1,-1,-1,9,-1,-1,-1,-1,-1,-1,-1,-1,-1,12,12,10,11,-1,-1,-1,12,12,12,14,-1,-1,-1,-1,-1,-1,-1,13,-1,-1,-1,-1,-1,-1,15,16,17,-1,-1,-1,-1,-1,-1,
6、-1,-1,-1,-1,;int f=0; int count=0;int c=0;char arr_iMAX;char varMAX; /表格管理int tdMAX; int t=0;int opd=-1;int opr=-1;int id=0;int d=0;char arrMAX4;/存放待输出的四元式/char keyword27=“do0“,“while0“;bool IsCharInStr(char c,char s)for(int i=0;si!=0;i+)if(si=c)return true;return false;int GetIndex(char s,char c)fo
7、r(int i=0;si!=0;i+)if(c=si)return i;return -1;/string GetSubString(char s,int from,int to)string st;for(int i=from;i rPolish;list Num;int begin=0;while(sInputbegin!=)if(IsCharInStr(sInputbegin,sTable)cout1)temp0 = i;temp1 = sInputnow;Num.push_back(GetSubString(sInput,before+1,now);elsetemp0 = sInput
8、now;int i=0;while(tempi!=0)int left = GetIndex(sTable,Stackindex);int right = GetIndex(sTable,tempi);switch(ShipTableleftright)case -1:/移入Stacktop+ = tempi;index = top-1;i+;break;case 0:/脱括号if(Stackindex=()Stacktop+ = );Stackindex = E;top = index+1;index-;else/规约if(top!=2)return;rPolish.push_back(=)
9、;list:iterator iter;list:iterator siter=Num.begin();string fuzhi256;int d=0,m;for(iter=rPolish.begin();iter!=rPolish.end();iter+)if(*iter=i)fuzhid+=*siter;siter+;elsefuzhid+=*iter;m=d;string op1,op2;int flag,xiabiao=0;for(d=0;d)arrd3=id-1;else arrd3=id+1;id+;d+;void syntax()/语法分析int n;count+;print()
10、;X=stacksp;a=queuefront;if(X=#if(XZ)if(X=a)sp-;front+;if(a!=i)if(a!=dsemantic();else if(a=;|a=w|a=#)opr=-2;semantic();cout“;if(len(pn)!=0)for(int i=len(pn)-1;i=0;i-)stack+sp=pni;cout0)coutcht“operator“endl;queuej+=ch;queuej=#;for(i=0;queuei!=#;i+)coutqueuei;coutendl;int main()int i=0,j=0;int len,len
11、gth;char temp;char S=K;sp=front=0;stack0=#;sp+;stack1=K;cout“ *“endl;cout“ * DO-WHILE循环语句 *“endl;cout“ * (简单优先法输出四元式) *“endl;cout“ *“endl;ifstream table;table.open(“dowhile.txt“);if(!table)cout“error!“;table.seekg(0,ios:end);length = table.tellg();table.seekg(0,ios:beg);while(length!=table.tellg()ta
12、ble.read(char*)vari=temp;i+;if(vari= )i-;if(vari=#)break;table.close();len=i;vari=0;cout“词法分析“endl;lexical();char fuzhi20;int flag1,fuzhilen;int s=0;for(i=0;ilen;i+)if(vari=;)flag1=i;fuzhilen=flag1-2;for(i=3;iflag1;i+)fuzhis+=vari;fuzhis=#;char shuru;char zh100;int kaishi=0;zh0=d;for(kaishi=1;kaishi
13、s+1;kaishi+)zhkaishi=fuzhikaishi-1;zhkaishi+=;zhkaishi+=W;for(i=flag1+8;ilen;i+)if(vari=)break;elsezhkaishi+=vari;zhkaishi+=#;zhlen=kaishi;cout“输出四元式“endl;cout“do“endl;translatefuzhi(fuzhi);cout“(“varflag1+9“,“varflag1+8“,“varflag1+10“,“T2“)“endl;cout“if T2=true goto T0“endl;return 0;三、测试结果:词法分析部分:输
14、出四元式:四、课程小结:这次编译原理课程设计的题目是用简单优先分析法进行 DO-WHILE 循环语句的语法分析,并输出四元式.设计的特点是利用定义每个终极符和非终极符之间优先关系,来进行符号的移进与规约,如果栈顶符号优先级低于该单词,继续读入;若栈顶符号优先级高于或等于读入符号,则找句柄进行归约,找不到句柄就继续读入。这样使得程序简化,只需定义一个栈用来存放移进的字符,然后用栈顶指针指向它后与待移进字符比较优先级即可,设计简单.此设计的严重不足是只能进行一个固定句子的词法与语法分析,因为在定义优先关系时已固定了 DO,和 WHILE 的每个字符之间的优先关系,且赋值表达式和条件式也已固定,所以只能进行本程序已约定好的语句.完成此次课程设计以后,觉得自己在编译原理的学习中存在很多的不足和需要提高的地方.通过对简单优先法翻译程序的编程也使自己在编写编译程序上有了感官的认识, 且能力也得到了一定的提高!