编译原理上机实验转.docx
- 文档编号:8231015
- 上传时间:2023-01-30
- 格式:DOCX
- 页数:43
- 大小:201.13KB
编译原理上机实验转.docx
《编译原理上机实验转.docx》由会员分享,可在线阅读,更多相关《编译原理上机实验转.docx(43页珍藏版)》请在冰豆网上搜索。
编译原理上机实验转
编译原理上机实验报告
小组成员:
王金名、周攀、汪国辉、澎湃、王帅、齐娟娟、刘鸳鸳、秦申学
一、实验目的:
了解简单优先文法分析的基本原理;提高上机实践能力;增强团队协作能力。
二、实验内容:
1.输入或者打开文法;对文法进行处理产生优先关系矩阵和优先函数;
2.根据优先关系矩阵或者优先函数分析任意输入串是否为当前文法的句子,显示分析过程;
3.保存分析结果(包括优先关系矩阵、优先函数、分析过程)。
三、实验原理:
1.根据FIRST和LAST关系的定义产生FIRST和LAST矩阵;
2.根据定义生成±关系矩阵,再由公式生成<和>关系矩阵;
3.合并±、<、>为简单优先关系矩阵;
4.根据±、<、>关系矩阵利用Floyd方法生成优先函数;
5.采用“移进、归约”法判断任意输入串是否是文法的句子。
四、
实验步骤:
1.界面设计
2.添加GClass类并编写代码该类直接通过文法字符串产生优先关系矩阵和优先函数
usingSystem;
usingSystem.Collections;
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
usingSystem.Data;
usingSystem.Drawing;
usingSystem.Text;
usingSystem.Windows.Forms;
namespacePrecedenceRelation
{
[Serializable]
publicclassGClass
{
///
///文法字符串
///
publicstringGrammarStr;
///
///产生式集合
///
publicArrayListProducts;
///
///终结符和非终结符集合
///
publicArrayListPreRelIndexbase;
///
///非终结符集合
///
publicArrayListVN;
///
///终结符集合
///
publicArrayListVT;
///
///优先关系矩阵
///
publicint[,]PreRelMat;
///
///优先函数
///
publicint[,]PrerelFunction;
///
///是否是简单优先文法
///
publicboolisRightGrammar;
///
///内部变量
///
privatestring[]Productions;
privateint[,]FirstMat;
privateint[,]LastMat;
privateint[,]EqualMat;
privateint[,]LowerMat;
privateint[,]LargerMat;
///
///构造函数,通过文法直接生成优先关系矩阵
///
///
publicGClass(stringgrammar)
{
GrammarStr=grammar;
isRightGrammar=true;
if(grammar.IndexOf("||")==-1&&grammar[grammar.Length-1]!
='|')
{
stringdeltrim="";
GrammarStr=GrammarStr.Trim(deltrim.ToCharArray());
string[]stringSeparators=newstring[]{"\n"};
Productions=GrammarStr.Split(stringSeparators,StringSplitOptions.RemoveEmptyEntries);
if(CheckG())
{
Products=ProductionSpilt(Productions);
if(CheckG(Products))
{
GetVN();GetVT();
FirstMat=GetFirst();
LastMat=GetLast();
EqualMat=GetEqual();
LowerMat=MutplyMatrix(EqualMat,WarshallPC(FirstMat));
LargerMat=MutplyMatrix(MutplyMatrix(TranspostionMatrix(WarshallPC(LastMat)),EqualMat),WarshallRC(FirstMat));
PreRelIndexbase=JoinVNVT();
GetPreRelMat();
PrerelFunction=GetPreRelFunction();
}
}
}
else
{
ErrorMessage("文法格式有误,请检查文法常用关键性字符!
\r\n例如:
“|“,“:
”,”=”等特殊字符");
isRightGrammar=false;
}
}
///
///获取优先关系矩阵
///
privatevoidGetPreRelMat()
{
PreRelMat=newint[PreRelIndexbase.Count,PreRelIndexbase.Count];
for(inti=0;i { for(intj=0;j (1);j++) { PreRelMat[i,j]=100; } } for(inti=0;i { for(intj=0;j (1);j++) { if((EqualMat[i,j]==1&&LowerMat[i,j]==1)|| (EqualMat[i,j]==1&&LargerMat[i,j]==1)|| (LowerMat[i,j]==1&&LargerMat[i,j]==1)) { ErrorMessage("此文法非简单优先文法"); isRightGrammar=false; PreRelMat=null; break; } else { if(EqualMat[i,j]==1) { PreRelMat[i,j]=0; } if(LowerMat[i,j]==1) { PreRelMat[i,j]=-1; } if(LargerMat[i,j]==1) { PreRelMat[i,j]=1; } } } if(PreRelMat==null) { break; } } } /// ///生成优先函数 /// /// privateint[,]GetPreRelFunction() { int[,]function=newint[2,PreRelIndexbase.Count]; for(inti=0;i { for(intj=0;j (1);j++) { function[i,j]=1; } } int[,]functionbuf=newint[2,PreRelIndexbase.Count]; do { for(inti=0;i { for(intj=0;j (1);j++) { functionbuf[i,j]=function[i,j]; } } for(inti=0;i { for(intj=0;j (1);j++) { if(LowerMat[i,j]==1&&function[0,i]<=function[1,j]) { function[1,j]=function[0,i]+1; } } } for(inti=0;i { for(intj=0;j (1);j++) { if(LargerMat[i,j]==1&&function[0,i]>=function[1,j]) { function[0,i]=function[1,j]+1; } } } for(inti=0;i { for(intj=0;j (1);j++) { if(EqualMat[i,j]==1&&function[0,i]! =function[1,j]) { if(function[0,i]>function[1,j]) { function[1,j]=function[0,i]; } else { function[0,i]=function[1,j]; } } } } }while(! MatrixEqual(function,functionbuf)); returnfunction; } privateboolMatrixEqual(int[,]function,int[,]functionbuf) { for(inti=0;i { for(intj=0;j (1);j++) { if(functionbuf[i,j]! =function[i,j]) { returnfalse; } } } returntrue; } /// ///拆分产生式 /// /// /// privateArrayListProductionSpilt(string[]productions) { ArrayListsplitproducts=newArrayList(); string[]subproductions; stringpbuf; stringpheadbuf; foreach(stringproductioninproductions) { pbuf=production.Remove(0,4); pheadbuf=production.Remove(4,pbuf.Length); subproductions=pbuf.Split("|".ToCharArray(),StringSplitOptions.RemoveEmptyEntries); foreach(stringsubproductioninsubproductions) { splitproducts.Add(pheadbuf+subproduction); } } returnsplitproducts; } /// ///错误显示 /// /// privatevoidErrorMessage(stringmsg) { MessageBox.Show(msg,"错误提示",MessageBoxButtons.OK,MessageBoxIcon.Exclamation); } /// ///检测文法是否是正确 /// /// /// privateboolCheckG() { intmark=0; foreach(stringproductioninProductions) { if(production.IndexOf(": : =")==-1) { ErrorMessage("文法格式有误,请检查! "); isRightGrammar=false; returnfalse; } elseif(production.IndexOf(": : =")==1) { mark++; } } if(mark==Productions.Length) { returntrue; } else { ErrorMessage("文法格式有误,非终结符只能为单个字符! "); isRightGrammar=false; returnfalse; } } /// ///重载checkG /// /// /// privateboolCheckG(ArrayListarray) { for(inti=0;i { for(intj=0;j { if(i! =j&&array[i].ToString().Remove(0,4)==array[j].ToString().Remove(0,4)) { ErrorMessage("此文法为非简单优先文法! "); isRightGrammar=false; returnfalse; } } } returntrue; } /// ///获取VN /// privatevoidGetVN() { VN=newArrayList(); foreach(stringprodubtioninProductions) { VN.Add(produbtion[0]); } } /// ///获取VT /// privatevoidGetVT() { VT=newArrayList(); foreach(stringproductioninProductions) { stringstrbuf=production.Remove(0,4); foreach(charchinstrbuf) { if(! VT.Contains(ch)&&! VN.Contains(ch)&&ch! ='|') { VT.Add(ch); } } } } privateArrayListJoinVNVT() { ArrayListarray=newArrayList(); array.AddRange(VN); array.AddRange(VT); returnarray; } /// ///获取First关系矩阵 /// /// /// privateint[,]GetFirst() { ArrayListVNVT=JoinVNVT(); intn=VNVT.Count; int[,]FMat=newint[n,n]; inti,j; foreach(stringproductioninProductions) { i=VNVT.IndexOf(production[0]); j=VNVT.IndexOf(production[4]); FMat[i,j]=1; intstartindex=4; while(production.IndexOf('|',startindex)! =-1) { j=VNVT.IndexOf(production[production.IndexOf('|',startindex)+1]); FMat[i,j]=1; startindex=production.IndexOf('|',startindex)+1; } } returnFMat; } /// ///获取Last关系矩阵 /// /// /// privateint[,]GetLast() { ArrayListVNVT=JoinVNVT(); intn=VNVT.Count; int[,]LMat=newint[n,n]; inti,j; foreach(stringproductioninProductions) { i=VN.IndexOf(production[0]); j=VNVT.IndexOf(production[production.Length-1]); LMat[i,j]=1; intstartindex=production.Length-1; while(production.LastIndexOf('|',startindex)! =-1) { j=VNVT.IndexOf(production[production.LastIndexOf('|',startindex)-1]); LMat[i,j]=1; startindex=production.LastIndexOf('|',startindex)-1; } } returnLMat; } /// ///获取+=关系矩阵 /// /// privateint[,]GetEqual() { ArrayListVNVT=JoinVNVT(); intn=VNVT.Count; int[,]EMat=newint[n,n]; inti,j; stringproductionbuf; string[]subproductions; foreach(stringproductioninProductions) { productionbuf=production.Remove(0,4); subproductions=productionbuf.Split("|".ToCharArray(),StringSplitOptions.RemoveEmptyEntries); foreach(stringsubproductioninsubproductions) { if(subproduction.Length>=2) { for(intk=0;k { i=VNVT.IndexOf(subproduction[k]); j=VNVT.IndexOf(subproduction[k+1]); EMat[i,j]=1; } } } } returnEMat; } /// ///Warshall算法,方阵正闭包 /// /// /// privateint[,]WarshallPC(int[,]matrix) { int[,]mat=matrix; intn=mat.GetLength(0); for(inti=0;i { for(intj=0;j { if(mat[j,i]==1) { for(intk=0;k { if(mat[i,k]==1) { mat[j,k]=1;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 上机 实验