简单C语言编译器(编译原理)
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
}
//======================================================================================================
//词法分析函数: void scan()
//数据传递:形参fp接收指向文本文件头的文件指针;
flag=3;
else if(ch==' ')
flag=4;
else if(ch=='\n')
flag=5;
else if(ch=='?')
flag=6;
else if(feof(fp1))
flag=7;//结束
else
flag=0; //illegal character
return(flag);
else if(strcmp(ft->name,"||")==0){ft->mark_name='|';}
else if(strcmp(ft->name,"!=")==0){ft->mark_name='@';}
if(flag==1||flag==2||flag==3) {i++;buffer[i]=ch;line[i]=row;}
else if(flag==4) {i++;buffer[i]='?';line[i]=row;}
else if(flag==5) {i++;buffer[i]='~';row++;}
{
int flag;
if(ch=='!'||ch=='$'||ch=='&'||ch=='*'||ch=='('||ch==')'||ch=='-'||ch=='_'||
ch=='+'||ch=='='||ch=='|'||ch=='{'||ch=='}'||ch=='['||ch==']'||ch==';'||
news=(struct Word *)malloc(sizeof(struct Word));
ft->next=news;
news->next=NULL;
}//4~
}//3~
}//2~
}//1~
else if(jud==1)
if(buffer[k]=='~') jud=0;
else ;
else if(jud==2)
(buffer[k]=='<'&&buffer[k+1]=='=')||(buffer[k]=='!'&&buffer[k+1]=='=')){
k=k+1;
i=i+1;
printf("%d",i);
news->name[i]=buffer[k];
}
news->name[1+i]='\0';
ft=news;
else{//4~
news->name[i]=buffer[k];
if((buffer[k]=='='&&buffer[k+1]=='=')||(buffer[k]=='&'&&buffer[k+1]=='&')||
(buffer[k]=='|'&&buffer[k+1]=='|')||(buffer[k]=='>'&&buffer[k+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 0
struct Sign *link;
struct Word *next;
};
FILE *fp1;//文件指针
int row=1,line[10000],Lin[300],w_num;//字符行变量、字符行、单词所在行、字符数
char buffer[10000];//字符串缓冲区
Stack *MarkPush(Stack *ip,char mark,int I_i)//压栈
ft->link=s_first;
ft->next=NULL;
//====================================分割单词功能==========================================================
int i=0,k,flag,jud=0;
else if(flag==7) continue;
else cout<<"\n请注意,第"<<row<< "行的"<<ch<<"是非法字符!"<<endl;
}
w_num=i;
/*****************确定单词所在的行*****************/
int one,two,k=0;
for(i=0;i<w_num;i++){
};
struct Relation //分析表结构体:状态序号、对应符号列、操作类型的对应序号、操作类型、连接下一结点指针
{
int line_States ;
char rank_Letter;
int relationship;
char name;
struct Relation *next;
};
struct Sign //符号表结构体:自变量名、标识类型、连接下一结点指针
//全局变量buffer与line对应保存源文件字符及其行号,char_num保存字符总数。
void scan()
{
char ch;
int flag,j=0,i=-1;
while(!feof(fp1))
{
ch=fgetc(fp1);
flag=judge(ch);
printf("%c",ch);//显示打开的文件
struct Stack //栈结构体:序号、内容、连接下一结点指针
{
int num;
char name;
struct Stack *next;
};
struct Guiyue//规则集结构体:序号、规则长度、符号、连接下一结点指针
{
int num;
int count;
char name;
struct Guiyue *next;
ch==':'||ch=='"'||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'))
for(k=0;k<w_num;k++)
{
flag=judge(buffer[k]);
if(jud==0){//1~
if(flag==2||flag==3) {
news->name[i]=buffer[k];
news->name[++i]='\0';
}
else {//2~
i=0;
ft=news;
if(news->name[0]>=33&&news->name[0]<=125){
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';}
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)//接收ch判断字符,变量flag返回字符类别
else if(ft->name[0]>='0'&&ft->name[0]<='9'){ft->mark_name='n';}
else if(ft->name[0]=='+'||ft->name[0]=='-'||ft->name[0]=='*'||ft->name[0]=='/'
||ft->name[0]=='='||ft->name[0]=='<'||ft->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];}
else if(strcmp(ft->name,"&&")==0){ft->mark_name='&';}
news=(struct Word *)malloc(sizeof(struct Word));
ft->next=news;
news->next=NULL;
}
if(flag==1){//3~
if(buffer[k]=='/'&&buffer[k+1]=='/') jud=1;
else if(buffer[k]=='/'&&buffer[k+1]=='*') jud=2;
if(buffer[k]=='*'&&buffer[k+1]=='/') { jud=0; k=k+1;}
else ;
}
if(news->name[0]<33||news->name[0]>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->mark_name='w';}
else if(strcmp(ft->name,"float")==0){ft->mark_name='b';}
else if(strcmp(ft->name,"double")==0){ft->mark_name='d';}
else if(strcmp(ft->name,"char")==0){ft->mark_name='c';}
one=judge(buffer[i]);
two=judge(buffer[i+1]);
if((one!=two&&buffer[i]!='?'&&buffer[i]!='~')||one==1){
Lin[k]=line[i];
k++;
}
}
}
//======================================================================================================
struct Sign *s_first,*s_look;
s_first=s_look=(struct Sign *)malloc(sizeof(struct Sign));
s_first->kind='\0';
s_first->name[0]='\0';
news=head=ft=(struct Word *)malloc(sizeof(struct Word));
{
Stack *s;
s=(Stack *)malloc(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;
//初始化单词表函数: struct Word *InitWord()
//数据传递: head返回单词表的头指针
//======================================================================================================
//词法分析函数: void scan()
//数据传递:形参fp接收指向文本文件头的文件指针;
flag=3;
else if(ch==' ')
flag=4;
else if(ch=='\n')
flag=5;
else if(ch=='?')
flag=6;
else if(feof(fp1))
flag=7;//结束
else
flag=0; //illegal character
return(flag);
else if(strcmp(ft->name,"||")==0){ft->mark_name='|';}
else if(strcmp(ft->name,"!=")==0){ft->mark_name='@';}
if(flag==1||flag==2||flag==3) {i++;buffer[i]=ch;line[i]=row;}
else if(flag==4) {i++;buffer[i]='?';line[i]=row;}
else if(flag==5) {i++;buffer[i]='~';row++;}
{
int flag;
if(ch=='!'||ch=='$'||ch=='&'||ch=='*'||ch=='('||ch==')'||ch=='-'||ch=='_'||
ch=='+'||ch=='='||ch=='|'||ch=='{'||ch=='}'||ch=='['||ch==']'||ch==';'||
news=(struct Word *)malloc(sizeof(struct Word));
ft->next=news;
news->next=NULL;
}//4~
}//3~
}//2~
}//1~
else if(jud==1)
if(buffer[k]=='~') jud=0;
else ;
else if(jud==2)
(buffer[k]=='<'&&buffer[k+1]=='=')||(buffer[k]=='!'&&buffer[k+1]=='=')){
k=k+1;
i=i+1;
printf("%d",i);
news->name[i]=buffer[k];
}
news->name[1+i]='\0';
ft=news;
else{//4~
news->name[i]=buffer[k];
if((buffer[k]=='='&&buffer[k+1]=='=')||(buffer[k]=='&'&&buffer[k+1]=='&')||
(buffer[k]=='|'&&buffer[k+1]=='|')||(buffer[k]=='>'&&buffer[k+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 0
struct Sign *link;
struct Word *next;
};
FILE *fp1;//文件指针
int row=1,line[10000],Lin[300],w_num;//字符行变量、字符行、单词所在行、字符数
char buffer[10000];//字符串缓冲区
Stack *MarkPush(Stack *ip,char mark,int I_i)//压栈
ft->link=s_first;
ft->next=NULL;
//====================================分割单词功能==========================================================
int i=0,k,flag,jud=0;
else if(flag==7) continue;
else cout<<"\n请注意,第"<<row<< "行的"<<ch<<"是非法字符!"<<endl;
}
w_num=i;
/*****************确定单词所在的行*****************/
int one,two,k=0;
for(i=0;i<w_num;i++){
};
struct Relation //分析表结构体:状态序号、对应符号列、操作类型的对应序号、操作类型、连接下一结点指针
{
int line_States ;
char rank_Letter;
int relationship;
char name;
struct Relation *next;
};
struct Sign //符号表结构体:自变量名、标识类型、连接下一结点指针
//全局变量buffer与line对应保存源文件字符及其行号,char_num保存字符总数。
void scan()
{
char ch;
int flag,j=0,i=-1;
while(!feof(fp1))
{
ch=fgetc(fp1);
flag=judge(ch);
printf("%c",ch);//显示打开的文件
struct Stack //栈结构体:序号、内容、连接下一结点指针
{
int num;
char name;
struct Stack *next;
};
struct Guiyue//规则集结构体:序号、规则长度、符号、连接下一结点指针
{
int num;
int count;
char name;
struct Guiyue *next;
ch==':'||ch=='"'||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'))
for(k=0;k<w_num;k++)
{
flag=judge(buffer[k]);
if(jud==0){//1~
if(flag==2||flag==3) {
news->name[i]=buffer[k];
news->name[++i]='\0';
}
else {//2~
i=0;
ft=news;
if(news->name[0]>=33&&news->name[0]<=125){
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';}
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)//接收ch判断字符,变量flag返回字符类别
else if(ft->name[0]>='0'&&ft->name[0]<='9'){ft->mark_name='n';}
else if(ft->name[0]=='+'||ft->name[0]=='-'||ft->name[0]=='*'||ft->name[0]=='/'
||ft->name[0]=='='||ft->name[0]=='<'||ft->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];}
else if(strcmp(ft->name,"&&")==0){ft->mark_name='&';}
news=(struct Word *)malloc(sizeof(struct Word));
ft->next=news;
news->next=NULL;
}
if(flag==1){//3~
if(buffer[k]=='/'&&buffer[k+1]=='/') jud=1;
else if(buffer[k]=='/'&&buffer[k+1]=='*') jud=2;
if(buffer[k]=='*'&&buffer[k+1]=='/') { jud=0; k=k+1;}
else ;
}
if(news->name[0]<33||news->name[0]>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->mark_name='w';}
else if(strcmp(ft->name,"float")==0){ft->mark_name='b';}
else if(strcmp(ft->name,"double")==0){ft->mark_name='d';}
else if(strcmp(ft->name,"char")==0){ft->mark_name='c';}
one=judge(buffer[i]);
two=judge(buffer[i+1]);
if((one!=two&&buffer[i]!='?'&&buffer[i]!='~')||one==1){
Lin[k]=line[i];
k++;
}
}
}
//======================================================================================================
struct Sign *s_first,*s_look;
s_first=s_look=(struct Sign *)malloc(sizeof(struct Sign));
s_first->kind='\0';
s_first->name[0]='\0';
news=head=ft=(struct Word *)malloc(sizeof(struct Word));
{
Stack *s;
s=(Stack *)malloc(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;
//初始化单词表函数: struct Word *InitWord()
//数据传递: head返回单词表的头指针