由于冲突处理的方法有多种,这里只给出一种简单的处理方式,即选择优先级高的状态。

在LRAnaly()方法中,添加状态时需要进行判断,如果已经存在状态,则需要进行冲突处理。具体来说,对于移进规约冲突,选择优先级高的状态;对于规约规约冲突,选择第一个出现的状态。代码如下:

public void LRAnaly() { Table tnode = new Table();

LRAna = new Table[proitemset.Count][];
for (int i = 0; i < proitemset.Count; i++)
    LRAna[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++)
        LRAna[i][j] = tnode;

tnode = new Table('A', 0);
LRAna[1][FindID(Echar, '#')] = tnode;

for (int i = 0; i < Gy_itemset.Count; i++)
{
    int left = LRobjNum[proitemset[Gy_itemset[i]].Container[0]].Left;
    int right = LRobjNum[proitemset[Gy_itemset[i]].Container[0]].Right.Length;
    int pro = Find_pro(LRobjNum[proitemset[Gy_itemset[i]].Container[0]]);
    tnode = new Table('r', pro);
    for (int j = 0; j < Echar.Count; j++)
    {
        if (LRAna[Gy_itemset[i]][j].type == 'S')
        {
            int old = LRAna[Gy_itemset[i]][j].id;
            int old_left = LRobjNum[proitemset[old].Container[0]].Left;
            int old_right = LRobjNum[proitemset[old].Container[0]].Right.Length;
            if (old_left == left && old_right == right)
            {
                if (pro < old)
                {
                    LRAna[Gy_itemset[i]][j] = tnode;
                }
            }
            else
            {
                LRAna[Gy_itemset[i]][j] = tnode;
            }
        }
        else
        {
            LRAna[Gy_itemset[i]][j] = tnode;
        }
    }
}
for (int i = 0; i < Pindex; i++)
{
    if (isFinalsymbol(dfa[i].symbol))
    {
        int CID = FindID(Nchar, dfa[i].symbol);
        tnode = new Table('N', dfa[i].to);
        for (int j = 0; j < Echar.Count; j++)
        {
            if (LRAna[dfa[i].from][CID + Echar.Count].type == 'r')
            {
                int old = LRAna[dfa[i].from][CID + Echar.Count].id;
                int old_left = LRobjNum[proitemset[old].Container[0]].Left;
                int old_right = LRobjNum[proitemset[old]
构造LR分析表 private void button5_Clickobject sender EventArgs e listView2Clear; LRTable table; table = lrGET_ANA; int xlen = tableGetLength0;

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

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