实验三 LR1分析表语法分析报告.docx
《实验三 LR1分析表语法分析报告.docx》由会员分享,可在线阅读,更多相关《实验三 LR1分析表语法分析报告.docx(15页珍藏版)》请在冰豆网上搜索。
![实验三 LR1分析表语法分析报告.docx](https://file1.bdocx.com/fileroot1/2022-12/11/fb918a92-fdfa-4967-bae1-d3caf11d482b/fb918a92-fdfa-4967-bae1-d3caf11d482b1.gif)
实验三LR1分析表语法分析报告
学生实验报告
(理工类)
课程名称:
编译原理专业班级:
08计算机科学与技术(单)本
所属院部:
信息技术学院指导教师:
洪蕾
2010——2011学年第二学期
金陵科技学院教务处制
实验报告书写要求
实验报告原则上要求学生手写,要求书写工整。
若因课程特点需打印的,要遵照以下字体、字号、间距等的具体要求。
纸张一律采用A4的纸张。
实验报告书写说明
实验报告中一至四项内容为必填项,包括实验目的和要求;实验仪器和设备;实验内容与过程;实验结果与分析。
各院部可根据学科特点和实验具体要求增加项目。
填写注意事项
(1)细致观察,及时、准确、如实记录。
(2)准确说明,层次清晰。
(3)尽量采用专用术语来说明事物。
(4)外文、符号、公式要准确,应使用统一规定的名词和符号。
(5)应独立完成实验报告的书写,严禁抄袭、复印,一经发现,以零分论处。
实验报告批改说明
实验报告的批改要及时、认真、仔细,一律用红色笔批改。
实验报告的批改成绩采用百分制,具体评分标准由各院部自行制定。
实验报告装订要求
实验批改完毕后,任课老师将每门课程的每个实验项目的实验报告以自然班为单位、按学号升序排列,装订成册,并附上一份该门课程的实验大纲。
实验项目名称:
LR
(1)分析表语法分析实验学时:
6
同组学生姓名:
无实验地点:
B513
实验日期:
2011.4.7/4.21实验成绩:
批改教师:
批改时间:
一、实验目的和要求
语法分析主要目的是按照程序语言的语法规则,从由词法分析输出的源程序符号串中识别出各类语法成分,同时进行语法检查,为语义分析和代码生成作准备.语法分析程序在分析过程中检查符号串是否为该程序的句子.若是则输出该句子的分析树,否则就表示源程序存在语法错误,并报告错误的性质与位置.
二、实验仪器和设备
主机一台:
有VisualStudio2005工具
三、实验过程
说明:
此程序共有两个类,Lexical进行词法分析,Syntax进行语法分析.对于语法分析,采用LR
(1)分析法,判断程序是否满足规定的结构.
1:
LR-table.txt:
存放分析表,其中正数表示移进,负数表示归约,100表示接受状态,0表示不操作。
2:
grammar.txt存放文法开始符号
3:
lengh.txt存放产生式右部字符长度
4:
inpur.txt输入的程序
语法规则:
定义的文法,如下:
(1)Z---E
(2)E---E+T
(3)E---->T
(4)T---T*F
(5)T---F
(6)F---{E}
(7)F---i
根据上面文法画出的分层有限自动机并根据分层自动机构造的LR
(1)分析表:
+
*
(
)
I
#
E
T
F
0
S4
S5
1
2
3
1
S6
Acc
2
R2
S7
R2
R2
3
R4
R4
R4
R4
4
S4
S5
8
2
3
5
R6
R6
R6
R6
6
S4
S5
9
3
7
S4
S5
10
8
S6
S11
9
R1
S7
R1
R1
10
R3
R3
R3
R3
11
R5
R5
R5
R5
语法分析的核心代码和注释如下:
usingSystem;
usingSystem.Text;
usingSystem.IO;
namespaceSyntax_Analyzer
{
classSyntax
{
StreamReadermyStreamReader;
intt;
int[]lengh;
intl=0;
string[]grammar;
ints=0;
string[]Word;
intw=0;
int[]wordNum;
intn=0;
int[,]LR;
publicSyntax()
{
lengh=newint[7];
grammar=newstring[7];
Word=newstring[100];
wordNum=newint[100];
LR=newint[30,30];
}
publicvoidanalyzer()
{
//读入grammar
SyntaxmyTextRead=newSyntax();
Console.WriteLine("-----------------------------语法分析开始---------------------------------\n");
//***************************
//循环读取文法
//***************************
stringstrStart;
strStart="grammar.txt";
myTextRead.myStreamReader=newStreamReader(strStart);
stringstrBufferStart;
intuu=0;
do
{
strBufferStart=myTextRead.myStreamReader.ReadLine();
if(strBufferStart==null)
break;
foreach(StringsubStringinstrBufferStart.Split())
{
grammar[uu]=subString;//每行文法存入grammar[]
uu++;
}
}
while(strBufferStart!
=null);
myTextRead.myStreamReader.Close();
//***************************
//循环读取lengh
//***************************
strStart="lengh.txt";
myTextRead.myStreamReader=newStreamReader(strStart);
uu=0;
do
{
strBufferStart=myTextRead.myStreamReader.ReadLine();
if(strBufferStart==null)
break;
foreach(StringsubStringinstrBufferStart.Split())
{
lengh[uu]=Convert.ToInt32(subString);//每行文法存入grammar[]
uu++;
}
}while(strBufferStart!
=null);
myTextRead.myStreamReader.Close();
//****************************
//读入文件,进行语法分析
//
//****************************
stringstrReadFile;
strReadFile="input.txt";
myTextRead.myStreamReader=newStreamReader(strReadFile);
stringstrBufferText;
intwid=0;
Console.WriteLine("分析读入程序(记号ID):
\n");
do
{
strBufferText=myTextRead.myStreamReader.ReadLine();
if(strBufferText==null)
break;
foreach(StringsubStringinstrBufferText.Split())
{
if(subString!
="")
{
intll;
if(subString!
=null)
{
ll=subString.Length;//每一个长度
}
else
{
break;
}
inta=ll+1;
char[]b=newchar[a];
StringReadersr=newStringReader(subString);
sr.Read(b,0,ll);//把substring读到char[]数组里
intsort=(int)b[0];
//word[i]和wordNum[i]对应
//先识别出一整个串,再根据开头识别是数字还是字母
Word[wid]=subString;
if(subString.Equals("+"))
{wordNum[wid]=0;}
else
{
if(subString.Equals("*"))
{wordNum[wid]=1;}
else
{
if(subString.Equals("("))
{wordNum[wid]=2;}
else
{
if(subString.Equals(")"))
{wordNum[wid]=3;}
else
{
if(subString.Equals("i"))
{wordNum[wid]=4;}
}
}
}
}
Console.Write(subString+"("+wordNum[wid]+")"+"");
wid++;
}
}
Console.WriteLine("\n");
}while(strBufferText!
=null);
wordNum[wid]=5;
myTextRead.myStreamReader.Close();
//*********************************
//读入LR分析表
//
//***********************************
stringstrLR;
strLR="LR-table.txt";
myTextRead.myStreamReader=newStreamReader(strLR);
stringstrBufferLR;
intpp=0;
do
{
strBufferLR=myTextRead.myStreamReader.ReadLine();
if(strBufferLR==null)
break;
else
{
intj=0;
foreach(StringsubStringinstrBufferLR.Split())
{
if(subString!
=null)
{
intlllr=Convert.ToInt16(subString);
LR[pp,j]=lllr;//把行与列读入数组
j++;
}
}
}
pp++;
}
while(strBufferLR!
=null);
myTextRead.myStreamReader.Close();
int[]state=newint[100];
string[]symbol=newstring[100];
state[0]=0;
symbol[0]="#";
intp1=0;
intp2=0;
Console.WriteLine("\n按文法规则归约顺序如下:
\n");
//***************
//归约算法
//***************
while(true)
{
intj,k;
j=state[p2];
k=wordNum[p1];
t=LR[j,k];//当出现t为的时候
if(t==0)
{
//错误类型
stringerror="";
if(k==0)
error="+";
else
if(k==1)
error="*";
else
if(k==2)
error="(";
else
if(k==3)
error=")";
else
if(k==4)
error="i";
else
error="其它错误!
";
Console.WriteLine("\n检测结果:
");
Console.WriteLine("代码中存在语法错误");
Console.WriteLine("错误状况:
错误状态编号为"+j+"读头下符号为"+error);
break;
}
else
{
if(t==-100)//-100为达到接受状态
{
Console.WriteLine("\n");
Console.WriteLine("\n检测结果:
");
Console.WriteLine("代码通过语法检测");
break;
}
if(t<0&&t!
=-100)//归约
{
stringm=grammar[-t];
Console.Write(m+"");//输出开始符
intlength=lengh[-t];
p2=p2-(length-1);
SearchmySearch=newSearch();
intright=mySearch.search(m);
if(right==0)
{
Console.WriteLine("\n");
Console.WriteLine("代码中有语法错误");
break;
}
inta=state[p2-1];
intLRresult=LR[a,right];
state[p2]=LRresult;
symbol[p2]=m;
}
if(t>0)
{
p2=p2+1;
state[p2]=t;
symbol[p2]=Convert.ToString(wordNum[p1]);
p1=p1+1;
}
}
}
myTextRead.myStreamReader.Close();
Console.WriteLine("-----------------------------语法分析结束---------------------------------\n");
Console.Read();
}
}
classSearch
{
publicintsearch(stringx)
{
string[]mysymbol=newstring[3];
mysymbol[0]="E";
mysymbol[1]="T";
mysymbol[2]="F";
intr=0;
for(ints=0;s<=2;s++)
{
if(mysymbol[s].Equals(x))
r=s+6;
}
returnr;
}
}
}
示例:
1:
输入”(i+i)*i”字符串,分析如下图所示:
2:
输入”i+i”字符串,分析如下图所示:
四.实验结果与分析
从这次语法分析实验中,我感到语法分析的过程要比之前的词法分析实验复杂的多,其中涉及到文法规则,自顶向下分析方法和许多编程的细节问题,有一处不正确,语法分析便不能成功。
通过这次的语法分析实验,我对如何将文法规则转换为实际的程序代码有了进一步的认识,并且对语法分析过程有了更深入的认识。