(二)DO-WHILE 循环语句的翻译程序设计(简单优先法、输出四元式)
一、1.简单优先法的基本思想
根据优先关系的定义,将简单优先文法中各文法符号之间的这种关系用一个矩阵表示,
称作简单优先矩阵。PDA 读入一个单词后,比较栈顶符号和该单词的优先级,若栈顶符号优
先级低于该单词,继续读入;若栈顶符号优先级高于或等于读入符号,则找句柄进行归约,
找不到句柄就继续读入。直到最后栈内只剩下开始符号,输入串读到“#”为止。此时识别
正确。可分点描述如下:
(1)、对句型中相邻的文法符号规定优先关系,以寻找句型中的句柄;
(2)、规定句柄内各相邻符号之间具有相同的优先级;
(3)、规定句柄两端符号优先级要比位于句柄之外而又和句柄相邻的符号的优先级高,以先
归约句柄;
(4)、对于文法中所有符号,只要它们可能在某个句型中相邻,就要为它们规定相应的优先
关系,若某两个符号永远不可能相邻,则它们之间就无关系.
2.简单优先矩阵
用于表示文法符号之间的简单优先关系的矩阵。
3.简单优先法的优缺点
优点:技术简单,当做简单优先矩阵是要求较短。
缺点:适用范围小,分析表尺寸太大。
二、源代码实现:
#include
#define MAX 35
#include
#include
#include
using namespace std;
#define
TABLE_LEN
#define
STR_LEN
int zhlen;
char sTable[TABLE_LEN+1] = {"+-*/()i#"};//顺序索引
int ShipTable[TABLE_LEN][TABLE_LEN] = //优先表
{
8
256
{ 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]={"dLwS\0","SP\0",";SP\0","\0","iQE\0","TG\0","+TG\0","-TG\0","\0","FR
\0",
"*FR\0","/FR\0","\0","(E)\0","i\0","=\0","<\0",">\0"};
char stack[MAX];
char queue[MAX];
int sp,front;
int
M[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]={"do\0","while\0"};
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 rPolish;
list Num;
int begin=0;
while(sInput[begin]!='=')
{
if(IsCharInStr(sInput[begin],sTable))
{
cout<<"Equal expression is illegal!"<1)
{
temp[0] = 'i';
temp[1] = sInput[now];
Num.push_back(GetSubString(sInput,before+1,now));
}
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::iterator iter;
list::iterator siter=Num.begin();
string fuzhi[256];int d=0,m;
for(iter=rPolish.begin();iter!=rPolish.end();iter++)
{
if(*iter=='i')
{
fuzhi[d++]=*siter;
siter++;
}
else
{
fuzhi[d++]=*iter;
}
}
m=d;
string op1,op2;int flag,xiabiao=0;
for(d=0;d
now++;
}
}
int len(char str[]){
int i=0;
while(str[i]!='\0')i++;
return i;
}
int index(char ch,char str[]){
int i=0;
while(str[i]!='\0'){
if(ch!=str[i])i++;
else break;}
if(str[i]=='\0')return -1;
return i;
}
void err(int n){
if(n==1)cout<<"字符不匹配"<')arr[d][3]=id-1;else arr[d][3]=id+1;id++;}
d++;
}
void syntax(){//语法分析
int n;
count++;
print();
X=stack[sp];
a=queue[front];
if(X=='#'&&a=='#')f=4;
if(X<'A'||X>'Z'){
if(X==a){
sp--;
front++;
if(a!='i'){
if(a!='d'&&a!='w'&&a!=';'&&a!='#'){opr=index(a,VT);semantic();}
else if(a==';'||a=='w'||a=='#'){opr=-2;semantic();}
cout<<'\t'<<'\''<
";
if(len(p[n])!=0){
for(int
i=len(p[n])-1;i>=0;i--){stack[++sp]=p[n][i];cout<void lexical(){
//词法分析
int i,j,d;
char ch;
j=d=0;
for(i=0;var[i]!='#';i++){
ch=var[i];
if(ch=='d'&&var[i+1]=='o'){cout<<"do"<<'\t'<<"keword"<0){cout<