标准实用文案大全实验名称:LR(0)文法分析一、实验目的:输入:任意的压缩了的上下文无关文法
输出:相应的LR(0)分析表
二、实验原理:对于LR文法,我们可以自动构造相应的LR分析表
为了构造LR分析表,我们需要定义一个重要概念——文法的规范句型“活前缀”
这种句柄之后不含任何符号的前缀称为活前缀
在LR分析工作过程中的任何时候,栈里的文法符号(自栈底而上)X1X2⋯Xm应该构成活前缀,把输入串的剩余部分配上之后即应成为规范句型(如果整个输入串确实构成一个句子)
因此,只要输入串的已扫描部分保持可归约成一个活前缀,那就意味着所扫描过的部分没有错误
对于一个文法G,我们可以构造一个有限自动机,它能识别G的所有活前缀,然后把这个自动机转变成LR分析表,按照该LR分析表进行LR分析,就能保证在分析的过程中,如果分析的句子是正确的,栈里的文法符号(自栈底而上)始终构成活前缀
假若一个文法G的拓广文法G的活前缀识别自动机中的每个状态(项目集)不存在下述情况:(1)既含移进项目又含归约项目;(2)含有多个归约项目,则称G是一个LR(0)文法
该自动机的状态集合即为该文法的LR(0)项目集规范族
构造识别文法活前缀DFA有3种方法:(1)根据形式定义求出活前缀的正则表达式,然后由此正则表达式构造NFA再确定为DFA;(2)求出文法的所有项目,按一定规则构造识别活前缀的NFA再确定化为DFA;(3)使用闭包函数(CLOSURE)和转向函数(GO(I,X))构造文法G’的LR(0)的项目集规范族,再由转换函数建立状态之间的连接关系来得到识别活前缀的DFA
符号串的前缀是指该符号串的任意首部,包括空串ε
例如,对于符号串abc,其前缀有ε,a,ab,abc
如果输入串没有错误的话,一个规范句型的活前缀是该句型的一个前缀,但它不含句柄之后的任何符号
之所以称为活前缀,是因为在该前缀后联接尚未输