简单c语言编译器(编译原理),简单c语言编译器(编译原理).doc

41528d3028836879cd698677c3999917.gif简单c语言编译器(编译原理).doc

#include#include#include#include#include#include#include#include#defineNULL0structStack//栈结构体:序号、内容、连接下一结点指针{intnum;charname;structStack*next;};structGuiyue//规则集结构体:序号、规则长度、符号、连接下一结点指针{intnum;intcount;charname;structGuiyue*next;};structRelation//分析表结构体:状态序号、对应符号列、操作类型的对应序号、操作类型、连接下一结点指针{intline_States;charrank_Letter;intrelationship;charname;structRelation*next;};structSign//符号表结构体:自变量名、标识类型、连接下一结点指针{charname[20];charkind;structSign*next;};structWord//单词表结构体:单词名字、标识类型、状态、序号、行号、连接符号表指针、连接下一结点指针{charname[20];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->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== ! ||ch== $ ||ch== ||ch== : ||ch== “ ||ch== ||ch== . ||ch== / ||ch== \ )flag=1;elseif( 0 kind= \0 ;s_first->name[0]= \0 ;news=head=ft=(structWord*)malloc(sizeof(structWord));ft->link=s_first;ft->next=NULL;//====================================分割单词功能==========================================================inti=0,k,flag,jud=0;for(k=0;kname[i]=buffer[k];news->name[++i]= \0 ;}else{//2~i=0;ft=news;if(news->name[0]>=33news->next=NULL;}if(flag==1){//3~if(buffer[k]== / elseif(buffer[k]== / else{//4~news->name[i]=buffer[k];if((buffer[k]== = }news->name[1+i]= \0 ;ft=news;news=(structWord*)malloc(sizeof(structWord));ft->next=news;news->next=NULL;}//4~}//3~}//2~}//1~elseif(jud==1)if(buffer[k]== ~ )jud=0;else;elseif(jud==2)if(buffer[k]== * }else;}if(news->name[0]name[0]>125)ft->next=NULL;/*******************单词转换成标识符*******************/ft=head;while(ft){if(strcmp(ft->name,“main“)==0){ft->mark_name= m ;}elseif(strcmp(ft->name,“void“)==0){ft->mark_name= v ;}elseif(strcmp(ft->name,“while“)==0){ft->mark_name= w ;}elseif(strcmp(ft->name,“if“)==0){ft->mark_name= f ;}elseif(strcmp(ft->name,“else“)==0){ft->mark_name= e ;}elseif(strcmp(ft->name,“int“)==0){ft->mark_name= a ;}elseif(strcmp(ft->name,“float“)==0){ft->mark_name= b ;}elseif(strcmp(ft->name,“double“)==0){ft->mark_name= d ;}elseif(strcmp(ft->name,“char“)==0){ft->mark_name= c ;}elseif(ft->name[0]>= 0 }elseif(ft->name[0]== + ||ft->name[0]== - ||ft->name[0]== * ||ft->name[0]== / ||ft->name[0]== = ||ft->name[0]== name[0]== > ||ft->name[0]== , ||ft->name[0]== ; ||ft->name[0]== ( ||ft->name[0]== ) ||ft->name[0]== { ||ft->name[0]== } ){ft->mark_name=ft->name[0];}elseif(strcmp(ft->na

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值