寻找句柄可以单纯用brute-force 也就是暴力求解。
移进-归约分析法:
如果输入符号串是语言的一个句子,那么该格局对应文法的一个句型。
优先法:
这里需要解释解释啥叫优先关系互不冲突/至多存在一种优先关系: 剧透一下后面的图
也就是说简单优先文法是所有语法变量之间至多有一种优先关系甚至无关(这样其实也暗示了任意语法变量之间的优先关系不会冲突,因为至多一种优先关系),那么就可以直接确定归约的顺序。
状态法:
移进-归约中的问题:
比如:
算符优先分析法:
和前面的知识串起来了!在解决最左推导的二义性问题的时候,把乘法的优先级提高!
划重点:任何句型。
并且注意第二条和第三条 a在A产生式中始终在b左边 这样得出的结论a也在左边。当然换一下位置也是可以的 结论也会改变。
算符优先矩阵:
注意#的优先关系。
意思就是同一位置的终结符要相同,但是非终结符只需要有就行 是啥无所谓。
算符优先分析的出错处理:
(2)说的不对 应该是不能匹配任何产生式的右部。
LR分析法:
LR分析法可识别所有CFG!
活前缀就是当前格局中已经进入分析栈的那部分字符。
此处可归前缀是aAb 而不是Ab。
由正则文法与DFA的等价性:
通过规范推导或者规范归约得到的句型称为规范句型。
LR分析器的工作过程:
上图,归约出文法变量后还要查goto表确定此时的状态。任意“结束”时刻分析栈中的字符与状态都是一一对应的。归约前的待归约字符出栈时它们对应的状态也要出栈。
会弹出2*|β|个符号是因为设计栈的时候把状态和对应的字符依次交叠的压栈。
也可以设计成结构体,把状态和字符打包。
LR(0):
项目集闭包:
项目集规范族:
也就是从i0开始关于每个符号都转移一遍得到的项目集的族。
LR(0)原理及算法:
上述⑴到⑷步未填入信息的表项均置为error.
这个算法少了把(3)换成A->B.的情况(归约语法变量)
红圈内的式子表示当前时刻分析器对于某个产生式的识别到了什么程度,由前面的DFA可以得知此时碰到什么语法符号进入到哪一个后继项目集。
再回到这个问题,为什么根据DFA可就可以确定句柄呢?我理解的是,其实很简单,所有活前缀都能被DFA成功识别,如果某个句子能被分析器识别说明这个句子的闭包之间的转移也一定符合这个DFA。这样我们就确定了状态该怎么变,现在要确定的就啥时候移进啥时候归约,LR(0)没有什么素短语的说法,它就根据产生式来找句柄,只要某个闭包的状态里出现了产生式的右部就执行归约,其他时刻执行的都是移进。
上图i3为何还有B->.aB呢?因为:在识别a后出现待归项目B->a.B,这又是一个待约项目;DFA的状态集合是该文法的项目集规范族,由项目集闭包组成,为了使i3构成闭包需要加入待归项目B->a.B的后继项目。(本人在这里迷糊过)