📄 ifelse.cpp
字号:
else if(p->type==2) return 7;
else
{
for(i=0;i<23;i++)
{
t=mark[i];
if(strcmp(s,t)==0)
break;
}
return i;
}
}
char* copy(Node* p,Node* top)//复制字符串
{
char *str;
Node* t;
t=p;
str=t->data;
t++;
while(t!=top+1)
{
strcat(str,t->data);
t++;
}
return str;
}
char *findG(char *str)
{
int i=0;
char *left;
while(strcmp(str,gene[i].right))
{
if(i==16)
{
cout<<"没有可用产生式"<<endl;
exit(0);
}
i++;
}
left=gene[i].left;
return left;
}
int grammar(Node* s)
{
//int length;
int i,j;//行列
//length=getLength(s);//链表长度
Node stack[100];//栈
Node* base=stack;
Node* top=stack;
Node* p,*q;
char *str;
initMatrix();
init_gene();
strcpy(top->data,"#");
top->type=-1;
top++;
if(s->type==1)
{
strcpy(top->data,"i");
//top->data="i";
top->type=s->type;
}
else if(s->type==2)
{
strcpy(top->data,"n");
//top->data="n";
top->type=s->type;
}
else
{
strcpy(top->data,s->data);
//top->data=s->data;
top->type=s->type;
}
s=s->next;
//top++;
while(strcmp(s->data,"#"))
{
i=location(top);
j=location(s);
while(Matrix[i][j]!='>')
{
top++;
if(s->type==1)
{
strcpy(top->data,"i");
//top->data="i";
top->type=s->type;
}
else if(s->type==2)
{
strcpy(top->data,"n");
//top->data="n";
top->type=s->type;
}
else
{
strcpy(top->data,s->data);
//top->data=s->data;
top->type=s->type;
}
s=s->next;
i=j;
//i=location(top);
j=location(s);
}
p=top;
q=p-1;
i=location(q);
j=location(p);
while(Matrix[i][j]!='<')
{
p--;
q=p-1;
i=location(q);
j=location(p);
}
str=copy(p,top);
top=p;
top->type=-1;
str=findG(str);
strcpy(top->data,str);
}
while(!strcmp(s->data,"#")&&top!=base+1)
{
p=top;
q=p-1;
i=location(q);
j=location(p);
while(Matrix[i][j]!='<')
{
p--;
q=p-1;
i=location(q);
j=location(p);
}
str=copy(p,top);
top=p;
top->type=-1;
str=findG(str);
strcpy(top->data,str);
}
if(top==base+1)
{
if(!strcmp(top->data,"S"))
{
cout<<"语法分析正确"<<endl;
return 1;
}
else
{
cout<<"语法分析错误"<<endl;
return 0;
}
}
else
{
cout<<"语法分析错误"<<endl;
return 0;
}
}
//--------------------------语法分析结束--------------------------------
//-------------------------------四元式输出---------------------------------------------------
int m=0;//记录行号
int t=0;//保存角标
void print_result(Node* s)//输出四元式
{
//int jmp=0;
//int i;
Node *E1,*E2,*E3;
Node *E1_r,*E2_r,*E3_r;
//string I,M;
s=s->next;
E1=s;//找到每个表达式的首尾
E1_r=findE(E1); //then
E2=E1_r->next;
E2_r=findE(E2);//else
E3=E2_r->next;
E3_r=findE_1(E3);//#
s=E1->next->next;
if(s->next==E1_r)
{
cout<<setiosflags(ios::left)<<setw(4)<<m<<"if ";
printE(E1,E1_r);
cout<<" goto 2"<<endl;
m++;
}
else
{
print_evalue(s,E1_r);
cout<<setiosflags(ios::left)<<setw(4)<<m<<E1->data<<E1->next->data
<<'T'<<--t<<" goto "<<m+2<<endl;
t++;
m++;
}
cout<<setiosflags(ios::left)<<setw(4)<<m<<"goto "<<m+count(E2,E2_r)+2<<endl;
m++;
s=E2->next->next;
if(s->next==E2_r)
{
cout<<setiosflags(ios::left)<<setw(4)<<m;
printE(E2,E2_r);
cout<<endl;
m++;
}
else
{
print_evalue(s,E2_r);
cout<<setiosflags(ios::left)<<setw(4)<<m<<E2->data<<'='<<'T'<<--t<<endl;
t++;
m++;
}
cout<<setiosflags(ios::left)<<setw(4)<<m<<"goto "<<m+count(E3,E3_r)+1<<endl;
m++;
s=E3->next->next;
if(s->next==E3_r)
{
cout<<setiosflags(ios::left)<<setw(4)<<m;
printE(E3,E3_r);
cout<<endl;
m++;
}
else
{
print_evalue(s,E3_r);
cout<<setiosflags(ios::left)<<setw(4)<<m<<E3->data<<'='<<'T'<<--t<<endl;
t++;
m++;
}
cout<<setiosflags(ios::left)<<setw(4)<<m<<endl;
}
Node* findE(Node* s)//找尾
{
while(s->type!=3) s=s->next;
return s;
}
Node* findE_1(Node* s)//找尾
{
while(strcmp(s->data,"#"))
s=s->next;
return s;
}
int count(Node* p,Node* q)//计算赋值表达式的翻译占用几行
{
int count=0;
while(p!=q)
{
if(p->type==411||p->type==44)
count++;
p=p->next;
}
return count;
}
void printE(Node* p,Node* q)//打印表达式
{
while(p!=q)
{
cout<<p->data;
p=p->next;
}
}
void print_evalue(Node* p,Node* q)//分析赋值表达式,输出四元式
{
//int jmp=0;
int i=0;//操作符顶
int n=0;//操作数顶 上面
char *optr[100],*opnd[100];
char l[10],r[10];//保存左右操作数
char op[10];//保存操作符
//int t=0;//保存T的脚标
char *T[10]={"T0","T1","T2","T3","T4","T5","T6","T7","T8","T9"};
optr[0]=";";
//p=copyE(s);
//p=p->next;
while(p!=q||strcmp(optr[i],";"))
{
if(wordtypeE(p)=='d') //运算数进栈
{
opnd[n]=p->data;
n++;
p=p->next;
}
else
{
if(p==q)
{
switch(Precede(optr[i][0],';'))
{
case'<'://栈顶元素优先权低
i++;
optr[i]=p->data;
p=p->next;
break;
case'='://脱括号并接收下一字符
i--;
p=p->next;
break;
case'>'://退栈并输出
n--;
strcpy(r,opnd[n]);
n--;
strcpy(l,opnd[n]);
strcpy(opnd[n],T[t]);
n++;//指向最顶
strcpy(op,optr[i]);//op=optr[i];
i--;
cout<<setiosflags(ios::left)<<setw(4)<<m<<'T'<<t<<'='<<l<<op<<r<<endl;
m++;
t++;
//jmp++;
break;
}
}
else
{
switch(Precede(optr[i][0],p->data[0]))
{
case'<'://栈顶元素优先权低
i++;
optr[i]=p->data;
p=p->next;
break;
case'='://脱括号并接收下一字符
i--;
p=p->next;
break;
case'>'://退栈并输出
n--;
strcpy(r,opnd[n]);
n--;
strcpy(l,opnd[n]);
strcpy(opnd[n],T[t]);
n++;//指向最顶
strcpy(op,optr[i]);//op=optr[i];
i--;
cout<<setiosflags(ios::left)<<setw(4)<<m<<'T'<<t<<'='<<l<<op<<r<<endl;
m++;
t++;
//jmp++;
break;
}
}
}
}
}
char wordtypeE(Node* s) //判断字符的类型
{
switch(s->type)
{
case 1:
case 2:return 'd';//改n
case 411:return s->data[0];
case 412:
if(!strcmp(s->data,"++")) return 'a';
if(!strcmp(s->data,"--")) return 'b';
case 44:return s->data[0];
case 51:return s->data[0];
case 53:return s->data[0];
}
return '$';
}
char Precede (char op1,char op2)//比较算符优先级
{
switch(op1)
{
case '+':
switch(op2)
{
case '+':
case '-':
case ')':
case ';': return '>';
default: return '<';
}
case '-':
switch(op2)
{
case '+':
case '-':
case ')':
case ';': return '>';
default: return '<';
}
case '*':
switch(op2)
{
case '+':
case '-':
case ')':
case '*':
case '/':
case ';': return '>';
default: return '<';
}
case '/':
switch(op2)
{
case '+':
case '-':
case ')':
case '*':
case '/':
case ';': return '>';
default: return '<';
}
case '(':
switch(op2)
{
case '+':
case '-':
case '*':
case '/':
case '(': return '<';
case ')': return '=';
default: return '0';
}
case ')':
switch(op2)
{
case '+':
case '-':
case '*':
case '/':
case ')':
case ';': return '>';
case '(': return '0';
default: return '0';
}
case ';':
switch(op2)
{
case '+':
case '-':
case '*':
case '/':
case '(': return '<';
case ')': return '0';
default: return '=';
}
}
return '0';
}
//----------------------------------程序结束-----------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -