📄 main.cpp
字号:
#include<fstream.h>
#include<iostream.h>
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#include<string.h>
#include<iomanip.h>
#define MAX 255
#define Row 8
#define LISTINCREMENT 2 //线性存储空间分配增量和初始量
static int cu=0;
struct reserve //定义结构体,用以保留保留字符
{
char num[Row];
char bn[10];
};
struct reserve Zi[13]={{"(3,0)","program"},{"(4,0)","var"},{"(5,0)","procedure"},{"(6,0)","begin"},
{"(7,0)","end"},{"(8,0)","if"},{"(9,0)","then"},{"(10,0)","else"},{"(11,0)","while"},
{"(12,0)","do"},{"(13,0)","call"},{"(14,0)","integer"},{"(15,0)","real"}};//保留字表
struct identifer //结构体处理
{
char id[10];
};
identifer *newbase; //用于增加存储分配空间
struct Assign //用于增加存储分配空间
{
identifer *BL; //存储空间基址
int length; //当前长度
int listsize; //当前分配的存储容量
} SqList;
void InitList_Sq (Assign &L) //初始化线性表
{
L.BL=(identifer*)malloc(LISTINCREMENT*sizeof(identifer));
if(!L.BL) exit(1); //分配失败
L.length=0;
L.listsize=LISTINCREMENT;
}
void ChangeLine() //用于换行,每输出四个换行
{
static int Line;
Line++;
if(Line%4==0)
cout<<endl;
}
void Alphaprocess(char *frp) //处理字母,包括保留字和标志符
{
char *r;r=new char;
for(int i=0;i<13;i++)
{
if(strcmp(frp,Zi[i].bn)==0)//是否为保留字
{
cout<<Zi[i].num<<setiosflags(ios::left)<<setw(12)<<Zi[i].bn;
ChangeLine();
return;
}
}
int t=0;
if(strlen(frp)<Row) //不是保留字,有效字符不大于8
{
for(;*frp!=0;frp++)
{
r[t]=*frp;t++;
}r[t]='\0';
}
else //不是保留字,有效字符大于8
{
for(int temp3=0;temp3<Row;temp3++)
r[temp3]=frp[temp3];
r[temp3]='\0';
}
for(int temp2=0;temp2<=cu;temp2++)
{
if(strcmp(SqList.BL[temp2].id,r)==0)//标识符以前出现过
{cout<<"(1,"<<(temp2+1)<<")"<<setiosflags(ios::left)<<setw(10)<<r;
ChangeLine();
return;}
}
cout<<"(1,"<<cu+1<<")"<<setiosflags(ios::left)<<setw(11)<<r;//没出现过
ChangeLine(); t=0;
for(;*r!=0;r++) //赋值,把新的标志符存放到数组中去
{
SqList.BL[cu].id[t]=*r;
t++;
}
SqList.BL[cu].id[t]='\0';
SqList.length++;
if(SqList.length>=SqList.listsize)//增加分配空间
{
newbase=(identifer*)realloc(SqList.BL,(SqList.listsize+LISTINCREMENT)*sizeof(identifer));
if(!newbase)exit(1);
SqList.BL=newbase;
SqList.listsize=SqList.listsize+LISTINCREMENT;
} cu++;
}
void process(char * frp)
{
int i=0;char temp[MAX];char ch;
static int flags=0;
static int err=0;
for(int cl=0;cl<=int (strlen(frp));cl++)
temp[cl]='\0';
while(frp[i]!='\0') //字符结束标志
{
if(flags==1)
{
while(frp[i+1]!='\0'&&(frp[i]!='*'||frp[i+1]!='/'))
i++;
if(frp[i+1]=='\0')return; //用以处理多行注释
if(frp[i]=='*'&&frp[i+1]=='/')
{
flags=0;
i=i+2;
if(frp[i]!='\0')
ch=frp[i];
else return;
}
}
else
ch=frp[i];
if( ch==' '|| ch =='\t') //过滤掉空格和tab
{
while(ch==' '|| ch =='\t')
{
i++;
ch=frp[i];
}
}
else if (isdigit(ch)) //首字为数字的情况
{
int j=0;
while(isdigit(ch)||isalpha(ch))//判断是否为错误标识符
{
temp[j]=ch;
i++;j++;
ch=frp[i];
}
for(int x=0;x<j;x++)
if(isalpha(temp[x]))
{cout<<setiosflags(ios::left)<<"*error("<<++err<<")*";goto L;}
cout<<"(2,";
for(x=0;x<j;x++)
cout<<temp[x];
cout<<")";
for( x=0;x<j;x++)
cout<<temp[x];
L: cout<<"\t";
ChangeLine();
for(int cl=0;cl<j;cl++)
temp[cl]='\0';
}
else if(isalpha(ch)) //首字是字母的情况
{
int t=0;
while(isalpha(ch)||isdigit(ch))
{
if(ch>='A'&&ch<='Z')
{
int ring=ch+32;
ch=(char)ring;
}
temp[t]=ch;
i++;t++;
ch=frp[i];
}
Alphaprocess(temp); //调用字母处理函数
for(int cl=0;cl<t;cl++)
temp[cl]='\0';
}
else if(ch==':')
{
i++;
ch=frp[i];
if(ch=='=')
{ cout<<setiosflags(ios::left)<<setw(16)<<"(29,0):="; ChangeLine();i++;}
else
{cout<<setiosflags(ios::left)<<setw(16)<<"(35,0):";ChangeLine();}
}
else if(ch=='>')
{
i++;ch=frp[i];
if(ch=='=')
{cout<<setiosflags(ios::left)<<setw(16)<<"(26,0)>=";ChangeLine();i++;}
else
{cout<<setiosflags(ios::left)<<setw(16)<<"(25,0)>";ChangeLine();}
}
else if(ch=='<')
{
i++;
ch=frp[i];
if(ch=='=')
{ cout<<setiosflags(ios::left)<<setw(16)<<"(24,0)<=";i++;}
else if(ch='>')
{ cout<<setiosflags(ios::left)<<setw(16)<<"(28,0)<>";i++;}
else
{cout<<setiosflags(ios::left)<<setw(16)<<"(23,0)<";}
ChangeLine();
}
else if(ch=='/') //对注释的考虑及处理
{
i++;
ch=frp[i];
if(ch=='/') return; //单行注释处理
else if(ch=='*') {
flags=1;
i++;ch=frp[i];}//多行注释处理
else {cout<<setiosflags(ios::left)<<setw(16)<<"(19,0)/";}
}
else //一员运算符的情况
{
if(ch=='+')cout<<"(16,0)+";
else if(ch=='-'){cout<<setiosflags(ios::left)<<setw(16)<<"(17,0)-";}
else if(ch=='*'){cout<<setiosflags(ios::left)<<setw(16)<<"(16,0)*";}
else if(ch=='~'){cout<<setiosflags(ios::left)<<setw(16)<<"(20,0)~";}
else if(ch=='^'){cout<<setiosflags(ios::left)<<setw(16)<<"(21,0)^";}
else if(ch=='&'){cout<<setiosflags(ios::left)<<setw(16)<<"(22,0)&";}
else if(ch==';'){cout<<setiosflags(ios::left)<<setw(16)<<"(30,0);";}
else if(ch=='.'){cout<<setiosflags(ios::left)<<setw(16)<<"(31,0).";}
else if(ch==','){cout<<setiosflags(ios::left)<<setw(16)<<"(32,0),";}
else if(ch=='('){cout<<setiosflags(ios::left)<<setw(16)<<"(33,0)(";}
else if(ch==')'){cout<<setiosflags(ios::left)<<setw(16)<<"(34,0))";}
else {cout<<setiosflags(ios::left)<<"*err("<<++err<<")* ";}
i++;ChangeLine();
}
}
}
void main() //主函数
{
fstream file;
char buf[MAX];
InitList_Sq (SqList);
file.open("f:\\yang.txt",ios::nocreate|ios::in);
cout<<"二元式序列:"<<" (class.value)"<<endl;
while(!file.eof())
{
file.getline(buf,MAX); //读取一行句子
process(buf); //处理一行句子
}
cout<<endl<<"标识符表:"<<endl;cout<<"序列"<<"\t\t"<<"名字 "<<"\t\t"<<"地址 "<<endl;
for(int temp1=0;temp1<cu;temp1++)
{
static int j; //用于标识地址
if(strlen(SqList.BL[temp1].id)==8)//对齐作用
cout<<temp1+1<<"\t\t"<<SqList.BL[temp1].id<<"\t"<<"(1,"<<++j<<")"<<endl;
else
cout<<temp1+1<<"\t\t"<<SqList.BL[temp1].id<<"\t\t"<<"(1,"<<++j<<")"<<endl;
}
file.close();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -