构造LR分析表 private void button5_Clickobject sender EventArgs e listView2Clear; LRTable table; table = lrGET_ANA; int xlen = tableGetLength0;
由于冲突处理的方法有多种,这里只给出一种简单的处理方式,即选择优先级高的状态。
在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]
原文地址: http://www.cveoy.top/t/topic/hflF 著作权归作者所有。请勿转载和采集!