📄 bianyi2005.cpp
字号:
{
mistake = 6; //6代表定义的数字超出了所允许的范围将会溢出
return false;
}
}
else
{
if(len<max_lenth_allow)
return true;
else if(len==max_lenth_allow)
{
if(stricmp(input,wh)<=0)
return true;
else
{
mistake = 6;
return false;
}
}
else
{
mistake = 6;
return false;
}
}
}
return false;
}
void calculator(int cur) //int 1 unsigned int 2 long 3 unsigned long 4
{
int mis_kind = 0,mistake = 0;
if(if_overflow(mis_kind,cur,mistake))
add_to_the_link(NUMBER);
else
add_to_the_wrong_line(mistake);
}
int check_if_string(int cur)
{
cur--;
cur--;
while(cur>=0)
if(read[cur]==' ')
cur--;
else
break;
if(read[cur]=='(') //"" maybe sth need to add
return 2;
else if(read[cur]=='=')
return 1;
else
return 0;
}
void Analysis()
{
int t = 0,j = 0;
/* while(1)
if(read[t]>='a'&& read[t]<='z'|| read[t]>='A'&& read[t]<='Z'||read[t]=='_'
||read[t]=='{'||read[t]=='}'||read[t]=='#'||read[t]=='<<endl')
break;
else
t++;*/
while(read[t]!='\n')
{
while(read[t]==' ') //滤掉空格
t++;
if(read[t]=='\n')
return;
j = 0;
while(read[t]!='\n')
{
if(read[t]>='a'&& read[t]<='z'|| read[t]>='A'&& read[t]<='Z'||read[t]=='_'
||read[t]>='0'&&read[t]<='9')
input[j++] = read[t++];
else if(read[t]=='.')
{
if(read[t-1]>='0'&&read[t-1]<='9'&&read[t+1]>='0'&&read[t+1]<='9')
input[j++] = read[t++];
else
{
input[j] = 0; //if('.') //pay attention to j
break;
}
}
else if(read[t]=='-')
{
if(read[t+1]>='0'&&read[t+1]<='9')
input[j++] = read[t++];
else
{
input[j] = 0; //if('.') //pay attention to j
break;
}
}
else
{
input[j] = 0;
break;
}
}
if(input[0])
{
if((input[0]>='0'&&input[0]<='9')||(input[0]=='-'&&input[1]>='0'&&input[1]<='9'))
{
for(int w=0;input[w];w++)
if(input[w]>='0'&&input[w]<='9'||(input[w]=='.'&&input[w-1]>='0'&&input[w-1]<='9'
&&input[w+1]>='0'&&input[w+1]<='9')||input[w]=='-');
else
break;
if(!input[w])
calculator(t);
else
add_to_the_wrong_line(3); //3 means "数字书写错误"
}
else
{
if_key_word(t);
if(back)
{
back = 0;
input[0] = '"';
input[1] = 0;
add_to_the_link(57);
return;
}
}
}
else if(read[t]=='"')
{
input[0] = '"';
input[1] = 0;
add_to_the_link(57);
t++;
if(check_if_string(t)>0)
{
j = 0;
if(read[t]=='\n')
return;
while(read[t]!='"'&&read[t]!='\n')
input[j++] = read[t++];
input[j] = 0;
if(check_if_string(t)==1)
add_to_the_link(80); //将输出的信息
else if(check_if_string(t)==2)
add_to_the_link(70); //字符串
if(read[t]=='"')
{
input[0] = read[t];
input[1] = 0;
add_to_the_link(57);
t++;
}
}
}
else
{
if(read[t]=='/'&&read[t+1]=='/')
{
input[0] = '/';
input[1] = '/';
input[2] = 0;
add_to_the_link(70); //注释标记
return;
}
for(int m = 0;Limit[m];m++) //
{
if(read[t]==Limit[m])
{
if(((read[t]=='='||read[t]=='>'||read[t]=='<'||read[t]=='!')
&&read[t+1]=='=')||read[t]=='&'&&read[t+1]=='&'||read[t]=='|'
&&read[t+1]=='|')
{
input[0] = read[t];
input[1] = read[t+1];
input[2] = 0;
add_to_the_link(m+33+1); //add cha 18
t+=2;
}
else
{
input[0] = read[t]; //need to add sth
input[1] = 0;
add_to_the_link(m+33);
t++;
}
break;
}
}
if(!Limit[m])
{
add_to_the_wrong_line(2); //参数为错误类型 2 means "非法字符"
t++;
}
}
}
}
void read_the_test_file(FILE *&fp)
{
fp = fopen(Filename,"r");
while (fp==NULL) //若打入的文件没有,则提示继续打入有效的路径名
{
cout<<"对不起,程序自带的测试程序无法打开!";
cout<<"请按说明将程序自带的测试程序和本源程序存放在同一个子目录下,准备就绪后按Enter键进入测试";
cout<<"老师如果您想用您的程序做测试,程序将会采用您所提供的测试方案,准备就绪后,请输入测试程序的完整路径文件名";
cout<<"如果想结束测试,请输入q"<<endl;
char *temp = new char[strlen(Filename+1)];
strcpy(temp,Filename);
cin>>Filename;
if(strlen(Filename)==0)
strcpy(Filename,temp);
else if(Filename[0]=='Q'||Filename[0]=='q')
{
cout<<"程序测试完毕,谢谢老师指导"<<endl;
exit(0);
}
fp = fopen(Filename,"r");
}
}
void show_file()
{
FILE *test_file = fopen(Filename,"rt");
char ch[81];
while(1)
{
if(feof(test_file))
{
cout<<endl<<"This is the end of "<<Filename<<endl;
return;
}
else
{
fgets(ch,81,test_file);
cout<<ch;
}
}
cout<<endl;
fclose(test_file);
}
void test_by_teacher(FILE *&fp)
{
cout<<"若准备结束测试,请输入q"<<endl;
cout<<"请输入完整的程序路径文件名或者相对文件名(如果此测试程序与源程序在同一个目录下):";
cin>>Filename;
int length = strlen(Filename);
if(Filename[length-1]==':')
Filename[length-1] = 0;
if(Filename[0]=='q'||Filename[0]=='Q'||!Filename[0])
{
cout<<"程序测试完毕,谢谢老师指导"<<endl;
exit(0);
}
fp = fopen(Filename,"r");
if(fp==NULL)
{
cout<<"对不起此测试程序无法打开!"<<endl<<endl;
cout<<"请输入测试程序的完整路径文件名:"<<endl;
cin>>Filename;
fp = fopen(Filename,"r");
}
show_file();
cout<<endl<<"This is the end of file"<<endl;
}
void test_by_author(FILE *&fp)
{
if(count==0||count==1)
cout<<endl<<"这是程序作者自带的第"<<count+1<<"个测试程序"<<endl;
else
cout<<endl<<"这是程序作者自带的最后一个测试程序"<<endl;
if(count==0)
strcpy(Filename,"test1.cpp");
if(count==1)
strcpy(Filename,"test2.cpp");
else if(count==2)
strcpy(Filename,"test3.cpp");
cout<<endl<<Filename<<"的源程序为:"<<endl;
read_the_test_file(fp);
show_file();
}
void read_from_the_file()
{
FILE *fp;
char choose = 'x';
do
{
choose = 'x';
cout<<"如果想结束测试,请输入q";
cout<<"如果采用您自己的测试程序,请输入y,否则输入n,程序将调用作者自带的测试程序,y or n:";
cin>>choose;
if(choose=='q'||choose=='Q')
{
cout<<"程序测试完毕,谢谢老师指导"<<endl;
exit(0);
}
if(choose=='y'||choose=='Y')
test_by_teacher(fp);
else if(choose=='n'||choose=='N')
{
if(count==0||count==1||count==2)
{
test_by_author(fp);
count++;
}
else
{
cout<<"程序自带的测试程序已用完,";
cout<<"如果想结束测试,请输入q,否则按其他有效键(非功能键)程序将进入用户测试阶段:";
cin>>choose;
if(choose=='q'||choose=='Q')
{
cout<<"程序测试完毕,谢谢老师指导"<<endl;
exit(0);
}
test_by_teacher(fp);
}
}
else
cout<<endl<<"请注意输入条件并按输入条件进行合法输入!"<<endl;
}while(!(choose=='q'||choose=='Q'||choose=='y'||choose=='Y'||choose=='n'||choose=='N'));
while(1)
{
//clearerr(fp);
fgets(read,100,fp);
if(feof(fp))
break;
hang_shu++;
Analysis();
}
fclose(fp);
}
void show_result()
{
char sh[50];
int v = 0;
for(int w=strlen(Filename)-1;w>=0;w--)
if(Filename[w]!='\\')
sh[v++] = Filename[w];
else
{
sh[v] = 0;
break;
}
if(w<0)
sh[v] = 0;
strrev(sh);
int show = 0;
cout<<"程序"<<sh<<"词法分析结果如下:"<<endl;
if(mistake_begin->next)
{
mistake *p = mistake_begin->next ;
cout<<endl<<"程序"<<sh<<"中含有"<<mistake_number<<"个词法错误:"<<endl;
while(p)
{
cout<<sh<<"第"<<p->hang_hao<<"行中";
switch(p->mistake_kind )
{
case 1: cout<<"变量"<<p->ch<<"没有定义"<<endl; break;
case 2: cout<<p->ch<<"为非法字符"<<endl; break;
case 3: cout<<"数字"<<p->ch<<"书写错误"<<endl; break;
case 4: cout<<"字符串"<<p->ch<<"定义格式错误"<<endl; break;
case 5: cout<<"数字"<<p->ch<<"数据类型错误,unsigned中不能定义负数"<<endl;break;
case 6: cout<<p->ch<<"因数字太大将会引起数据溢出"<<endl;break;
default:cout<<p->ch<<"错误,错误原因忘了定义"<<endl;break;
}
p = p->next ;
}
show = 1;
}
cout<<endl;
if(!show)
cout<<"程序"<<sh<<"词法分析未出现错误:"<<endl;
else
cout<<"程序"<<sh<<"词法分析结果如下:"<<endl;
Token *p = Token_begin->next;
while(p)
{
cout.width(15);
cout<<setiosflags(ios::left)<<p->Biao_zhi_fu<<setw(10)<<p->Number<<endl;
p = p->next ;
}
}
template <typename T>
void free_memory(T *head_link)
{
T *p,*q;
p=head_link->next; // p指向第一个结点
while(p) //没到表尾
{
q=p->next;
free(p);
p=q;
}
}
void main()
{
/*******************************将全局变量的部分指针赋空值************************************/
for(int i=0;i<26;i++)
{
key_table[i].identifer = -1;
key_table[i].next = NULL;
}
Create_hash_table();
cout<<"本程序的测试方案将由老师和程序作者选择决定"<<endl;
cout<<"是选择程序作者字带的测试程序,还是老师您自己输入测试程序(建议先采用程序作者自带的测试程序).如果您自己输入测试程序,请按y,否则输入n:";
while(1)
{
Token_begin->next = NULL;
begin->next = NULL;
mistake_begin->next = NULL;
//instruction();
read_from_the_file();
show_result();
free_memory(Token_begin);
free_memory(begin);
free_memory(mistake_begin);
c_point = begin;
m_point = mistake_begin;
t_point = Token_begin;
hang_shu = 0;
flag = 0;
i = 0;
mistake_number = 0;
back = 0;
if_return = 0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -