北邮 编译原理 语法分析.docx
- 文档编号:7283454
- 上传时间:2023-01-22
- 格式:DOCX
- 页数:15
- 大小:83.01KB
北邮 编译原理 语法分析.docx
《北邮 编译原理 语法分析.docx》由会员分享,可在线阅读,更多相关《北邮 编译原理 语法分析.docx(15页珍藏版)》请在冰豆网上搜索。
北邮编译原理语法分析
编译原理
语法分析
班级:
学号:
姓名:
ytinrete
程序设计2
题目:
语法分析程序的设计与实现。
实验内容:
编写语法分析程序,实现对算术表达式的语法分析。
要求所分析算术表达式由如下的文法产生。
实验要求:
在对输入表达式进行分析的过程中,输出所采用的产生式。
方法1:
编写递归调用程序实现自顶向下的分析。
方法2:
编写LL
(1)语法分析程序,要求如下。
(1)编程实现算法4.2,为给定文法自动构造预测分析表。
(2)编程实现算法4.1,构造LL
(1)预测分析程序。
方法3:
编写语法分析程序实现自底向上的分析,要求如下。
(1)构造识别所有活前缀的DFA。
(2)构造LR分析表。
(3)编程实现算法4.3,构造LR分析程序。
方法4:
利用YACC自动生成语法分析程序,调用LEX自动生成的词法分析程序。
方法2:
编写LL
(1)语法分析程序
首先对文法进行处理,预存文法的拓广文法,非终结符的FIRST集和FOLLOW集。
其次编程实现算法4.2,为给定文法自动构造分析表。
最后输入待处理字符串,通过实现的算法4.1,利用分析表分析出字符串,能够接受则返回接受,否则返回错误。
源代码:
#include
#include
#include
#include
#include
#include
#include
usingnamespacestd;
stringoriginal[9]={//保存原文法
"E->E+T","E->E-T","E->T",
"T->T*F","T->T/F","T->F",
"F->i","F->(E)","F->n"
};
stringG[11]={//拓广文法
"E->TA","A->+TA","A->-TA","A->e",
"T->FB","B->*FB","B->/FB","B->e",
"F->(E)","F->i","F->n"
};
stringFIRST[5]={//first集
"E:
(in",//E
"A:
+-e",//A
"T:
(in",//T
"B:
*/e",//B
"F:
(in"//F
};
stringFOLLOW[5]={//follow集
"E:
)$",//E
"A:
)$",//A
"T:
+-)$",//T
"B:
+-)$",//B
"F:
+-*/)$",//F
};
charVN[5]={'E','A','T','B','F'};//存储非终结符
charVT[9]={'i','n','+','-','*','/','(',')','$'};//存储终结符
typedefstructBlock
{
charvn;//非终结符
charvt;//终结符
strings;//产生式
}block;//存储分析预测表每个位置对应的终结符,非终结符,产生式
blocktable[45];//5*9=45
charis_vt(chara)//是否为非终结符,不是返回'x'
{
for(inti=0;i<5;i++)
{
if(a==VN[i])
return'x';
}
if(isalpha(a))//是字母
return'i';
if(isdigit(a))//是数字
return'n';
for(inti=0+2;i<9;i++)
{
if(a==VT[i])
returna;
}
}
intfind_table(charX,chara)//查找是否存在符合的产生式
{
for(inti=0;i<45;i++)
{
if(table[i].vn==X&&table[i].vt==is_vt(a))
if(0!
=table[i].s.size())
returni;
else
return999;//error项
}
return999;
}
voidLL_one(stringtemp)
{
stack
ST.push('$');//初始化压入栈
ST.push('E');
cout<<"栈"<<"输入"<<"输出"< inti=0,j=1;//temp指针 charX; do{ cout< if(j>99) cout<<": "; else if(j>9) cout<<": "; else cout<<": "; //输出 stack chart_char; inti2=ST.size(); for(inti1=0;i1 { t_char=ST.top(); t_ST.push(t_char); ST.pop(); } for(inti1=0;i1 { t_char=t_ST.top(); t_ST.pop(); cout< ST.push(t_char); } for(inti1=0;i1<23-i2;i1++) { cout<<""; } cout<<"|"; for(inti1=0;i1<20-temp.size()+i;i1++) { cout<<""; } for(inti1=i;i1 cout< cout<<""; //开始处理 X=ST.top(); if('$'==X||'x'! =is_vt(X))//是终结符或S { if(temp.at(i)==X||(is_vt(temp.at(i))==X)) { ST.pop(); cout<<"'"< i++; } else { cout< "< return; } } else//是非终结符号 { intt_table=find_table(X,temp.at(i)); if(999! =t_table) { ST.pop();//弹出X intt_i=table[t_table].s.size()-1; cout< //压栈 if('e'! =table[t_table].s.at(t_i))//如果不是->e while(table[t_table].s.at(t_i)! ='>')//压栈 { ST.push(table[t_table].s.at(t_i)); t_i--; } } else { cout< "< return; } } j++; cout< }while('$'! =X); cout< } intmain() { cout<<"1.原文语法为: "< for(inti=0;i<=8;i++) cout< cout< "< for(inti=0;i<=8;i++) cout< cout< "< for(inti=0;i<5;i++) { cout<<"FIRST("< for(intj=2;j { cout< } cout<<"}"< } for(inti=0;i<5;i++) { cout<<"FOLLOW("< for(intj=2;j { cout< } cout<<"}"< } cout< "< //初始化 intt=0; for(inti=0;i<5;i++) for(intj=0;j<9;j++) { table[t].s.clear(); table[t].vn=VN[i]; table[t].vt=VT[j]; t++; } //将产生式添加 stringtemp; chart_a,t_b; for(inti=0;i<11;i++)//11个产生式 { temp.clear(); temp=G[i];//取产生式 t_a=temp.at(0); t_b=temp.at(3); if('e'==t_b)//follow集 { intj; for(j=0;j<5;j++)//取follow集字符 if(t_a==FOLLOW[j].at(0)) break; stringt_follow(FOLLOW[j],2,FOLLOW[j].size()-2); for(j=0;j<45;j++)//遍历整个表 { if(table[j].vn==t_a) { for(intk=0;k { if(table[j].vt==t_follow.at(k)) { table[j].s.clear(); table[j].s=temp; } } } } } else//first集 { boolisvn=false; for(intk=0;k<5;k++) { if(t_b==VN[k]) isvn=true; } if(isvn) { //取first集 intj; for(j=0;j<5;j++)//取follow集字符 if(t_a==FIRST[j].at(0)) break; stringt_first(FIRST[j],2,FIRST[j].size()-2); for(intk=0;k<45;k++) { if(table[k].vn==t_a) { for(intl=0;l { if(table[k].vt==t_first.at(l)) { table[k].s.clear(); table[k].s=temp; } } } } } else { for(intk=0;k<45;k++) { if(table[k].vt==t_b&&table[k].vn==t_a) { table[k].s.clear(); table[k].s=temp; } } } } } //将预测分析表输出 cout<<""; for(inti=0;i<9;i++) { cout<<""< } cout< t=0; for(inti=0;i<5;i++) { cout< "; for(intj=0;j<9;j++) { cout< for(intk=0;k<7-table[t].s.size();k++) cout<<""; t++; } cout< } //实现算法4.1,构造LL (1)预测分析程序 cout< (1)分析字符串"; cout< "; cin>>temp; temp.push_back('$'); LL_one(temp); system("pause"); }运行结果: 1.原文文法,拓广文法 2.FIRST集和FOLLOW集 3分析表 4分析字符串 错误范例((a/-b 错误范例(b)*9)-3 正确输入(a*b+(3/5)-2) 如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。 copyright@ 2008-2022 冰点文档网站版权所有 经营许可证编号:鄂ICP备2022015515号-1