实验三 LR1分析表语法分析报告Word文件下载.docx
《实验三 LR1分析表语法分析报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《实验三 LR1分析表语法分析报告Word文件下载.docx(15页珍藏版)》请在冰豆网上搜索。
实验批改完毕后,任课老师将每门课程的每个实验项目的实验报告以自然班为单位、按学号升序排列,装订成册,并附上一份该门课程的实验大纲。
实验项目名称:
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
F
S4
S5
1
2
3
S6
Acc
R2
S7
R4
4
8
5
R6
6
9
7
10
S11
R1
R3
11
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
lengh.txt"
uu=0;
lengh[uu]=Convert.ToInt32(subString);
}while(strBufferStart!
//****************************
//读入文件,进行语法分析
//
stringstrReadFile;
strReadFile="
input.txt"
myTextRead.myStreamReader=newStreamReader(strReadFile);
stringstrBufferText;
intwid=0;
分析读入程序(记号ID):
\n"
{
strBufferText=myTextRead.myStreamReader.ReadLine();
if(strBufferText==null)
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("
}while(strBufferText!
wordNum[wid]=5;
//*********************************
//读入LR分析表
//***********************************
stringstrLR;
strLR="
LR-table.txt"
myTextRead.myStreamReader=newStreamReader(strLR);
stringstrBufferLR;
intpp=0;
strBufferLR=myTextRead.myStreamReader.ReadLine();
if(strBufferLR==null)
else
intj=0;
foreach(StringsubStringinstrBufferLR.Split())
intlllr=Convert.ToInt16(subString);
LR[pp,j]=lllr;
//把行与列读入数组
j++;
pp++;
while(strBufferLR!
int[]state=newint[100];
string[]symbol=newstring[100];
state[0]=0;
symbol[0]="
#"
intp1=0;
intp2=0;
\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)
if(k==2)
if(k==3)
if(k==4)
其它错误!
Console.WriteLine("
\n检测结果:
代码中存在语法错误"
错误状况:
错误状态编号为"
+j+"
读头下符号为"
+error);
if(t==-100)//-100为达到接受状态
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("
代码中有语法错误"
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;
-----------------------------语法分析结束---------------------------------\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;
示例:
输入”(i+i)*i”字符串,分析如下图所示:
输入”i+i”字符串,分析如下图所示:
四.实验结果与分析
从这次语法分析实验中,我感到语法分析的过程要比之前的词法分析实验复杂的多,其中涉及到文法规则,自顶向下分析方法和许多编程的细节问题,有一处不正确,语法分析便不能成功。
通过这次的语法分析实验,我对如何将文法规则转换为实际的程序代码有了进一步的认识,并且对语法分析过程有了更深入的认识。