实验二--语法分析-
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验二--语法分析(算符优先)-(2)
编译原理实验报告实验名称:语法分析器设计
专业:计算机科学与技术
姓名:田莉莉
学号:201117906
语法分析—算符优先分析程序
一.实验要求
⑴ 选择最有代表性的语法分析方法,如算符优先法、递归子程序法或LR 分析法
⑵ 选择对各种常见程序语言都用的语法结构,如赋值语句(尤指表达式)作为分析对象,并且与所选语法分析方法要比较贴切。
⑶ 实习时间为6 学时。
二.实验内容及要求
( 1)根据给定文法,先求出 FirstVt 和 LastVt 集合,构造算符优先关系表(要求算符优先关系表输出到屏幕或者输出到文件);
( 2)根据算法和优先关系表分析给定表达式是否是该文法识别的正确的算术表达式(要求输出归约过程)
(3)给定表达式文法为:
G(E ' ): E'T #E#
E—E+T | T
T—T*F |F
F—(E)|i
(4)分析的句子为 :
(i+i)*i 和 i+i)*i
三.程序设计思想及实现步骤
程序的设计思想:
按照编译原理教材提供的算法,本程序的设计主要实现三个主要的过程:
(1) 求解 FristVT 集和 LastVT 集:利用 CString 数组存放 VT 集,利用数组
下标对应非终结符关系;
(2) 输出算符优先分析表:利用 MFC 中的 ClistCtrl 控件输出显示算符表, 比
利用二维数组对应其在内存中的关系。
(3) 利用算符优先分析表进行归约:根据教材所给算法,并对其进行实现在 屏幕上输
出归约过程。
实现步骤:
1、为程序各变量设计存储形式,具体设计如下所示:
CString m_strTElem[T_LEN]; CString m_strNTElem[NT_LEN];
// 非终结符
CMapStringToPtr m_mapProdu; // 存放产生式 CMapStringToPtr m_mapProduEX; // 存放 扩展产生式 CString m_strFristVT[NT_LEN]; CString m_strLastVT[NT_LEN];
int m_nPriSheet[T_LEN+1][T_LEN+1];
// 终结符 //fristVT 集 //lastVT 集
大表示空白
1 表示小于
0 表示相等
1 表示
Find m_F[STACK_LEN]; //bool
2、为程序设计各个过程,具体设计如下所示:
void CreateFristVT(Find* F); 建 FristVT 集
void CreateLastVT(Find* F); 建 LastVT 集
void SearchPForFirtVT(Find& f); P->Qa ….的产生式
void SearchQForFristVT(void); 生式
void SearchPForLastVT(Find& f); P->...a 的产生式
void SearchQForLastVT(void); 生式
OnBnClickedBtnAnasysic();
3、对各个过程进行实现;
4、调试运行并检验实验结果,结果如图 2.1和 2.2所示:
CStrack m_stack; // 堆栈
大 于 数组
// 为每一个非终
// 为每一个非终 // 搜索形如 P // 搜索形如 P->..
// 搜索形如 P-> // 搜索形如 P->..
图2.1 分析成功图
内GrarTiinarA
Bailys £
井忻旬子
图2.2 分析失败图四.程序源码
产生式初始化:
// 产生式
CString* str = new CString;
*str = _T("|E+T|T|");
m_mapProdu.SetAt(_T("E"),(void*)str); CString* str1 = new CString;
*str1 = _T("|T*F|F|");
m_mapProdu.SetAt(_T("T"),(void*)str1); CString* str2 = new CString ;
*str2 = _T("|(E)|i|");
m_mapProdu.SetAt(_T("F"),(void*)str2); CString* str3 = new CString;
*str3 = _T("|E+T|F+F|F*F|E+F|T|F|");
m_mapProduEX.SetAt(_T("E"),(void*)str3); CString* str4 = new CString;
*str4 = _T("|T*F|F|");
m_mapProduEX.SetAt(_T("T"),(void*)str4); CString* str5 = new CString ;
*str5 = _T("|(E)|i|(F)|");
m_mapProduEX.SetAt(_T("F"),(void*)str5); 程序主要代码:
void CGrammarAnalysisDlg::InitFind(void)
{
int i,j;
int k = 0;
while(k { for(i=0;i m_F[k].m_strNTerm = m_strNTElem[i]; m_F[k].m_strTerm = m_strTElem[j]; m_F[k].m_bIsVT = FALSE; k++; } } } // 查找P->a... 和P->Qa... void CGrammarAnalysisDlg::SearchPForFirtVT(Find& f) { CString* str; m_mapProdu.Lookup(f.m_strNTerm,(void*&)str); int nFrist = 0; int nLen = 0; while(nLen+1 < str->GetLength())// P->a... P 和P->Qa. { nFrist = nLen; nLen = str->Find('|',nFrist+1); CString strProduce = str->Mid(nFrist+1,nLen-nFrist-1); if(IsNT(strProduce,0) && IsT(strProduce,1)) { if(strProduce.GetAt(1) == f.m_strTerm) { if(!f.m_bIsVT) { f.m_bIsVT = TRUE; //CreateFristVT(f); m_stack.PushStack(f); } } } if(IsT(strProduce,0)) { if(strProduce.GetAt(0) == f.m_strTerm) { if(!f.m_bIsVT) { f.m_bIsVT = TRUE;