欢迎来到天天文库
浏览记录
ID:26154200
大小:93.00 KB
页数:26页
时间:2018-11-25
《简单c语言编译器(编译原理)》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、WORD格式可编辑#include#include#include#include#include#include#include#include#defineNULL0structStack//栈结构体:序号、内容、连接下一结点指针{intnum;charname;structStack*next;};structGuiyue//规则集结构体:序号、规则长度、符号、连接下一结点指针{intnum;intcount;
2、charname;structGuiyue*next;};structRelation//分析表结构体:状态序号、对应符号列、操作类型的对应序号、操作类型、连接下一结点指针{intline_States;charrank_Letter;intrelationship;charname;structRelation*next;};structSign//符号表结构体:自变量名、标识类型、连接下一结点指针{charname[20];charkind;structSign*next;};structWord//单词表结构体:单词名字、标识类型、状态、序号、行号、连接符号表指针、连接
3、下一结点指针{charname[20];专业技术分享WORD格式可编辑charmark_name;intstate;intnum;intline;structSign*link;structWord*next;};FILE*fp1;//文件指针introw=1,line[10000],Lin[300],w_num;//字符行变量、字符行、单词所在行、字符数charbuffer[10000];//字符串缓冲区Stack*MarkPush(Stack*ip,charmark,intI_i)//压栈{Stack*s;s=(Stack*)malloc(sizeof(Stack));s
4、->name=mark;s->num=I_i;s->next=ip;ip=s;returnip;}voidMarkPop(Stack*ip)//出栈{Stack*q;charname;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);}}intjudge(charch)//接收ch判断字符,变量flag返回字符类别{intflag;if(ch=='!'
5、
6、ch=='$'
7、
8、ch=='&
9、'
10、
11、ch=='*'
12、
13、ch=='('
14、
15、ch==')'
16、
17、ch=='-'
18、
19、ch=='_'
20、
21、ch=='+'
22、
23、ch=='='
24、
25、ch=='
26、'
27、
28、ch=='{'
29、
30、ch=='}'
31、
32、ch=='['
33、
34、ch==']'
35、
36、ch==';'
37、
38、ch==':'
39、
40、ch=='"'
41、
42、ch=='<'
43、
44、ch==','
45、
46、ch=='>'
47、
48、ch=='.'
49、
50、ch=='/'
51、
52、ch==''')flag=1;elseif('0'<=ch&&ch<='9')专业技术分享WORD格式可编辑flag=2;elseif(('a'<=ch&&ch<='z')
53、
54、('A'<=ch&&ch<='Z'))
55、flag=3;elseif(ch=='')flag=4;elseif(ch=='')flag=5;elseif(ch=='?')flag=6;elseif(feof(fp1))flag=7;//结束elseflag=0;//illegalcharacterreturn(flag);}//======================================================================================================//词法分析函数:voidscan()//数据传递:形参fp接收指向文本文件头的文件指
56、针;//全局变量buffer与line对应保存源文件字符及其行号,char_num保存字符总数。voidscan(){charch;intflag,j=0,i=-1;while(!feof(fp1)){ch=fgetc(fp1);flag=judge(ch);printf("%c",ch);//显示打开的文件if(flag==1
57、
58、flag==2
59、
60、flag==3){i++;buffer[i]=ch;line[i]=row;}elseif(flag==4){i++;buffer[i]='?';line[
此文档下载收益归作者所有