(二)DO-WHILE循环语句的翻译程序设计(简单优先法、输出四元式) 一、1.简单优先法的基本思想
根据优先关系的定义,将简单优先文法中各文法符号之间的这种关系用一个矩阵表示,称作简单优先矩阵。PDA读入一个单词后,比较栈顶符号和该单词的优先级,若栈顶符号优先级低于该单词,继续读入;若栈顶符号优先级高于或等于读入符号,则找句柄进行归约,找不到句柄就继续读入。直到最后栈内只剩下开始符号,输入串读到“#”为止。此时识别正确。可分点描述如下: (1)、对句型中相邻的文法符号规定优先关系,以寻找句型中的句柄; (2)、规定句柄内各相邻符号之间具有相同的优先级; (3)、规定句柄两端符号优先级要比位于句柄之外而又和句柄相邻的符号的优先级高,以先归约句柄; (4)、对于文法中所有符号,只要它们可能在某个句型中相邻,就要为它们规定相应的优先关系,若某两个符号永远不可能相邻,则它们之间就无关系.
2.简单优先矩阵
用于表示文法符号之间的简单优先关系的矩阵。
3.简单优先法的优缺点
优点:技术简单,当做简单优先矩阵是要求较短。 缺点:适用范围小,分析表尺寸太大。 二、源代码实现:
#include #include
char sTable[TABLE_LEN+1] = {\顺序索引 int ShipTable[TABLE_LEN][TABLE_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 VN[11]={'K','L','P','S','E','G','T','R','F','Q','\\0'};
char VT[15]={'i','=','<','>','+','-','*','/','(',')','d','w',';','#','\\0'}; char
p[18][6]={\\char stack[MAX]; char queue[MAX]; int sp,front;
intM[10][14]={ {-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,-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,-1,-1,-1,-1}, };
int f=0; int count=0;int c=0;char arr_i[MAX];char var[MAX]; //表格管理int td[MAX]; int t=0;
int opd=-1;int opr=-1;int id=0;int d=0; char arr[MAX][4];//存放待输出的四元式 //char keyword[2][7]={\bool IsCharInStr(char c,char s[]) { for(int i=0;s[i]!='\\0';i++) { if(s[i]==c) return true; } return false; }
int GetIndex(char s[],char c) { for(int i=0;s[i]!='\\0';i++) { if(c==s[i]) return i; } return -1; } //
string GetSubString(char s[],int from,int to) {
string st; for(int i=from;i /******************************************* 翻译赋值表达式 ********************************************/ void translatefuzhi(char *sInput) { //栈结构的初始化 char Stack[STR_LEN]={0}; int index = 0; int top = 1; Stack[0] = '#'; list else { temp[0] = sInput[now]; } int i=0; while(temp[i]!=0) { int left = GetIndex(sTable,Stack[index]); int right = GetIndex(sTable,temp[i]); switch(ShipTable[left][right]) { case -1://移入 Stack[top++] = temp[i]; index = top-1; i++; break; case 0://脱括号 if(Stack[index]=='(') { Stack[top++] = ')'; Stack[index] = 'E'; top = index+1; index--; } else//规约 { if(top!=2) { return; } rPolish.push_back('='); list fuzhi[d++]=*iter; } } m=d; string op1,op2;int flag,xiabiao=0; for(d=0;d int len(char str[]){ int i=0;