实验三 LR1分析表语法分析报告.docx

上传人:b****3 文档编号:4940524 上传时间:2022-12-11 格式:DOCX 页数:15 大小:79.23KB
下载 相关 举报
实验三 LR1分析表语法分析报告.docx_第1页
第1页 / 共15页
实验三 LR1分析表语法分析报告.docx_第2页
第2页 / 共15页
实验三 LR1分析表语法分析报告.docx_第3页
第3页 / 共15页
实验三 LR1分析表语法分析报告.docx_第4页
第4页 / 共15页
实验三 LR1分析表语法分析报告.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

实验三 LR1分析表语法分析报告.docx

《实验三 LR1分析表语法分析报告.docx》由会员分享,可在线阅读,更多相关《实验三 LR1分析表语法分析报告.docx(15页珍藏版)》请在冰豆网上搜索。

实验三 LR1分析表语法分析报告.docx

实验三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”字符串,分析如下图所示:

四.实验结果与分析

从这次语法分析实验中,我感到语法分析的过程要比之前的词法分析实验复杂的多,其中涉及到文法规则,自顶向下分析方法和许多编程的细节问题,有一处不正确,语法分析便不能成功。

通过这次的语法分析实验,我对如何将文法规则转换为实际的程序代码有了进一步的认识,并且对语法分析过程有了更深入的认识。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1