SLR1分析表构建的步骤:

  1. 构建LR(0)项集族
  2. 对于每个项集I,求出I的闭包闭包J
  3. 构建LR(1)项集族,其中每个项集的状态为项集闭包的LR(0)项集的状态和向前看符号的集合
  4. 构建SLR(1)分析表,对于每个项集I,对于每个终结符a,如果GOTO(I, a) = J,则在表中填入ACTION[I, a] = shift J,如果J是接受状态,则在表中填入ACTION[I, a] = acc。对于每个非终结符A,如果GOTO(I, A) = J,则在表中填入GOTO[I, A] = J。

对于给出的代码,需要先了解SLR1分析表的构建过程和相关概念,然后分析代码的正确性。

代码中的SLRAnaly()函数用于构建SLR1分析表,其中包括对于每个项目集I和每个终结符a的处理。在代码中,首先初始化SLRAna数组,并将所有元素赋值为Table类型的tnode对象,该对象的type属性为N,表示状态为N(即无状态);然后为接受状态(即项目集1)赋值,将SLRAna[1][#]的值赋为Table类型的tnode对象,该对象的type属性为A,表示状态为接受状态;接着,对于每个非终结符A,将其对应的状态设为N;对于每个终结符a,如果GOTO(I, a) = J,则将SLRAna[I][a]的值设为S J,表示状态为S,转移后的状态为J;对于每个归约项目,将其对应的状态设为r,转移后的状态为该项目的编号。

代码中存在错误部分,具体如下:

  1. SLRAnaly()函数中的SLRAna数组初始化时,应该将所有元素赋值为不同的Table类型的对象,否则所有元素将指向同一个对象,导致修改一个元素的值会影响到其他元素的值。

修改后的代码:

public void SLRAnaly() { // 初始化SLRAna数组 SLRAna = new Table[proitemset.Count][]; for (int i = 0; i < proitemset.Count; i++) { SLRAna[i] = new Table[Echar.Count + Nchar.Count]; for (int j = 0; j < Echar.Count + Nchar.Count; j++) { SLRAna[i][j] = new Table(); } }

// 为接受状态赋值
Table tnode = new Table('A', 0);
SLRAna[1][FindID(Echar, '#')] = tnode;

// 为非终结符赋值
for (int i = 0; i < Pindex; i++)
{
    if (isFinalsymbol(dfa[i].symbol))
    {
        int CID = FindID(Nchar, dfa[i].symbol);
        SLRAna[dfa[i].from][CID + Echar.Count].type = 'N';
        SLRAna[dfa[i].from][CID + Echar.Count].id = dfa[i].to;
    }
}

// 为终结符赋值
for (int i = 0; i < Pindex; i++)
{
    if (!isFinalsymbol(dfa[i].symbol))
    {
        int CID = FindID(Echar, dfa[i].symbol);
        SLRAna[dfa[i].from][CID].type = 'S';
        SLRAna[dfa[i].from][CID].id = dfa[i].to;
    }
}

// 为归约项目赋值
for (int i = 0; i < Gy_itemset.Count; i++)
{
    SLRNode item = SLRobjNum[proitemset[Gy_itemset[i]].Container[0]];
    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].type = 'r';
        SLRAna[Gy_itemset[i]][CID].id = Find_pro(item);
    }
}

}

  1. SLRAnaly()函数中的归约项目的处理有误,应该根据向前看符号来确定归约项目的状态,而不是根据该项目所在的项集。具体来说,对于每个归约项目,应该将其对应的状态设为r,转移后的状态为该项目对应的产生式编号。

修改后的代码:

// 为归约项目赋值 for (int i = 0; i < Gy_itemset.Count; i++) { SLRNode item = SLRobjNum[proitemset[Gy_itemset[i]].Container[0]]; foreach (char c in item.LookAhead) { int CID = FindID(Echar, c); SLRAna[Gy_itemset[i]][CID].type = 'r'; SLRAna[Gy_itemset[i]][CID].id = Find_pro(item); } }

综上所述,代码中存在错误,需要进行修改

请给出SLR1分析表构建的步骤依据上述步骤分析下列代码的正误并给出结论、指出错误部分和修改后的代码。public Table GET_ANA SLRAnaly; RStr_ANA += rnSLR0分析表rn ; int i; for i = 0; i EcharCount; i++

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

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