📄 zhongjiandaimashengcheng.cpp
字号:
#include<stdlib.h>
#include<fstream>
#include<iostream>
using namespace std;
#define MAX 100
int m=0,n=0,sum=0;
char JG='A';
char str[MAX];//用于存输入表达式
int token=0;//左括号的标志
/*扫描一遍从文件中读入表达式*/
void scan(FILE *fin)
{
char ch='a';
while(ch!=EOF)
{
ch=getc(fin);
while(ch==' '||ch=='\n'||ch=='\t') ch=getc(fin);//消除空格和换行符
str[m++]=ch;
if(ch=='=') {
if (token<1) token=1;
sum++;}
else if(ch=='+'||ch=='-') {
if (token<2) token=2;
sum++;}
else if(ch=='*'||ch=='/') {
if (token<1) token=3;
sum++;}
else if(ch=='(') {
n=m-1;
if (token<4) token=4;}
}
}
/*对表达是进行处理并输出部分四元式*/
void chuli()
{
for(int i=0;i<=m-1;i++)//处理乘除运算
{
if(str[i]=='*'||str[i]=='/')
{
cout<<"("<<str[i]<<" "<<str[i-1]<<" "<<str[i+1]<<" "<<JG<<")"<<endl;
str[i-1]=str[i]=str[i+1]=JG;
sum--;
JG=(char)(int)JG++;
}
}
for(int j=0;j<=m-1;j++)//处理加减运算
{
if(str[j]=='+'||str[j]=='-')
{
cout<<"("<<str[j]<<" "<<str[j-1]<<" "<<str[j+1]<<" "<<JG<<")"<<endl;
str[j-1]=str[j]=str[j+1]=JG;
sum--;
JG=(char)(int)JG++;}
}
for(int k=0;k<=m-1;k++)//处理赋值运算
{
if(str[k]=='=')
{
cout<<"("<<str[k]<<" "<<str[k+1]<<" "<<" "<<" "<<str[k-1]<<")"<<endl;
sum--;
JG=(char)(int)JG++;}
}
}
/*生成四元式并输出*/
void siyuanshi()
{
int i=0;
if(token==4)
{
cout<<"("<<str[n+2]<<" "<<str[n+1]<<" "<<str[n+3]<<" "<<JG<<")"<<endl;
str[n]=str[n+1]=str[n+2]=str[n+3]=str[n+4]=JG;
sum--;
JG=(char)(int)JG++;
}
chuli();
}
/***************主函数*******************/
void main(){
char in[MAX]; //用于接收输入输出文件名
FILE *fin; //用于指向输入输出文件的指针
cout<<"请输入源程序文件名(例如ceshi.txt):";
cin>>in;
cout<<endl;
if ((fin=fopen(in,"r"))==NULL) //判断输入文件名是否正确
{
cout<<endl<<"打开词法分析输入文件出错!"<<endl;
}
scan(fin);//
/*******输出从文件读入的表达式*********/
cout<<"从文件读入的表达式如下:"<<endl;
for(int i=0;i<=m-1;i++) {cout<<str[i];}
cout<<endl<<endl;
cout<<"四元式如下:"<<endl;
/********调用生成四元式的函数********/
siyuanshi();
/*********判断是否成功**********/
if(sum==0) cout<<"成功!"<<endl;
else cout<<"有错误!"<<endl;
//关闭文件
fclose(fin);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -