SLR分析表构建代码解析及错误修正
SLR分析表构建代码解析及错误修正
代码解析
提供的代码片段实现了 SLR 分析表的构建,主要包括以下部分:
-
数据结构定义:
SLRNode: 用于存储产生式和项目,包含Left和Right属性,分别表示产生式的左部和右部。SLRitemsets: 用于存储项目集合,包含Container属性,记录项目在项目集合中的序号。DFA: 用于存储 DFA 状态转换信息,包含from,symbol,to属性,分别表示源状态、转换符号和目标状态。Table: 用于存储 SLR 分析表的表项,包含error,type,id属性,分别表示是否为错误状态、表项类型和对应值。
-
SLR 分析表构建函数
SLRAnaly():- 初始化 SLR 分析表
SLRAna,并将所有表项设置为错误状态。 - 设置接受状态
SLRAna[1][FindID(Echar, '#')] = tnode,其中tnode是Table对象,表示接受状态。 - 遍历归约项目集合
Gy_itemset,计算每个归约项目对应的 follow 集合,并将其加入到对应的表项中。 - 遍历 DFA 状态
dfa,根据出边对应的符号类型,设置对应的表项,如果是终结符则设置S状态,如果是非终结符则设置N状态。
- 初始化 SLR 分析表
-
其他函数:
GetFollow(): 计算非终结符的 follow 集合。GetFirst(): 计算非终结符的 first 集合。FindID(): 在字符集合中查找字符的序号。Find_pro(): 查找产生式的编号。isFinalsymbol(): 判断字符是否为终结符。
错误分析及修正
代码在 SLRAnaly() 函数中初始化 SLR 分析表时,将所有表项都设置为错误状态。然而,SLR 分析表中并非所有表项都是错误状态,有些表项需要根据 DFA 状态和归约项目进行正确赋值。
解决方案:
- 在
SLRAnaly()函数中,将所有表项初始化为错误状态节点,而不是每次都新建一个Table对象。 - 修改
Table类,添加一个默认构造函数,用于创建错误状态节点。
修改后的代码
public class Table
{
public bool error;//是否为ERROR
public char type;//结点类型
public int id;//数值
// 默认构造函数,用于创建错误状态节点
public Table()
{
this.error = true;
}
// 构造函数,用于构建正确的表项
public Table(char type, int id)
{
this.type = type;
this.id = id;
this.error = false;
}
}
public void SLRAnaly()
{
Table errorNode = new Table(); // 错误状态节点
SLRAna = new Table[proitemset.Count][];
for (int i = 0; i < proitemset.Count; i++)
SLRAna[i] = new Table[Echar.Count + Nchar.Count];
// 初始化所有表项为错误状态节点
for (int i = 0; i < proitemset.Count; i++)
for (int j = 0; j < Echar.Count + Nchar.Count; j++)
SLRAna[i][j] = errorNode;
// ... 剩余代码 ...
}
总结
通过对代码进行分析,并针对错误进行修正,可以成功地构建 SLR 分析表。在构建 SLR 分析表时,需要注意正确设置每个表项的值,避免将所有表项都设置为错误状态。
原文地址: https://www.cveoy.top/t/topic/f0El 著作权归作者所有。请勿转载和采集!