LR0语法分析.docx

上传人:b****0 文档编号:12831531 上传时间:2023-04-22 格式:DOCX 页数:18 大小:213.12KB
下载 相关 举报
LR0语法分析.docx_第1页
第1页 / 共18页
LR0语法分析.docx_第2页
第2页 / 共18页
LR0语法分析.docx_第3页
第3页 / 共18页
LR0语法分析.docx_第4页
第4页 / 共18页
LR0语法分析.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

LR0语法分析.docx

《LR0语法分析.docx》由会员分享,可在线阅读,更多相关《LR0语法分析.docx(18页珍藏版)》请在冰豆网上搜索。

LR0语法分析.docx

LR0语法分析

编译原理课程设计报告

选题名称:

LR(O)语法分析

系(院):

计算机工程学院

专业:

计算机科学与技术

班级:

计算机1075(单招)

姓名:

赵俊丽学号:

14

指导老师:

于长辉王文豪高丽夏森

学年学期:

2009〜2010学年第2学期

设计任务书

课题名称

LR(O)语法分析

设计目的

LR(O)分析法是一种移进-规约过程,能根据当前分析栈中的符号串,同时也不用向右查看输入吊的符号就可唯一确定分析器的动作。

通过对给定的文法构造LR(O)分析表和实现某个符号串的分析掌握LR(O)分析法的基本思想。

¥

WindowsXP操作系统,VisualO+以上编译环境

任务要求

1•录入合法的LR(0)文法

2.构造并输出LR(0)分析表

3.对输入的符号串进行语法分析

工作进度计划

序号

起止日期

工作内容

1

09.12.14

选定题目,明确题目要求

2

09.12.15

课题深入调研、细化工作,系统方案设计

3

09.12.16

程序录入、调试、整合

4

09.12.18

上机演示,课程设计分组答辩,完成课程设汁报告

