SLR(1) 文法分析:解析与代码实现
SLR(1) 文法分析:解析与代码实现
本文将对给定的文法进行 SLR(1) 分析,并提供相应的代码实现。过程中,我们将重点解决分析表中归约状态添加错误的问题。
文法
E->E+T|TT->T*F|FF->(E)|d
正确的 SLR(1) 分析表
状态|+|*|(|)|d|#|E|T|F----|---|---|---|---|---|---|---|---|0 | | |S4| |S5| |1|2|3|1 |S6| | | | | | | |2 |r6|S7| | |r6| | | |3 |r5|r5| | |r5| | | |4 | | |S4| |S5| |8|2|3|5 |r6|r6| | |r6| | | |6 | | |S4| |S5| | |9|3|7 | | |S4| |S5| | | |10|8 |S6| | | |S11| | | |9 |r1|S7| | |r1| | | |10 |r3|r3| | |r3| | | |11 |r5|r5| | |r5| | | |
错误分析
在提供的代码中,SLRAnaly() 函数负责构建分析表。然而,在处理归约项目时,代码存在错误。虽然正确识别了包含归约项目的项目集,但在为分析表添加归约状态时,没有正确关联归约项目和其对应的产生式序号,导致分析表中的归约状态全部被赋值为 S6,而非正确的归约项目序号。
代码修正
需要修改 SLRAnaly() 函数,在处理包含归约项目的项目集时,为每个归约项目添加对应的归约状态。
以下是修改后的代码片段:c#public void SLRAnaly(){ // ... (省略部分代码) ...
for (int i = 0; i < Gy_itemset.Count; i++) { // ... (省略部分代码) ...
// 为每个归约项目添加对应的归约状态 foreach (int index in proitemset[Gy_itemset[i]].Container) { SLRNode node = SLRobjNum[index]; if (node.Right == 'd') // 判断是否为归约项目 { int DID = FindID(Echar, 'd'); SLRAna[Gy_itemset[i]][DID] = new Table('r', Find_pro(node)); // 添加归约状态 } } }
// ... (省略部分代码) ..
原文地址: https://www.cveoy.top/t/topic/f0Lk 著作权归作者所有。请勿转载和采集!