自下而上语法分析


       本章学习自下而上的语法分析,其分析过程为边输入单词符号,边归约,直至归约到文法的开始符号。(归约是指根据文法的产生式规则,把产生式的右部替换成左部符号)自下而上的分析方法的关键就是找到可归约串。

       对于简单问题(不用考虑优先级等问题)的自下而上语法分析有以下方法:1.移进归约,即用一个寄存符号的先进后出栈,把输入符号一个一个地移进到栈里,当栈顶形成某个产生式的候选式时,即把栈顶的这一部分替换成(归约为)该产生式的左部符号;2.规范规约,首先了解规范规约的定义,假定α是文法G的一个句子,如果序列αn,αn-1,… ,α0满足:(1)αn=α(2)α0为文法的开始符号,即α0=S(3)  对任何i,0<i≤n,αi-1是αi把句柄(句型的最左直接短语即最左端的简单子树)替换成为相应产生式左部符号而得到的。我们称该序列是α的一个规范归约,规范规约即最左归约,可通过修剪最左简单子树实现;3.用符号栈进行自下而上的语法分析,取一个栈作为符号栈在分析开始时,’#’预先进栈,作为栈底符号,将输入串中的符号依次入栈并规约,’#’作为输入串的结束符

      在实际问题中往往能够需要考虑优先级,对于优先级问题有以下处理方法:(1)算符优先分析法,即定义算符之间的某种优先关系,借助这种优先关系找到可归约串并规约。这种优先关系往往是单向的,没有自反性。在算符优先分析法中将最左素短语作为可归纳串(算符优先分析一般不等于规范归约);(2)优先函数法,优先函数是把每个终结符α与两个自然数f(α)与g(α)相对应,使得若α1 <. α2,则f(α1) < g(α2),若α1 =. α2,则f(α1) = g(α2),若α1 >. α2,则f(α1) > g(α2),f称为入栈优先函数,g称为比较优先函数。

      本章还重点介绍了一种分析法——LR分析法。LR分析法是一种规范规约,其思想为一方面记住已移进和归约出的整个符号串,另一方面根据所用产生式推测未来可能碰到的输入符号。LR分析法比较复杂,不适于手工处理,可通过LR分析器实现。LR分析器实质上是一个带先进后出存储器(栈)的确定有限自动机,其核心部分是一张分析表,包括两部分:(1)ACTION[s,a]动作表,规定当状态s面临输入符号a时,应采取什么动作(移进、归约、接受、 报错)(2)GOTO[s,X]状态转换表规定了状态s面对文法符号X时,下一状态是什么。通过LR文法可以构造LR分析表,LR文法是指能构造出一个所有条目都唯一的分析表的文法。最多向前看K个的符号就可以决定动作的LR分析器所分析的文法称为LR(k)文法,对多数程序只需考虑k≤1的情况。考虑LR(0)项目需要了解LR分析法的一个重要的概念,活前缀,活前缀是指规范句型的不含句柄之后的任何符号的前缀。LR分析表的构造需要构造识别活前缀的有限自动机,用有限自动机中的状态表示分析表中的状态,用状态图中的状态之间的转换关系对分析表中的action、goto函数等进行定义。大多数程序设计语言的文法不能满足 LR(0)文法的条件,即其规范族中会有含有冲突的项目集(状态)。对于有冲突的状态,向前查看一个符号,以确定采用的动作,构造SLR 分析表。也有一些文法构造的LR(0)项目集规范族存在的动作冲突但是不能用SLR(1)方法解决,此时需要规范LR分析表



感想:

    本章内容,很多很复杂,LR分析法根据例题还能好理解些,但是对于其他的内容还是有些不太懂的地方,做这些题目的时候,写起来很复杂,尤其规约的地方需要格外注意。

猜你喜欢

转载自blog.csdn.net/qq_35482060/article/details/80385365