📄 词法分析.cpp
字号:
#include"头文件.h"
extern bianYi parse; //词法分析
extern item sign; //
void valuetable::add(valuetype temp){
vt[vttop++]=temp;
}
valuetable::valuetable(){
vttop=0;
}
void valuetable::print(){
for(int i=0;i<vttop;i++)
cout<<parse.list2.list[vt[i].location]<<" "<<vt[i].type<<endl;
}
int valuetable::vt_findlocation(int l){
for(int i=0;i<vttop;i++){
if(vt[i].location==l)return i;
}
return -1;
}
valuetype::valuetype(int x,int y){
type=x;
location=y;
}
valuetype::valuetype(){};
valuetype::valuetype(const valuetype&temp){
type=temp.type;
location=temp.location;
}
jieguolist::jieguolist(){w=0;};
void jieguolist::add(int hao,int id,int hangi){
jieguo[w].x=hao;
jieguo[w].y=id;
hang[w]=hangi;
w++;
}
changbiaolist::changbiaolist(){
idend=1;
for(int j=0;j<max2;j++){
list[j]=new char[max3];
}
}
void changbiaolist::add(char hao[max3]){
strcpy(list[idend++],hao);
}
biaomalist::biaomalist(){
for(int j=0;j<max;j++){
list[j]=new char[max0];
}
strcpy(list[1],"and");
strcpy(list[2],"array");
strcpy(list[3],"begin");
strcpy(list[4],"bool");
strcpy(list[5],"call");
strcpy(list[6],"case");
strcpy(list[7],"char");
strcpy(list[8],"constant");
strcpy(list[9],"dim");
strcpy(list[10],"do");
strcpy(list[11],"else");
strcpy(list[12],"end");
strcpy(list[13],"false");
strcpy(list[14],"for");
strcpy(list[15],"if");
strcpy(list[16],"input");
strcpy(list[17],"integer");
strcpy(list[18],"not");
strcpy(list[19],"of");
strcpy(list[20],"or");
strcpy(list[21],"output");
strcpy(list[22],"procedure");
strcpy(list[23],"program");
strcpy(list[24],"read");
strcpy(list[25],"real");
strcpy(list[26],"repeat");
strcpy(list[27],"set");
strcpy(list[28],"stop");
strcpy(list[29],"then");
strcpy(list[30],"to");
strcpy(list[31],"true");
strcpy(list[32],"until");
strcpy(list[33],"var");
strcpy(list[34],"while");
strcpy(list[35],"write");
strcpy(list[36],"标识符");
strcpy(list[37],"整数");
strcpy(list[38],"字符常数");
strcpy(list[39],"(");
strcpy(list[40],")");
strcpy(list[41],"*");
strcpy(list[42],"*/");
strcpy(list[43],"+");
strcpy(list[44],",");
strcpy(list[45],"-");
strcpy(list[46],".");
strcpy(list[47],"..");
strcpy(list[48],"/");
strcpy(list[49],"/*");
strcpy(list[50],":");
strcpy(list[51],":=");
strcpy(list[52],";");
strcpy(list[53],"<");
strcpy(list[54],"<=");
strcpy(list[55],"<>");
strcpy(list[56],"=");
strcpy(list[57],">");
strcpy(list[58],">=");
strcpy(list[59],"[");
strcpy(list[60],"]");
}
void bianYi::createbianYi(char*fileName){
inf.open(fileName,ios::in);
i=1;
}
bianYi::bianYi(){};
bianYi::bianYi(char*fileName){
inf.open(fileName,ios::in);
i=1;
}
int bianYi::looklist1(int begin,int end,char fuhao[10]){////处理关键字的加载
for(int j=begin;j<=end;j++){
if(strcmp(list1.list[j],fuhao)==0){
// cout<<list1.list[j]<<endl;
list3.add(j,0,i);
return 1;
}
}
return 0;
}
int bianYi::looklist2(char fuhao[10]){////////////处理标式附的加载
for(int j=1;j<=list2.idend-1;j++){
///查找常量保留字表若找到用它的ID加载结果表,否则创建新的ID加载结果表
if(strcmp(list2.list[j],fuhao)==0){
list3.add(36,j,i);
return 1;
}
}
list2.add(fuhao);
list3.add(36,list2.idend-1,i);
return 0;
}
int bianYi::looklist22(char fuhao[max3]){////////////处理字符串的加载
for(int j=1;j<=list2.idend-1;j++){
///查找常量保留字表若找到用它的ID加载结果表,否则创建新的ID加载结果表
if(strcmp(list2.list[j],fuhao)==0){
list3.add(38,j,i);
return 1;
}
}
list2.add(fuhao);
list3.add(38,list2.idend-1,i);
return 0;
}
char bianYi::getCh(){
char c;
if(inf.get(c)){
if(c=='\n')i++;
return c;
}
else {
i++;
return NULL;
}
}
bianYi::~bianYi(){
inf.close();
}
void bianYi::ciFa(){
char c;
int j;
c=getCh();
while(c!=NULL){
while(c==' '||c=='\n'||c=='\t')c=getCh();
if((c>=65&&c<=90)||(c>=97&&c<=122))
{
char biaoShi[10];
biaoShi[0]=c;
int state=0;
for(j=1;true;j++){//////////////////////>10问题,字符串/0
c=getCh();
if((c>=65&&c<=90)||(c>=97&&c<=122))biaoShi[j]=c;
else if(c>=48&&c<=57){
biaoShi[j]=c;
state=1;
}
else break;
}
biaoShi[j]='\0';
// cout<<biaoShi<<endl;
if(state==0){
if(looklist1(1,35,biaoShi)==0){
looklist2(biaoShi);
}
}
else looklist2(biaoShi);
}
else if(c>=48&&c<=57){
int n=c-'0';
for(c=getCh();c>=48&&c<=57;c=getCh())
n=n*10+c-'0';
list3.add(37,n,i);
}
/////////////////''处理
else if(c=='\''){
char temp[max4];
c=getCh();
for(j=0;c!='\''&&c!='\n';j++){
temp[j]=c;
c=getCh();
}
if(c=='\n')cout<<"error:第"<<i<<"行出错,找不到'"<<endl;
temp[j]='\0';
c=getCh();
looklist22(temp);
}
else {
char hao[3];
hao[0]=c;
hao[1]='\0';
//////////////////////运算符
if(looklist1(39,60,hao)){
c=getCh();
hao[1]=c;
hao[2]='\0';
if(strcmp(hao,"/*")==0){
list3.w--;
for(j=0;c!='\n'&&c!=NULL;j++){
c=getCh();
if(c=='*'){
// hao[0]=c;
c=getCh();
if(c=='/')
break;
}
}
if(c=='\n'||c==NULL)cout<<"error:第"<<i<<"行出错,找不到*/ "<<endl;/////////////////////////////////////
c=getCh();
}
else if(looklist1(39,60,hao))
{
c=getCh();
list3.w--;
list3.w--;
looklist1(39,60,hao);
}
}
else {cout<<"error:第"<<i<<"行出错,有字符无法识别"<<endl;c=getCh();}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -