📄 编译原理.cpp
字号:
#include<iostream.h>
#include<stdio.h>
#include<string.h>
#include<fstream.h>
#include<stdlib.h>
#include<math.h>
fstream infile,outfile;
static int tt=0;
static int bb=0;
static int total=0;
static int total1=0;
void jnumble(char a[])
{
int i,j,k=0;
i=strlen(a);
for(j=0;j<i;j++)
k=k+(a[j]-48)*pow(10,i-1-j);
outfile<<"(2,"<<k<<")"<<k<<" ";
cout<<"(2,"<<k<<")"<<k<<" ";
tt++;
if(tt%4==0)
{
outfile<<endl;
cout<<endl;
}
}
void jsaved(char a[],char c[][10])
{
char b[13][10]={"program","var","procedure","begin","end","if","then","else","while","do","call","integer","real"};
if(strcmp(a,b[0])==0)
{
outfile<<"(3,0)program ";
cout<<"(3,0)program ";
tt++;
if(tt%4==0)
{
outfile<<endl;
cout<<endl;
}
}
else if(strcmp(a,b[1])==0)
{
outfile<<"(4,0)var ";
cout<<"(4,0)var ";
tt++;
if(tt%4==0)
{
outfile<<endl;
cout<<endl;
}
}
else if(strcmp(a,b[2])==0)
{
outfile<<"(5,0)procedure ";
cout<<"(5,0)procedure ";
tt++;
if(tt%4==0)
{
outfile<<endl;
cout<<endl;
}
}
else if(strcmp(a,b[3])==0)
{
outfile<<"(6,0)begin ";
cout<<"(6,0)begin ";
tt++;
if(tt%4==0)
{
outfile<<endl;
cout<<endl;
}
}
else if(strcmp(a,b[4])==0)
{
outfile<<"(7,0)end ";
cout<<"(7,0)end ";
tt++;
if(tt%4==0)
{
cout<<endl;
outfile<<endl;
}
}
else if(strcmp(a,b[5])==0)
{
outfile<<"(8,0)if ";
cout<<"(8,0)if ";
tt++;
if(tt%4==0)
{
outfile<<endl;
cout<<endl;
}
}
else if(strcmp(a,b[6])==0)
{
outfile<<"(9,0)then ";
cout<<"(9,0)then ";
tt++;
if(tt%4==0)
{
outfile<<endl;
cout<<endl;
}
}
else if(strcmp(a,b[7])==0)
{
outfile<<"(10,0)else ";
cout<<"(10,0)else ";
tt++;
if(tt%4==0)
{
outfile<<endl;
cout<<endl;
}
}
else if(strcmp(a,b[8])==0)
{
outfile<<"(11,0)while ";
cout<<"(11,0)while ";
tt++;
if(tt%4==0)
{
outfile<<endl;
cout<<endl;
}
}
else if(strcmp(a,b[9])==0)
{
outfile<<"(12,0)do ";
cout<<"(12,0)do ";
tt++;
if(tt%4==0)
{
outfile<<endl;
cout<<endl;
}
}
else if(strcmp(a,b[10])==0)
{
outfile<<"(13,0)call ";
cout<<"(13,0)call ";
tt++;
if(tt%4==0)
{
outfile<<endl;
cout<<endl;
}
}
else if(strcmp(a,b[11])==0)
{
outfile<<"(14,0)integer ";
cout<<"(14,0)integer ";
tt++;
if(tt%4==0)
{
outfile<<endl;
cout<<endl;
}
}
else if(strcmp(a,b[12])==0)
{
outfile<<"(15,0)real ";
cout<<"(15,0)real ";
tt++;
if(tt%4==0)
{
outfile<<endl;
cout<<endl;
}
}
else
{
if(strlen(a)>=8)
{
outfile<<"Float ";
cout<<"Float ";
}
else
{
for(int j=0;j<total;j++)
{
if(strcmp(a,c[j])==0)
{
outfile<<"(1,"<<j+1<<")"<<c[j]<<" ";
cout<<"(1,"<<j+1<<")"<<c[j]<<" ";
tt++;
break;
}
}
if(j==total)
{
strcpy(c[total],a);
total++;
outfile<<"(1,"<<total<<")"<<a<<" ";
cout<<"(1,"<<total<<")"<<a<<" ";
tt++;
}
if(tt%4==0)
{
outfile<<endl;
cout<<endl;
}
}
}
}
void jsingle2(char a[])
{
char b[4];
strcpy(b,a);
if(strcmp(b,":=")==0)
{
outfile<<"(29,0):= ";
cout<<"(29,0):= ";
tt++;
if(tt%4==0)
{
outfile<<endl;
cout<<endl;
}
}
else if(strcmp(b,"<=")==0)
{
outfile<<"(24,0)<= ";
cout<<"(24,0)<= ";
tt++;
if(tt%4==0)
{
outfile<<endl;
cout<<endl;
}
}
else if(strcmp(b,">=")==0)
{
outfile<<"(26,0)>= ";
cout<<"(26,0)>= ";
tt++;
if(tt%4==0)
{
outfile<<endl;
cout<<endl;
}
}
else if(strcmp(b,"<>")==0)
{
outfile<<"(28,0)<> ";
cout<<"(28,0)<> ";
tt++;
if(tt%4==0)
{
outfile<<endl;
cout<<endl;
}
}
else if((strcmp(b,"/*")==0))
{
total1++;
}
else if((strcmp(b,"*/")==0))
total1--;
}
void jsingle1(char a[])
{
char b;
b=a[0];
if(b=='+')
{
outfile<<"(16,0)+ ";
cout<<"(16,0)+ ";
tt++;
if(tt%4==0)
{
outfile<<endl;
cout<<endl;
}
}
else if(b=='-')
{
outfile<<"(17,0)- ";
cout<<"(17,0)- ";
tt++;
if(tt%4==0)
{
outfile<<endl;
cout<<endl;
}
}
else if(b=='*')
{
outfile<<"(18,0)* ";
cout<<"(18,0)* ";
tt++;
if(tt%4==0)
{
outfile<<endl;
cout<<endl;
}
}
else if(b=='/')
{
outfile<<"(19,0)/ ";
cout<<"(19,0)/ ";
tt++;
if(tt%4==0)
{
outfile<<endl;
cout<<endl;
}
}
else if(b=='~')
{
outfile<<"(20,0)~ ";
cout<<"(20,0)~ ";
tt++;
if(tt%4==0)
{
outfile<<endl;
cout<<endl;
}
}
else if(b==94)
{
outfile<<"(21,0)^ ";
cout<<"(21,0)^ ";
tt++;
if(tt%4==0)
{
outfile<<endl;
cout<<endl;
}
}
else if(b=='<')
{
outfile<<"(23,0)< ";
cout<<"(23,0)< ";
tt++;
if(tt%4==0)
{
outfile<<endl;
cout<<endl;
}
}
else if(b=='>')
{
outfile<<"(25,0)> ";
cout<<"(25,0)> ";
tt++;
if(tt%4==0)
{
outfile<<endl;
cout<<endl;
}
}
else if(b=='(')
{
outfile<<"(33,0)( ";
cout<<"(33,0)( ";
tt++;
if(tt%4==0)
{
outfile<<endl;
cout<<endl;
}
}
else if(b==')')
{
outfile<<"(34,0)) ";
cout<<"(34,0)) ";
tt++;
if(tt%4==0)
{
outfile<<endl;
cout<<endl;
}
}
else if(b=='=')
{
outfile<<"(27,0)= ";
cout<<"(27,0)= ";
tt++;
if(tt%4==0)
{
outfile<<endl;
cout<<endl;
}
}
else if(b==';')
{
outfile<<"(30,0); ";
cout<<"(30,0); ";
tt++;
if(tt%4==0)
{
outfile<<endl;
cout<<endl;
}
}
else if(b=='.')
{
outfile<<"(31,0). ";
cout<<"(31,0). ";
tt++;
if(tt%4==0)
{
outfile<<endl;
cout<<endl;
}
}
else if(b==',')
{
outfile<<"(32,0), ";
cout<<"(32,0), ";
tt++;
if(tt%4==0)
{
outfile<<endl;
cout<<endl;
}
}
else if(b==':')
{
outfile<<"(35,0): ";
cout<<"(35,0): ";
tt++;
if(tt%4==0)
{
outfile<<endl;
cout<<endl;
}
}
}
void main()
{
infile.open("in.txt",ios::in);
outfile.open("out.txt",ios::out);
if(! infile)
{
cout<<"in.txt can't open.\n";
exit(0);
}
char a[80];
char d[10][10];
char b[10];
char b1[10];
int i,j,k,l;
int m=0;
while(! infile.eof())
{
infile.getline(a,sizeof(a));
k=strlen(a);
for(i=0;i<k;i++)
{
if(a[i]==' ')
{
for(j=1;j<k;j++)
{
a[j-1]=a[j];
}
a[j-1]='\0';
k--;
}
else break;
}
int count=0;
for(i=0;i<k+1;i++)
{
if((a[i]!=' ')&&(a[i]!='\0'))
{
b[count]=a[i];
count++;
}
else
{
b[count]='\0';
j=count;
count=0;
while(j!=0)
{
if(((65<=b[0])&&(b[0]<=90))||((97<=b[0])&&(b[0]<=122))||(b[0]=='_'))
{
b1[0]=b[0];
for(l=1;l<j;l++)
{
if(((65<=b[l])&&(b[l]<=90))||((97<=b[l])&&(b[l]<=122))||(b[l]=='_')||((b[l]>=48)&&(b[l]<=57)))
b1[l]=b[l];
else break;
}
b1[l]='\0';
jsaved(b1,d);
for(m=l;m<j;m++)
{
b[m-l]=b[m];
}
b[m-l]='\0';
j=j-l;
}
else if(((b[0]>=40)&&(b[0]<=47))||((b[0]>=58)&&(b[0]<=62))||(b[0]==94))
{
b1[0]=b[0];
for(l=1;l<j;l++)
{
if(((b[l]>=40)&&(b[l]<=47))||((b[l]>=58)&&(b[l]<=62))||(b[l]==94))
{
b1[l]=b[l];
}
else break;
}
b1[l]='\0';
if(l==1)
jsingle1(b1);
else if(l==2)
jsingle2(b1);
else //error judge
{
//cout<<"b";
outfile<<"**error("<<++bb<<")**"<<" ";
cout<<"**error("<<bb<<")**"<<" ";
tt++;
if(tt%4==0)
{
outfile<<endl;
cout<<endl;
}
}
for(m=l;m<j;m++)
{
b[m-l]=b[m];
}
b[m-l]='\0';
j=j-l;
}
else if((b[0]>='0')&&(b[0]<='9'))
{
b1[0]=b[0];
for(l=1;l<j;l++)
{
if((b[l]>='0')&&(b[l]<='9'))
b1[l]=b[l];
else break;
}
if(((65<=b[l])&&(b[l]<=90))||((97<=b[l])&&(b[l]<=122))||(b[l]=='_'))
{
outfile<<"**error("<<++bb<<")** ";
cout<<"**error("<<bb<<")** ";
break;
}
b1[l]='\0';
jnumble(b1);
for(m=l;m<j;m++)
{
b[m-l]=b[m];
}
b[m-l]='\0';
j=j-l;
}
else // 出错处理
{
outfile<<"**error("<<++bb<<")** ";
cout<<"**error("<<bb<<")** ";
tt++;
if(tt%4==0)
{
outfile<<endl;
cout<<endl;
}
for(l=1;l<j;l++)
{
b[l-1]=b[l];
}
b[l-1]='\0';
j=j-1;
}
}
}
}
}
if(total1!=0)
{
outfile<<"注释符不搭配 ";
cout<<"注释符不搭配 ";
}
outfile.close();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -