实验三 LR1分析表语法分析报告Word文件下载.docx

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

实验三 LR1分析表语法分析报告Word文件下载.docx

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

实验三 LR1分析表语法分析报告Word文件下载.docx

实验批改完毕后,任课老师将每门课程的每个实验项目的实验报告以自然班为单位、按学号升序排列,装订成册,并附上一份该门课程的实验大纲。

实验项目名称:

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

四.实验结果与分析

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

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

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

当前位置:首页 > 人文社科 > 设计艺术

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

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