📄 table.cpp
字号:
#include"bianyi.h"
#define N 21
#define M 50
#define SIZE 36
struct nmdzb_type //内码对照表的数组
{
int stringsnb;
char strings[20];
}nmb[SIZE]={{0," "},{1," "},{2," "},{3,"PROGRAM"},{4,"CONST"},{5,"VAR"},{6,"INTEGER"},{7,"LONG"},
{8,"PROCEDURE"},{9,"IF"},{10,"THEN"},{11,"WHILE"},{12,"DO"},
{13,"READ"},{14,"WRITE"},{15,"BEGIN"},{16,"END"},{17,"ODD"},
{18,"+"},{19,"-"},{20,"*"},{21,"/"},{22,"="},
{23,"<>"},{24,"<"},{25,"<="},{26,">"},{27,">="},
{28,"."},{29,","},{30,";"},{31,":"},{32,":="},
{33,"("},{34,")"},{35,"$"}};
struct Word * getsym()
{
FILE *fpr;
fpr=fopen("e:\\table.txt","r");
if(!fpr) //若无法打开文件
{
printf("CAN'T read!\n");
return 0;
}
cout<<"//////////////////////////////////词法分析////////////////////////////////////"<<endl;
int Row(1);
int arrage(1);
int i=0;
int j=0;
int flag=1;
char str[N];
struct Word *word,*Cptr,*Eptr,*Hptr;
Cptr=Eptr=Hptr=NULL;
word=(struct Word*)(malloc(sizeof( Word)));
word->next=NULL;
char ch;
//struct Word *p;
//for语句 使table的每个[],赋值 date为i,next为null
ch=fgetc(fpr);
while(ch!=EOF)
{
if(ch==' ')
{
arrage++;
ch=fgetc(fpr);
continue;
}//if //if,判断是否是空格
if(ch=='\n')
{
Row++;
arrage=1;
ch=fgetc(fpr);
continue;
}//if //if 判断是否是回车
if(isalpha(ch))
{
i=0;
while(isalnum(ch)&&i<20)
{
str[i]=ch;
ch=fgetc(fpr);
i++;
}//while //while,接受字母开头的保留字或表识符
if(i<20&&!isalnum(ch))
{
str[i]='\0';
word->row=Row;
word->arrage=arrage;
arrage+=i;
j=3;
flag=1;
while(j<=17&&flag!=0)
{
flag=strcmp(str,nmb[j].strings);
if(flag!=0)
j++;
}//while //while 根据接收的字符串 查找内码表
if(flag)
j=2;
word->Ltrace=j;
if(!Hptr)
Cptr=Hptr=word; //if 如果是保留字
else
{
word->next=NULL;
Cptr->next=word;
Cptr=Cptr->next;
}//else //else 表识符
}
else
{
str[i]='\0';
word->row=Row;
word->arrage=arrage;
arrage+=i;
word->Ltrace=2;
if(!Hptr)
Cptr=Hptr=word; //if 如果是保留字
else
{
word->next=NULL;
Cptr->next=word;
Cptr=Cptr->next;
}//else
}
word=(struct Word*)(malloc(sizeof( Word)));
word->next=NULL;
}//if //if 字母开头的字符串
else
{
if(isdigit(ch)) //若为 数字
{
for(i=0;i<=19;i++)
{
str[i]='\0';
}//for //for 在word—date中赋值均为 “|0”
i=0;
while(isalnum(ch))
{
str[i]=ch;
ch=fgetc(fpr);
i++;
}//while //while word-data中输入数字
//是否要考虑 123YUIU这种情况?
word->row=Row;
word->arrage=arrage;
word->Ltrace=1;
arrage+=i;
if(!Hptr)
Cptr=Hptr=word; //if 如果是保留字
else
{
word->next=NULL;
Cptr->next=word;
Cptr=Cptr->next;
}//else
word=(struct Word*)(malloc(sizeof(Word)));
word->next=NULL;
}//if //IF
else //可能为 单或双字符
{
i=0;
str[i]=ch;
ch=fgetc(fpr);
i++;
if(isspace(ch))
str[i]='\0'; //单字符
else
{
str[i]=ch;
i++;
str[i]='\0';
}//else //else 双字符
//先忽略》899诸如此类的EROOR
j=18;
flag=1;
while(j<SIZE&&flag!=0&&ch!=EOF)
{
flag=strcmp(str,nmb[j].strings);
if(flag)
j++;
}//while //while 查找内码
if(flag==0)
{
word->row=Row;
word->arrage=arrage;
arrage+=i-1;///////////////////////////////////////////////////////
word->Ltrace=j;
if(!Hptr)
Hptr=Cptr=word;
else
{
word->next=NULL;
Cptr->next=word;
Cptr=Cptr->next;
}
if(i==2)
ch=fgetc(fpr);
}//if
else
{
if(!isspace(ch))
{
str[1]='\0';
j=18;
flag=1;
i=0;
while(j<SIZE&&flag!=0)
{
flag=strcmp(str,nmb[j].strings);
if(flag)
j++;
}//while
}
if(flag==0)
{
word->row=Row;
word->arrage=arrage;
arrage+=i+1;
word->Ltrace=j;
if(!Hptr)
Hptr=Cptr=word;
else
{
word->next=NULL;
Cptr->next=word;
Cptr=Cptr->next;
}
}//if
else
{
word->row=Row;
word->arrage=arrage;
if(!isspace(ch)||flag!=0)
arrage+=i;
else
arrage+=i-1;
if(!Eptr)
{
Eptr=word;
Eptr->next=NULL;
}
else
{
word->next=Eptr;
Eptr=word;
}
}
}//if
word=( struct Word*)(malloc(sizeof(Word)));
word->next=NULL;
}//else
}//else
}//whlie
fclose(fpr);
if(Eptr)
{
while(Eptr!=NULL)
{
cout<<Eptr->row<<"行 "<<Eptr->arrage<<"列 "<<"存在词法错误"<<endl;
word=Eptr;
Eptr=Eptr->next;
free(word);
}
return NULL;
}
else
{
cout<<"不存在词法错误,进入语法分析"<<endl<<endl;
return Hptr;
}
}//子程序
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -