⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bianyi2005.cpp

📁 c编译器词法分析程序源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
{ 
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 + -