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

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{
int num;
char name;
struct Stack *next;
};
struct Guiyue//规则集结构体:序号、规则长度、符号、连接下一结点指针
{
int num;
int count;
char name;
struct Guiyue *next;
};
struct Relation //分析表结构体:状态序号、对应符号列、操作类型的对应序号、操作类型、连接下一结点指针
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语句串分析示意图
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;
goon=0;
cout<<"\nInput Flow Error !"<<endl;
return(0);
}
}
cout<<"\n****************************************\n"<<endl;
}
数据结构
struct Stack //栈结构体:序号、内容、连接下一结点指针

图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,int cal)
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'){//:规约
{
int line_States ;
char rank_Letter;
int relationship;
char name;
struct Relation *next;
};
struct Sign //符号表结构体:自变量名、标识类型、连接下一结点指针
{
char name[20];
char kind;
struct Word *next;
};
cout<<endl<<"===================语法分析==================="<<endl;
Relation *r_find;
Guiyue *g_find;
Stack *s_find,*s_look;
s_find=s_head;
int j,v,admition=1,goon=1,in,out=1,hang=-1,count;
struct Sign *next;
};
struct Word //单词表结构体:单词名字、标识类型、状态、序号、行号、连接符号表指针、连接下一结点指针
{
char name[20];
char mark_name;
int state;
int num;
int line;
struct Sign *link;
//数据传递: 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){
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'){//:入栈
}
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);
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<<" ";
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++;}
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;
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;
cout<<endl;
}
if(admit==1)
{ //判断输入流是否正确,如在分析表中找不到关系,则输入流错误
//数据传递:形参fp接收指向文本文件头的文件指针;
//全局变量buffer与line对应保存源文件字符及其行号,char_num保存字符总数。
void scan()
{
char ch;
int flag,j=0,i=-1;
while(!feof(fp1))
{
ch=fgetc(fp1);
flag=judge(ch);
词法分析
三、词法分析程序的算法思想:
算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。
3.1主程序示意图:


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

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


词法分析程序的C语言程序源代码:
//词法分析函数: void scan()
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++){
相关文档
最新文档