指导教师(签章人

摘要:

编译程序是现代计算机系统的基本组成部分之一,语法分析是编译程序的核心部分,识别山语法分析给出的单词符号序列是否是给定文法的正确句子,把词法记号流按语言的语法结构层次地分组,以形成语法短语。

一个编译程序的工作过程一般可以划分为五个阶段:

词法分析、语法分析、语义分析与中间代码生成、优化、目标代码生成。

LR(0)是一种自底向上的语法分析方法,是已知的最一般的无回溯的移近一归约方法,这一方法能够识别所有能用上下文无关文法描述的程序语言的结构。

本文主要讨论LR(0)语法分析的构造。

着重分析LR(0)分析器的一般原理、实现思想、基本设计方法以及主要实现技术和工具。

操作员录入合法的LR(0)文法,则自动生成LR(0)分析表,并对任一输入串进行分析。

判断其是否是给定文法的句子。

还可以对输入的句子进行语法分析。

关键词:

自底向上分析;移进;规约

1课题综述1

1.1课题来源1

•••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••1

1.3预期目标1

1.4面对的问题2

2系统分析3

2.1涉及的基础知识3

2.2总体方案5

3系统设计5

3.1算法描述6

3.3详细流程图9

4代码编写10

5程序调试15

总结19

致谢20

参考文献21

1课题综述

1.1课题来源

编译器设讣的编译程序涉及到编译五个阶段中的三个,即词法分析器、语法分析器和中间代码生成器。

编译程序的输出结果包括词法分析后的二元式序列、变量名表、状态栈分析过程显示及四元式序列程序。

整个编译程序分为三部分:

词法分析部分、语法分析处理及四元式生成部分、输出显示部分。

一个程序设计语言就是一个记号系统,如同自然语言一样,它的完整的定义应包括语法和语义两个方面。

所谓一个语言的语法是指一组规则,用它可以形成和产生一个合适的程序。

目前广泛使用的手段是上下文无关文法,即用上下文无关文法作为程序设计语言语法的描述丄具。

自底向上分析方法是一种移进-规约过程,当分析的栈顶符号串形成句柄时就釆取归约动作,因而自底向上分析法的关键问题是在分析过程中如何确定句柄。

LR分析法正是给出一种能根据当前分析栈中的符号串(通常以状态表示)和向右顺序查看输人串的k个(k>二0)符号就可惟一地确定分析器的动作是移进还是归约和用哪个产生式归约,因而也就能惟一地确定句柄。

LR分析法的归约过程是规范推导的逆过程,所以LR分析过程是一种规范归约过程。

1.2意义

LR(0)分析方法虽然对文法的限制比较大,对绝大多数高级语言的语法分析器不能适用,然而他是构造其他LR类分析器的基础,学习和掌握LR(0)分析的原理和方法是我们掌握更高级语言语法分析的基础。

归纳起来,大体上可分为两大类,即自顶向下分析方法和自底向上分析方法。

自底向上分析方法是一种移进-规约过程,当分析的栈顶符号审形成句柄时就釆取归约动作,因而自底向上分析法的关键问题是在分析过程中如何确定句柄。

LR分析法正是给出一种能根据当前分析栈中的符号吊(通常以状态表示)和向右顺序查看输人审的k个(k>=0)符号就可惟一地确定分析器的动作是移进还是归约和用哪个产生式归约,因而也就能惟一地确定句柄。

LR分析法的归约过程是规范推导的逆过程,所以LR分析过程是一种规范归约过程。

1.3预期目标

本次课程设讣的LI标即是利用所学过的编译原理的知识,利用LR(O)分析法,用C语言写出一个简单的LR(O)语法分析器。

该语法分析器所要完成的功能是,对录入的文法判断它是否为LR(O)文法,如果是输出LR(0)分析表;在给定文法的情况下,能够利用LR(0)分析表,对用户输入的一串字符串用LR(0)分析法进行分析,判断该字符串是否为符合给定文法的一个句子,建立文法及其LR分析表表示的数据结构,设计并实现一个LR(0)的分析器。

1.4面对的问题

(1)分析表的构造。

(2)归约还是移进的判断。

(3)接受acc的判断。

(4)编程结果的输出。

在本次课程设计中,主要的是面对的文法的确定,以及分析其工作过程如何进行。

对于文法确定的问题,必须找到一个符合LR(0)规范的文法,并且该文法不易太复杂,否则对于初次编写语法分析器的我们来说会比较复杂,否则容易出错。

第二个就是分析过程的问题,目前,我们只是了解了理论上LR(0)的分析过程,但如何将该过程用程序去实现,并且能够对一个输入串进行实时的分析是比较复杂的。

这涉及到对一个字符串进行一个字符一个字符的读取和操作,并且还要对儿个连在一起的字符进行合并等操作,要求比较的高,对我们而言比较困难。

在规范规约的过程中,一方面记住已移进和规约出的整个符号串,另一方面根据所用的产生式推测未来可能碰到的输入符号。

当一串句柄的符号串呈现于分析栈的顶端时,希望能够根据上面过程中的数据来确定栈顶的符号串是否构成相对某一产生式的句柄。

能正确初始化状态栈,对栈内元素的进栈和出栈,取栈顶元素以及遍历栈元素,LR分析方法是一种自底向上的分析方法,是一种个移进-归约的过程。

当分析的栈顶符号串形成句柄时就采取归约动作,因而自底向上分析法的关键问题是在分析过程忠如何确定句柄。

LR(0)分析器是在分析过程中不需要察看输入符号,因而它对文法的限制较大,对绝大多数高级语言的语法分析器是不能使用的,然而,他是构造其他LR类分析器的基础。

需解决的关键技术

(1)词法编译器。

(2)交互式面向对象的词法编译器基本功能是。

(3)根据规约规则对字符进行归约。

(4)符合条件时采取移进动作。

2系统分析

2.1涉及的基础知识

2.1.1词法编译器功能

(1)导入任意文法,也可以自己输入。

(2)输出文法的分析过程,以及判断是否为LR(0)文法,输出分析表。

(3)输入句子,进行语法分析。

(4)输出结构树。

2.1.2词法分析器的设计

方法有如下四个步骤:

(1)写出该语言的词法规则。

(2)把词法规则转换为相应的状态转换图。

(3)把各转换图的初态连在一起,构成识别该语言的自动机。

(4)设计扫描器;把扫描器作为语法分析的一个过程,当语法分析需要一个单词时,就调用扫描器。

扫描器从初态出发,当识别一个单词后便进入终态,送出二元式。

2.1.3动态模拟算法的基本功能

(1)输入LR分析表和一个句子。

(2)输出LR总控程序。

(3)输出依据句子构对应的语法树的过程。

(4)设计一个给定LR分析表,输入一个句子,能曲依据LR分析表输出与句子对应的语法树,能对语法树生成过程进行模拟。

表2-1LR分析表

STA

ACTION

GOTO

TE

a

b

c

d

#

E

I

F

0

S2

S3

1

1

acc

2

S4

SI

0

6

3

S5

S4

7

4

S4

SI

0

8

5

S5

SI

1

9

6

rl

rl

rl

rl

rl

7

r2

r2

r2

r2

r2

8

r3

r3

r3

r3

r3

9

r5

ro

r5

r5

r5

10

r4

r4

r4

r4

r4

11

r6

r6

r6

r6

r6

(5)输入句子:

bccd#o

(6)根据文法产生的LR分析表。

(7)输出结果

2.1.4LR分析器的构成

一个LR分析器由3个部分组成

(1)总控程序,也可以称为驱动程序。

对所有的LR分析器,总控程序都是相同的。

(2)分析表或分析函数。

不同的文法分析表将不同,同一个文法釆用的LR分析器不同时,分析表也不同,分析表乂可以分为动作(ACTION)表和状态

转换(GOTO)表两个部分,它们都可用二维数组表示。

(3)分析栈,包括文法符号和相应的状态栈。

它们均是先进后出栈。

分析器的动作山栈顶状态和当前输入符号所决定(LR(O)分析器不需向前查

看输入符号)。

解决问题的基本思路

1、用构造一个状态转换函数实现状态转换。

2、再通过函数构造一个移进一归约函数实现移进规约动作。

3、采用构造一个打印LR分析器的工作过程函数实现输出。

在规范规约的过程中,一方面记住已移进和规约出的整个符号吊,另一方面根据所用的产生式推测可能碰到的输入符号。

每一项ACTION(s,a)所规定的动作不外是下述四种可能之一:

(1)移进:

把(s,a)的下一个转态s'=GOTO(s,X)和输入符号&推进栈,下一输入符号变成现行输入符号。

(2)规约:

指用某一产生式A-B进行规约。

假若P的长度为r,规约的动作是A,去除栈顶的r个项,使状态Sm-r变成栈顶状态,然后把(Smp,A)的下一状态s'二G0T0(Sm-r,A)和文法符号A推进栈。

规约动作不改变现行输入符号。

执行规约动作意味着P(=Xm-r+1-Xm)已呈现于栈顶而且是一个相对于A的句柄。

(3)接受:

宣布分析成功,停止分析器的工作。

(4)报错:

发现源程序含有错误,调用出错处理程丿了;。

2.3总体方案

本课题是由一个四人的团队去完成的,所以,每个小组成员分配了不同的工作共同完成这个项目。

2.4功能模块框图

图功能模块框图

3系统设计

3.1算法描述

1、已知文法G

(1)E-E+T

(2)E-T

(3)T-T*F

(4)T-F

(5)F-(E)

(6)F-i

2、LR(O)分析表的构造算法如下:

假设已构造出LR(O)项目集规范族为:

C={IO,I1,…,In}

其中Ik为项目集的名字,k为状态名,令包含S'-・S项目的集合Ik的下标k为分析器的初始状态。

那么分析表的ACTION表和GOTO表构造步骤为:

(1)若项目A-。

・aB属于Ik且转换函数GO(Ik,a)=Ij,当a为终结符时则置ACTION[k,a]为Sj,其动作含意为将终结符a移进符号栈,状态j进入状态栈,(相当状态k时遇a转向状态j)。

(2)若项目A-ci・属于Ik,则对任何终结符a和号置ACTION[k,a]和ACTION[k,«为"rj",j为在文法G‘中某产生式a的序号。

rj动作的含义是把当前文法符号栈顶的符号串«归约为A,并状态栈指针从栈顶向下移动Ia丨的长度,文法符号栈从栈顶弹出2|个符号,非终结符A变为当前面临的符号。

(3)若GO(Ik,A)=Ij,则置GOTO[k,A]为”j",其中A为非终结符,表示当前状态为"k〃时,遇文法符号A时状态应转向j,因此A移入文法符号栈,j移入状态栈。

(4)若项目S'-S•属于Ik,则置ACTION[k,#]为"dec",表示接受。

(5)凡不能用上述方法填入的分析表的元素,均应填上"报错标志"。

为了表的清晰我们仅用空口表示错误标志。

根据这种方法构造的LR(O)分析表不含多重定义时,称这样的分析表为LR(O)分析表,能用LR(O)分析表的分析器称为LR(O)分析器,能构造LR(O)分析表的文法称为LR(O)文法。

3、产生如图2-1所示的LR分析表

这张分析表包括两个部分,一是“动作”(ACTION)表,另一是“状态转换”(GOTO)表。

ACTION(S,a)规定了当状态S面临输入符号a时应采取什么动作。

GOTO(S,X)规定了状态S面对文法符号X(终结符或非终结符)时下一状态是什么。

显然,GOTO(S,X)定义了一个以文法符号为字母表的DFA。

每一项ACTION(S,a)所规定的动作不外是下述四种可能之一:

(1)移进把(S,&)的下一个转态S'二GOTO(S,X)和输入符号&推进栈,下一输入符号变成现行输入符号。

(2)规约指用某一产生式A-0进行规约。

假若B的长度为r,规约的动作是A,去除栈顶的r个项,使状态Sm-r变成栈顶状态,然后把(Sm-r,A)的下一状态S'二GOTO(Sin-r,A)和文法符号A推进栈。

规约动作不改变现行输入符号。

执行规约动作意味着B(二Xm-r+l…Xm)已呈现于栈顶而且是一个相对于A的句柄。

(3)接受宣布分析成功,停止分析器的工作。

(4)报错发现源程序含有错误,调用出错处理程序。

一个LR分析器的工作过程可看成是栈里的状态序列,已规约串和输入串所构成的三元式的变化过程。

分析开始时的初始三元式为:

(SO,锹

ala2an#)。

其中,SO为分析器的初态;#为句子的左括号;ala2……an为输入串;其后的#为结束符(句子右括号)。

分析过程每步的结果可表示为:

(SOS1……Sm,ttXlX2Xmai,ai+1an#)。

实现方法

3.2.1构造分析表

LR分析器实质上是一个带先进后出存储器(栈)的确定有限状态自动机。

LR分析器的每一步工作是由栈顶状态和现行输入符号所唯一决定的。

构造一个int型二维数组table[13][9],用于存放LR分析表。

并初始化。

作者这样规定:

0〜11

表示

状态Sj,其中0对应SO,1对应S1••…

21〜26

表示

规约Rj,其中21对应R1,22对应R2・,

12

表示

“接受”O

-1表示规约出错,报错。

3.2.2程序设计关键

(1)在输入串(句子)输入的过程中,涉及到一个压栈的问题。

但是输入串压入的字符顺序刚好与原理中的字符吊模型刚好相反,这样需要先弹出的反而在栈底。

为了既要保证字符串输入,乂要让输入的字符串存储顺序与输入的字符串相反。

采取以下措施:

先将输入的字符串压入符号栈symbol中,然后符号栈弹出的字符再压入输入串栈instr中,这样实现了输入串的倒序存储。

(2)状态栈和符号栈输出(遍历)过程均采取自栈底到栈顶的顺序,而输入申栈则是采取自栈顶到栈底的顺序输出。

3.2.3LR(0)项目集规范族的构造

识别活前辍的NFA我们可以利用子集法将其确定化。

对确定化后的DFA如果把每个子集中所含状态集对应的项LI写在新的状态中。

对于构成识别一个文法活前缀的DFA项目集(状态)的全体称为这个文法的LR(0)项口集规范族,我们可以分析每个状态中项□集的构成,不难发现如下规律:

若状态中包含形如A-a・BB的项目,则形如B-・Y的项目也在此状态内。

例如:

0状态中项目集为{S'-・E,E-・aA,E-・bB}。

回顾由NFA确定化到DFA时,E-・aA和E-・bB正是属于S'-・E的闭包中。

因而,可引入闭包函数(CLOSURE)来求DFA—个状态的项LI集。

若文法G已拓广为G',而S为文法G的开始符号,拓广后增加产生式S'-S。

如果I是文法L的一个项目集,定义和构造I的闭包CLOSURE⑴如下:

(1)I的项目均在CLOSURE⑴中。

(2)若A-a・BB属于CLOSURE(I),则每一形如B-・Y的项目也属于

CLOSURE(I)o(3)重复

(2)直到不出现新的项LI为止。

即CLOSURE⑴不再扩大。

山此,我们可以很容易构造出初态的闭包,即S'-・S属于I,再按上述三点求其闭包。

回顾在构造识别活前缀的NFA时,其两个相邻状态对应的项LI是出自同一个产生式,只是圆点的位置相差1,箭弧上的标记为前一个状态和后一个状态对应项目圆点间的符号,(除了箭弧上标记为£的外)。

由于识别活前缀的DFA的每个状态是一个项LI集,项LI集中的每个项LI都不相同,侮个项U圆点后的符号不一定相同,因而对每个项U圆点移动一个位置后,箭弧上的标记也不会完全相同,这样,对于不同的标记将转向不同的状态。

例如初态{S'-・E,Ef・aA,E-・bB}对第一个项目圆点右移一个位置后变为S'-E•箭弧标记应为E,对第二个项目E-・aA,圆点右移一个位置后,项目变为E-d・A,箭弧标记为a,同样第三个项目为圆点右移一个位置后变为E-b・B,箭弧标记为b,显然,初态可发出三个不同标记的箭弧,因而转向三个不同的状态,也就由初态派生出三个新的状态,对于每个新的状态我们乂可以利用前面的方法,若圆点后为非终结符则可对其求闭包,得到该状态的项LI集。

圆点后面为终结符或在一个产生式的最后,则不会再增加新的项口。

3.3详细流程图

图LR分析器设计流程图

4代码编写

4.1主要模块的代码分析

4.1.1生成分析表代码

voidCLROForWinDlg:

:

0nGtable()

{

CTableDlgdig;

(IDC.EXPLORERl,RESIZE_BOTH);

(IDOK,ANCHORE.BOTTOMANCHORE_RIGHT);

(IDC.EXPORT,ANCHORE_BOTTOMANCHORE.RIGHT);

(IDC.ANALYZE,ANCHORE_BOTTOM|ANCHORE.RIGHT);

stringtemp="”;

CStringt;

for(inti=0;i<0;i卄)

{

(i,t);

4.1.2etRight().lengthO-l],・GetLeft0[0]);

assert(j!

=-1);

(GetStepInfo(iStep,Status,Symbol,0-iPos),ToDo,j));for(i=0;i<.GetRight0.length0;i++)

{

0;

0;

}

・GetLeft()[0]);

(j);

case'a:

if(iPos)二二'#')

{

(GetStepInfo(iStep,Status,Symbol,0-iPos),ToDo,-1));bGoOn=false;

}

else

bErrorFlag=true;

break;

case0:

bErrorFlag=true;

break;

default:

assert(false);

}

iStep++;

}

