当前位置:文档之家› 编译原理词法分析和语法分析报告 代码(C语言版)

编译原理词法分析和语法分析报告 代码(C语言版)

s_find=MarkPush(s_find,str[0],r_find->relationship);
admit=0;
for(in=0;in<cal-1;in++){str[in]=str[in+1];}
str[in]='\0';
cal--;
r_find=r_find->next;
}//:入栈~
if(r_find->line_States==s_find->num&&r_find->rank_Letter==str[0]&&r_find->name=='r'){//:规约
词法分析
三、词法分析程序的算法思想:
算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。
3.1主程序示意图:


扫描子程序主要部分流程图
是是

字母
数字其他
运算符、符号
界符等符号


词法分析程序的C语言程序源代码:
//词法分析函数: void scan()
//数据传递:形参fp接收指向文本文件头的文件指针;
//全局变量buffer与line对应保存源文件字符及其行号,char_num保存字符总数。
void scan()
{
char ch;
int flag,j=0,i=-1;
while(!feof(fp1))
{
ch=fgetc(fp1);
flag=judge(ch);
struct Sign *next;
};
struct Word //单词表结构体:单词名字、标识类型、状态、序号、行号、连接符号表指针、连接下一结点指针
{
char name[20];
char mark_name;
int state;
int num;
int line;
struct Sign *link;
a=0;
}
r_find=r_find->next;
}
}//:规约~
if(r_find->line_States==s_find->num&&r_find->rank_Letter==str[0]&&r_find->name=='o'){//:2判断运算结束
admit=0;
goon=0;
out=0;
cout<<"\nSuccession !"<<endl;
while(goon){//:1
int admit=1;
r_find=r_head;
g_find=g_head;
hang++;
while(r_find&&admit){//:2
if(r_find->line_States==s_find->num&&r_find->rank_Letter==str[0]&&r_find->name=='s'){//:入栈
struct Word *next;
};
one=judge(buffer[i]);
two=judge(buffer[i+1]);
if((one!=two&&buffer[i]!='?'&&buffer[i]!='~')||one==1){
Lin[k]=line[i];
k++;
}
}
}
语法分析
图2-1语法分析主程序示意图







图2-3语句串分析示意图
printf("%c",ch);//显示打开的文件
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++;}
g_find=g_head;
int g=r_find->relationship;
while(g) {g_find=g_find->next;g--; }
name=g_find->name;
count=g_find->count;
admit=0;
for(int k=0;k<count;k++){
MarkPop(s_find);
char stack[200],name;
//cout<<"\n===================显--示--语--法--分--析--过--程--及--结--果==================="<<endl;
//cout<<" LineNum StackData inputSentence\n"<<endl;
return(1);
}
r_find=r_find->next;
}//:2~
if(out==1)//显示语法分析结果
{
s_look=s_find;
v=0;
while(s_look)
{
stack[v]=s_look->name;
s_look=s_look->next;
v++;
}
cout<<setw(17)<<hang<<" ";
{
int line_States ;
char rank_Letter;
int relationship;
char name;
struct Relation *next;
};
struct Sign //符号表结构体:自变量名、标识类型、连接下一结点指针
{
char name[20];
char kind;
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++){

图2-2递归下降分析程序示意图


否是
图2-4 statement语句分析函数示意图图2-5 expression表达式分析函数示意图

否否





图2-6 term分析函数示意图


图2-7 factor分析过程示意图
语法分析程序的C语言程序源代码:
//语法分析函数: int ResultAnely(Relation *r_head,Stack *s_head,char str[],Guiyue *g_head,inபைடு நூலகம் cal)
{
int num;
char name;
struct Stack *next;
};
struct Guiyue//规则集结构体:序号、规则长度、符号、连接下一结点指针
{
int num;
int count;
char name;
struct Guiyue *next;
};
struct Relation //分析表结构体:状态序号、对应符号列、操作类型的对应序号、操作类型、连接下一结点指针
goon=0;
cout<<"\nInput Flow Error !"<<endl;
return(0);
}
}
cout<<"\n****************************************\n"<<endl;
}
数据结构
struct Stack //栈结构体:序号、内容、连接下一结点指针
}
r_find=r_head;
int a=1;
while(r_find&&a){
if(r_find->line_States==s_find->num && r_find->rank_Letter==name){
s_find=MarkPush(s_find,name,r_find->relationship);
for(j=v-1;j>=0;j--)
{
cout<<stack[j];
if(stack[j]=='i'){v++;}
}
for(j=0;j<10-v;j++){cout<<" ";}
cout<<" "<<str;
相关主题