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

本文分析一段 C# 代码,该代码实现了 SLR 分析表的构建。然而,在使用 ListView 控件显示分析表时,发现 r 状态对应的元素显示不正确。本文将分析问题原因,并提供修改后的代码。

问题分析

代码中,SLRAna 是一个二维数组,用于存储分析表。SLRAnaly() 函数负责构建该分析表,其中包含以下步骤:

  1. 初始化 SLRAna,将所有元素赋值为 error 属性。2. 将接受状态赋值为 'A'。3. 将归约状态赋值为 'r'。4. 将移进状态赋值为 'S'。5. 根据 DFA 中的状态转移信息,将对应状态的 SLRAna 元素赋值为对应的移进或归约状态。

问题出现在处理归约状态时,代码使用 SLRobjNum[proitemset[Gy_itemset[i]].Container[0]] 获取对应的归约项目。然而,Container[0] 可能导致获取到错误的项目。这是因为 Container 中存储的是项目集中的所有项目,而并非所有项目都是归约项目。

此外,SLRAna 数组中,r 状态对应的元素应该是归约项目的序号,而不是对应的产生式序号。因此需要修改 Find_pro() 函数,使其返回归约项目的序号。

代码修改

以下是修改后的代码:C#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 tnode = new Table();

SLRAna = new Table[proitemset.Count][];    for (int i = 0; i < proitemset.Count; i++)        SLRAna[i] = new Table[Echar.Count + Nchar.Count];

// 初始化,赋予 ERROR 属性    for (int i = 0; i < proitemset.Count; i++)        for (int j = 0; j < Echar.Count + Nchar.Count; j++)            SLRAna[i][j] = tnode;

tnode = new Table('A', 0);    SLRAna[1][FindID(Echar, '#')] = tnode; // 项目集 1 必定是接受项目

for (int i = 0; i < Gy_itemset.Count; i++)    {        SLRNode item = null;        // 找到项目集中点在最后的项目,即为归约项目        foreach (int index in proitemset[Gy_itemset[i]].Container)        {            if (SLRobjNum[index].Dot == SLRobjNum[index].Right.Count)            {                item = SLRobjNum[index];                break;            }        }

    if (item != null)        {            char left = item.Left[0];            List<char> follow = GetFollow(left);            foreach (char c in follow)            {                int CID = FindID(Echar, c);                // 获取归约项目的序号                SLRAna[Gy_itemset[i]][CID] = new Table('r', Gy_obj.IndexOf(Find_pro(item)));            }        }    }

// ... 其他代码 ...}

private int Find_pro(SLRNode node){ for (int i = 0; i < SLRproNum.Count; i++) { if (SLRproNum[i].Left == node.Left && SLRproNum[i].Right.SequenceEqual(node.Right)) return i; } return -1


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

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