("/table〉");

if(bErrorFlag)

{

C分析失败,输入的字符串是不符合预立文法的!

导入文法⑴I生成分析表(G)

清除文法(C)

保存文法⑸

关闭

+

1

()

产生式集合

I添加I删除I

E->E+T

E->T

T->T*F

T->F

F->(E)

F->i

58LR(O)文法分析表生成程序I旦]

非终结符集合

.i

终结符集合

文法开始符号

55总出■f

S2J

3

Ra

Rd

Rd

&

Rd

&

4

Ss

Sd

8

2

3

:

(1)

5

Rg

Rg

R&

R&

R&

Rg

6

Ss

Sd

9

3

表(G)

7

S5

Sd

10

沢C)

1

8

Sg

Sn

严王

9

Ri

Ri

Ri

Ri

Ri

Ri

(s)

10

Rs

Rs

Rs

Rs

Rs

Rs

E->1

11

Rs

Rs

Rs

Rs

Rs

Rs

E-yT-y

T->1

分析句子@)1保存结果(E)1

关闭1

F->i

关闭

7肖军模•程序设计语言编译方法[M]・大连:

大连理工岀版社,2000

8许福,舒志,张威.VisualC++程序设计技巧与实例•北京:

中国铁道出版社,2003

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

当前位置:首页 > 经管营销 > 经济市场

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

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