C# SLR分析表构建及ListView显示问题解决

本文分析了一段C#代码,该代码用于构建SLR分析表,但可能存在导致ListView中r元素对应项显示不正确的问题。本文将详细分析问题原因,并提供修改后的代码及相关说明。

代码分析:

代码实现了SLR分析表的构建,其中SLRAna数组表示SLR分析表,每个元素是一个Table对象,记录了该状态下对应符号的动作(移进、归约、接受等)和转移的状态编号。

SLRAnaly方法中,首先将SLRAna数组初始化为ERROR状态。然后,为接受状态(项目集1)赋予'acc'动作。接着,遍历所有含有归约项目的项目集,根据项目集中第一个项目的左部符号的follow集合,为follow集合中的每个符号在SLRAna数组中添加对应的'r'动作。最后,根据DFA数组中的转移关系,为终结符添加'S'动作,为非终结符添加'N'动作。

问题原因:

代码中可能出现r元素对应项显示不正确的问题,原因是在SLRAnaly方法中为follow集合中的每个符号添加'r'动作时,使用了FindID方法来找到符号在EcharNchar中的索引,但如果该符号不存在于这两个列表中,FindID方法会返回-1,导致数组下标越界,从而出现显示错误。

解决方法:

为了解决这个问题,需要对FindID方法和SLRAnaly方法进行修改:

  1. 修改FindID方法:FindID方法中加入判断,如果找不到符号则返回-1,否则返回索引。C#public int FindID(List list, char c){ int index = list.IndexOf(c); return index;}

  2. 修改SLRAnaly方法:SLRAnaly方法中添加'r'动作时,先判断FindID方法的返回值是否为-1,如果不是-1,则将返回值加上Echar.Count,以保证正确找到符号在SLRAna数组中的位置。C#public void SLRAnaly(){ // ...

    for (int i = 0; i < Gy_itemset.Count; i++) { // ... foreach (char c in follow) { int CID = FindID(Echar, c); if (CID != -1) { SLRAna[Gy_itemset[i]][CID + Echar.Count] = new Table('r', Find_pro(item)); } } }

    // ...

    for (int i = 0; i < Pindex; i++) { if (isFinalsymbol(dfa[i].symbol)) //symbol为非终结符 添加状态N { int CID = FindID(Nchar, dfa[i].symbol); if (CID != -1) { SLRAna[dfa[i].from][CID + Echar.Count] = new Table('N', dfa[i].to); } } else //不是归约项目 添加状态S { int CID = FindID(Echar, dfa[i].symbol); if (CID != -1) { SLRAna[dfa[i].from][CID] = new Table('S', dfa[i].to); } } }}

通过以上修改,可以避免数组下标越界问题,确保SLRAna数组中'r'元素对应项的显示正确。

C# SLR分析表构建及ListView显示问题解决

原文地址: https://www.cveoy.top/t/topic/f0xq 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录