




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、#include<stdio.h>#include<iostream.h>#include<stdlib.h>#include<fstream.h>#include<string.h>#include<math.h>#include<iomanip.h>#include<malloc.h>#define NULL 0struct Stack / 栈结构体: 序号、内容、连接下一结点指针int num;char name;struct Stack *next;struct Guiyue/ 规则集结构体
2、:序号、规则长度、符号、连接下一结点指针int num;int count;char name;struct Guiyue *next;struct Relation / 分析表结构体:状态序号、对应符号列、操作类型的对应序号、操作类型、连接下一结点指针 int line_States ;char rank_Letter;int relationship;char name;struct Relation *next; struct Sign / 符号表结构体: 自变量名、标识类型、连接下一结点指针char name20;char kind;struct Sign *next; struct
3、Word / 单词表结构体: 单词名字、标识类型、状态、序号、行号、连接符号表指针、连接下一结点指针char name20;char mark_name;int state;int num;int line;struct Sign *link;struct Word *next;FILE *fp1;/文件指针int row=1,line10000,Lin300,w_num;/字符行变量、字符行、单词所在行、字符数char buffer10000;/字符串缓冲区Stack *MarkPush(Stack *ip,char mark,int I_i)/压栈Stack *s;s=(Stack *)m
4、alloc(sizeof(Stack);s->name=mark;s->num=I_i;s->next=ip;ip=s;return ip;void MarkPop(Stack *ip)/出栈Stack *q;char name;name=ip->name;q=ip->next;if(ip->next!=NULL)ip->name=ip->next->name;ip->num=ip->next->num;ip->next=ip->next->next;free(q);int judge(char ch)/
5、 接收ch判断字符,变量flag返回字符类别int flag;if(ch='!'|ch='$'|ch='&'|ch='*'|ch='('|ch=')'|ch='-'|ch='_'| ch='+'|ch='='|ch='|'|ch=''|ch=''|ch=''|ch=''|ch=''| ch=':'|ch='&q
6、uot;'|ch='<'|ch=','|ch='>'|ch='.'|ch='/'|ch=''') flag=1;else if('0'<=ch&&ch<='9') flag=2;else if('a'<=ch&&ch<='z')|('A'<=ch&&ch<='Z') flag=3;else if
7、(ch=' ') flag=4;else if(ch='n') flag=5;else if(ch='?') flag=6;else if(feof(fp1) flag=7;/结束else flag=0; /illegal characterreturn(flag);/=/ 词法分析函数: void scan()/ 数据传递: 形参fp接收指向文本文件头的文件指针;/ 全局变量buffer与line对应保存源文件字符及其行号,char_num保存字符总数。void scan()char ch;int flag,j=0,i=-1;while(!fe
8、of(fp1)ch=fgetc(fp1);flag=judge(ch);printf("%c",ch);/显示打开的文件 if(flag=1|flag=2|flag=3) i+;bufferi=ch;linei=row; else if(flag=4) i+;bufferi='?'linei=row; else if(flag=5) i+;bufferi=''row+;else if(flag=7) continue; else cout<<"n请注意,第"<<row<< "行
9、的"<<ch<<"是非法字符!"<<endl; w_num=i;/*确定单词所在的行*/int one,two,k=0;for(i=0;i<w_num;i+)one=judge(bufferi);two=judge(bufferi+1);if(one!=two&&bufferi!='?'&&bufferi!='')|one=1)Link=linei;k+;/=/ 初始化单词表函数: struct Word *InitWord()/ 数据传递: head返回单词
10、表的头指针/ 备注: 初始化单词表函数包括分割单词、标识单词、生成变量符号表、完善单词属性表四个功能struct Word *InitWord()struct Word *head,*ft,*news,*p;struct Sign *s_first,*s_look;s_first=s_look=(struct Sign *)malloc(sizeof(struct Sign);s_first->kind='0's_first->name0='0'news=head=ft=(struct Word *)malloc(sizeof(struct Word
11、);ft->link=s_first;ft->next=NULL;/=分割单词功能=int i=0,k,flag,jud=0;for(k=0;k<w_num;k+)flag=judge(bufferk);if(jud=0)/1 if(flag=2|flag=3) news->namei=bufferk; news->name+i='0' else /2 i=0; ft=news; if(news->name0>=33&&news->name0<=125) news=(struct Word *)malloc(
12、sizeof(struct Word); ft->next=news; news->next=NULL; if(flag=1)/3 if(bufferk='/'&&bufferk+1='/') jud=1; else if(bufferk='/'&&bufferk+1='*') jud=2; else/4 news->namei=bufferk; if(bufferk='='&&bufferk+1='=')|(bufferk='
13、;&'&&bufferk+1='&')| (bufferk='|'&&bufferk+1='|')|(bufferk='>'&&bufferk+1='=')| (bufferk='<'&&bufferk+1='=')|(bufferk='!'&&bufferk+1='=') k=k+1; i=i+1; printf("%d&qu
14、ot;,i); news->namei=bufferk; news->name1+i='0' ft=news; news=(struct Word *)malloc(sizeof(struct Word); ft->next=news; news->next=NULL; /4 /3/2/1else if(jud=1)if(bufferk='') jud=0; else ;else if(jud=2)if(bufferk='*'&&bufferk+1='/') jud=0; k=k+1; el
15、se ; if(news->name0<33|news->name0>125) ft->next=NULL; /*单词转换成标识符*/ft=head;while(ft)if(strcmp(ft->name,"main")=0)ft->mark_name='m'else if(strcmp(ft->name,"void")=0)ft->mark_name='v'else if(strcmp(ft->name,"while")=0)ft->m
16、ark_name='w'else if(strcmp(ft->name,"if")=0)ft->mark_name='f'else if(strcmp(ft->name,"else")=0)ft->mark_name='e'else if(strcmp(ft->name,"int")=0)ft->mark_name='a'else if(strcmp(ft->name,"float")=0)ft->mar
17、k_name='b'else if(strcmp(ft->name,"double")=0)ft->mark_name='d'else if(strcmp(ft->name,"char")=0)ft->mark_name='c'else if(ft->name0>='0'&&ft->name0<='9')ft->mark_name='n'else if(ft->name0='+
18、'|ft->name0='-'|ft->name0='*'|ft->name0='/' |ft->name0='='|ft->name0='<'|ft->name0='>' |ft->name0=','|ft->name0=''|ft->name0='('|ft->name0=')' |ft->name0=''|ft->name0
19、='')ft->mark_name=ft->name0;else if(strcmp(ft->name,"&&")=0)ft->mark_name='&'else if(strcmp(ft->name,"|")=0)ft->mark_name='|'else if(strcmp(ft->name,"!=")=0)ft->mark_name=''else if(strcmp(ft->name,&q
20、uot;=")=0)ft->mark_name='#'else ft->mark_name='i'ft=ft->next;/*初始化单词表的序号和行号*/i=0;ft=head;while(ft)ft->num=i;ft->line=Lini;i+;ft=ft->next;/*初始化符号表*/ft=head;char word_type;while(ft)/1if(ft->mark_name='a'|ft->mark_name='b'|ft->mark_name=
21、39;c'|ft->mark_name='d')/2p=ft->next;word_type=ft->mark_name;while(p->mark_name!='')if(p->mark_name!=',')s_look=(struct Sign *)malloc(sizeof(struct Sign);s_look->kind=word_type;strcpy(s_look->name,p->name);s_first->next=s_look;s_first=s_look;s_l
22、ook->next=NULL;p=p->next;ft=p;/2ft=ft->next;/1return(head);/=/正确性检测函数: FindWordDeclare(Word *head) / 数据传递: *head:单词表的头指针. / 备注: 查找保留字是否被声名和符号是否对称. void FindWordDeclare(Word *head)struct Sign *s_first;struct Word *find,*w_name1000,*word_fu100;struct Stack *ip,*q;int i,cal=0,ca=0,end;find=hea
23、d;cout<<endl<<"=显 示 检 查 结 果="<<endl;while(find)if(find->mark_name='i')w_namecal=find;cal+;if(find->next!=NULL) if(find->mark_name=find->next->mark_name)&&(find->mark_name!='')&& (find->mark_name!='')&&(f
24、ind->mark_name!='(')&&(find->mark_name!=')') cout<<"第 "<<find->line<<" 行, "<<find->mark_name<<" 存在字符重复错误 !"<<endl; else if(find->mark_name='i'&&find->next->mark_name='
25、39;)|(find->mark_name=','&&find->next->mark_name='')| (find->mark_name=','&&find->next->mark_name='')|(find->mark_name=''&&find->next->mark_name=',')| (find->mark_name='('&&find->
26、next->mark_name=',')|(find->mark_name=','&&find->next->mark_name='(')| (find->mark_name=')'&&find->next->mark_name='')|(find->mark_name=')'&&find->next->mark_name=',')| (find->mark_name=&
27、#39;)'&&find->next->mark_name='') cout<<"第 "<<find->line<<" 行,"<<find->name<<" 处存在符号连接错误 !"<<endl; if(find->mark_name='a'|find->mark_name='b'|find->mark_name='c'|find-&g
28、t;mark_name='d')&& (find->next->mark_name=''|find->next->mark_name=''|find->next->mark_name=','| find->next->mark_name=''|find->next->mark_name='('|find->next->mark_name=')'|find->next->mark_nam
29、e='+'|find->next->mark_name='-'|find->next->mark_name='*'|find->next->mark_name='/'|find->next->mark_name='&'|find->next->mark_name='>'|find->next->mark_name='<'|find->next->mark_name='=
30、39;|find->next->mark_name='!'|find->next->mark_name=''|find->next->mark_name='n') cout<<"第 "<<find->line<<" 行, "<<find->mark_name<<" 存在自变量声明搭配错误 !"<<endl;if(find->mark_name='('
31、;|find->mark_name=')'|find->mark_name=''|find->mark_name='') word_fuca=find; ca+;if(find->name0>='0'&&find->name0<='9'&&find->name1>='a'&&find->name1<='z') cout<<"第 "<&
32、lt;find->line<<" 行, "<<find->name<<" 存在变量声明错误 !"<<endl;find=find->next;int j=0;for(i=0;i<cal;i+) s_first=head->link; end=1; while(s_first&&end) if(strcmp(s_first->name,w_namei->name)=0) end=0; else s_first=s_first->next; if(
33、end=1&&i!=cal-1) cout<<"错误 ! 第 "<<w_namei->line<<" 行,变量 "<<w_namei->name<<" 没有被声明 !"<<endl; q=ip=(struct Stack *)malloc(sizeof(struct Stack);ip->name='$'for(i=0;i<ca;i+)if(word_fui->mark_name='('
34、)|(word_fui->mark_name='') ip=MarkPush(ip,word_fui->mark_name,i); else if(ip->name='('&&word_fui->mark_name=')')|(ip->name=''&&word_fui->mark_name='') MarkPop(ip); else cout<<"错误 ! 第 "<<word_fui->line&
35、lt;<" 行,“ "<<word_fui->name<<" ” 存在符号匹配错误 ! "<<endl;if(ip->name!='$') cout<<"错误 ! 第 "<<word_fui-1->line<<" 行,“ "<<word_fui-1->name<<" ” 存在符号匹配错误 !"<<endl; cout<<"
36、n=n"<<endl;/=/初始化分析表函数: Relation *FirstRelation()/ 数据传递: r_head返回分析表的头指针 Relation *FirstRelation()Relation *r_head,*r_find,*r_new;r_head=NULL;/状态int sr13=2,1,100,3,4,5,6,12,15,16,17,18,10,11,7,9,13,14,8,19,12,4,15,16,17,18,10,11,20,9,13,14,8,21,22,23,24,6,26,25,8,9,10,11,1,3,12,15,16,17,1
37、8,10,11,28,14,27,33,34,32,29,30,31,33,34,32,35,30,31,42,41,43,36,37,38,39,40,44,7,13,13,2,2,2,2,2,2,2,2,5,47,46,18,48,18,20,20,20,33,34,32,49,30,31,27,27,51,52,54,53,27,50,47,59,60,83,29,61,29,29,31,31,62,31,31,33,33,63,33,33,33,35,35,35,35,35,35,42,41,43,64,37,38,39,40,37,37,37,37,37,37,38,38,38,38
38、,38,38,45,12,12,65,33,34,32,66,31,33,34,32,67,47,82,26,26,26,55,56,57,58,22,22,22,23,23,23,24,24,24,25,25,25,68,42,41,43,69,38,39,40,42,41,43,70,39,40,42,41,43,71,40,42,41,43,72,60,73,12,15,16,17,18,10,11,74,9,13,14,8,17,48,17,19,19,19,12,15,16,17,18,10,11,75,9,13,14,8,28,61,28,28,30,30,62,30,30,32,
39、32,63,32,32,32,34,34,34,34,34,34,36,36,36,36,36,36,77,76,15,15,15,15,15,15,15,15,78,79,12,15,16,17,18,10,11,80,9,13,14,8,81,14,14,14,14,14,14,14,14,21,21,21,16,16,16,16,16,16,16,16;/以上状态对应的操作类别char SS14="ss","o","s","s","s","s","ssssss
40、ssssss","s","srsssssssssss","s","s","s","s","r","ss","r","r","r","r","r","r","ssssssssss","ssssss","ssssss","ssssssss&qu
41、ot;,"sr","rr","rrrrrrrr","r","ss","rsr","rrr","ssssss","rrssssr","s","ss","ss","rsrr","rrsrr","rrsrrr","rrrrrr","ssssssss","r
42、rrrrr","rrrrrr","s","rr","s","sssss","ssss","ss","rrr","s","s","s","s","rrr","rrr","rrr","rrr","s","sssssss","
43、ssssss","sssss","ssss","ss","ssssssssssss","rsr","rrr","ssssssssssss","rsrr","rrsrr","rrsrrr","rrrrrr","rrrrrr","s","s","rrrrrrrr","s",
44、"s","ssssssssssss","s","rrrrrrrr","rrr","rrrrrrrr" /状态的个数int cal84=2,1,1,1,1,1,12,1,13,1,1,1,1,1,2,1,1,1,1,1,1,10,6,6,8,2,2,8,1,2,3,3,6,7,1,2,2,4,5,6, 6,8,6,6,1,2,1,5,4,2,3,1,1,1,1,3,3,3,3,1,7,6,5,4,2,12,3,3,12,4,5,6,6,6,1,1,8,1,1,12,1,8,3,
45、8;/以上状态在action和goto中对应的列char Let14='v','Q','$','m','(',')','','i','a','b','c','d','f','w','A', 'C','X','Y','S','','i','',
46、9;a','b','c','d','f','w','A','C','X','Y','S','','(','(','=','','i','Z','i','i','i','i','$','','i','a
47、','b','c','d','f','w','X','Y','S','i','!','(','E','H','G','i','!','(','E','H','G','i','(','n','L','I
48、','K','T','F',',','',',','','i','','a','b','c','d','f','w','','&',')','&','|',')','&','|',')'
49、;,'i','!','(','E','H','G','&','|','<','>','','#',')','i','&',')','+','','+','-','',')','+','-'
50、,'/','',')','+','-','*','/','',')','+','-','*','/','',')','i','(','n','L','I','K','T','F','+','-',
51、39;*','/','',')','+','-','*','/','',')','i',',','','','i','!','(','H','G','i','!','(','G','&',')',
52、39;&','|',')','i','i','i','i','&','|',')','&','|',')','&','|',')','&','|',')','','i','(','n','I&
53、#39;,'K','T','F','i','(','n','K','T','F','i','(','n','T','F','i','(','n','F','+',')','i','a','b','c','d&
54、#39;,'f','w','A','C','X','Y','S','&','|',')','&','|',')','i','a','b','c','d','f','w','A','C','X','Y'
55、,'S','+','-','',')','+','-','/','',')','+','-','*','/','',')','+','-','*','/','',')','+','-','*',
56、9;/','',')','','','i','','a','b','c','d','f','w','e','','i','a','b','c','d','f','w','A','C','X','Y
57、39;,'S','','i','','a','b','c','d','f','w','&','|',')','i','','a','b','c','d','f','w','' /初始化关系表 for(int i=0;i<84;i+)
58、for(int j=0;j<cali;j+)r_new=(Relation *)malloc(sizeof(Relation);if(r_head=NULL)r_find=r_head=r_new;r_new->line_States=i;r_new->rank_Letter=Letij;r_new->relationship=srij;r_new->name=SSij;r_find->next=r_new;r_find=r_new;r_new->next=NULL;return r_head;/=/初始化规则表函数: Guiyue *guiyue()
59、/ 数据传递: g_head返回规则表的头指针 Guiyue *FirstGuiyue() Guiyue *g_head,*g_find,*g_new;g_head=NULL;/规约char root='B','Q','S','A','A','C','C','X','Y','Y','Y','Y','Z','Z','S','S','S&
60、#39;,'E','E','H', 'H','G','G','G','G','G','G','G','L','L','I','I','K','K','T','T','F','F','F' int LR=1,7,3,2,1,3,1,2,1,1,1,1
61、,3,1,11,7,4,3,1,3,1,3,3,3,3,3,2,1,3,1,3,1,3,1,3,1,3,1,1;/初始化规则表for(int i=0;i<39;i+)g_new=(Guiyue *)malloc(sizeof(Guiyue);if(g_head=NULL)g_find=g_head=g_new;g_new->num=i;g_new->count=LRi;g_new->name=rooti;g_find->next=g_new;g_find=g_new;g_new->next=NULL;return g_head;/=/语法分析函数: int
62、ResultAnely(Relation *r_head,Stack *s_head,char str,Guiyue *g_head,int cal) / 数据传递: 1 *r_head:分析表头指针. / 2 *s_head:符号栈头指针. / 3 str :转义字符流. / 4 *g_head:规则表头指针. / 5 cal :转义字符流的长度. int ResultAnely(Relation *r_head,Stack *s_head,char str,Guiyue *g_head,int cal)Relation *r_find;Guiyue *g_find;Stack *s_fin
63、d,*s_look;s_find=s_head;int j,v,admition=1,goon=1,in,out=1,hang=-1,count;char stack200,name;/cout<<"n=显-示-语-法-分-析-过-程-及-结-果="<<endl;/cout<<" LineNum StackData inputSentencen"<<endl;while(goon)/:1int admit=1;r_find=r_head;g_find=g_head;hang+;while(r_find&am
64、p;&admit)/:2if(r_find->line_States=s_find->num&&r_find->rank_Letter=str0&&r_find->name='s')/:入栈s_find=MarkPush(s_find,str0,r_find->relationship);admit=0;for(in=0;in<cal-1;in+)strin=strin+1;strin='0'cal-;r_find=r_find->next;/:入栈if(r_find->line_States=s_find->num&&r_find->rank_Letter=str0&&r_find-&g
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 45235-2025电子电气产品中双酚A的测定高效液相色谱法
- 国内海洋工程船舶维修标准合同范文
- 涂料销售合同协议
- 冷冻仓储设施扩建项目合同书
- 保险代理业务合同管理规定
- Module 10 Unit 2 You shouldn't be late(教学设计)-2024-2025学年外研版(一起)英语五年级上册
- 深圳经济特区建筑工程合同
- 数据中心改造工程承包合同书
- 未来合同样本:维保合同智能化变革之路
- 租期到期商铺租赁合同终止合同模板
- 幼儿园小班健康教案:我会上厕所(课堂PPT)【幼教课件】
- 网络账号信息登记表
- 航空维修工程管理第1章分析课件
- NB∕T 14006-2020 页岩气气田集输工程设计规范
- 新湘科版五年级下册科学教案全册教学设计
- 水土保持各种分级标准表与指标
- 部编版四年级语文下册27《巨人的花园》PPT课件(共2课时)
- 测绘项目收费标准2009
- 社区医院建设标准
- 个人所得税税率表【自动提取税率计算】
- 浙美版小学美术五年级下册课件1画家故居
评论
0/150
提交评论