// 判别LR0文法 private void button2_Click(object sender, EventArgs e) { string input = richTextBox1.Text.Trim(); if (string.IsNullOrEmpty(input)) { MessageBox.Show("请输入文法!"); return; }

// 解析文法
productions.Clear();
string[] lines = input.Split(new char[] { '\n', '\r' }, StringSplitOptions.RemoveEmptyEntries);
foreach (string line in lines)
{
    string[] parts = line.Split(new char[] { ' ', '\t', '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);
    if (parts.Length < 3)
    {
        MessageBox.Show("文法格式不正确!");
        return;
    }
    string left = parts[0];
    List<Symbol> right = new List<Symbol>();
    for (int i = 2; i < parts.Length; i++)
    {
        right.Add(new Symbol(parts[i], !char.IsUpper(parts[i][0])));
    }
    productions.Add(new Production(left, right));
}

// 判断是否为LR0文法
BuildLR0ItemSets();
bool isLR0 = true;
foreach (LR0ItemSet set in itemSets)
{
    Dictionary<Symbol, List<LR0Item>> dict = new Dictionary<Symbol, List<LR0Item>>();
    foreach (LR0Item item in set)
    {
        Symbol nextSymbol = item.NextSymbol();
        if (nextSymbol != null && nextSymbol.IsTerminal)
        {
            if (!dict.ContainsKey(nextSymbol))
            {
                dict.Add(nextSymbol, new List<LR0Item>());
            }
            dict[nextSymbol].Add(item);
        }
    }
    foreach (Symbol s in dict.Keys)
    {
        if (dict[s].Count > 1)
        {
            isLR0 = false;
            break;
        }
    }
    if (!isLR0)
    {
        break;
    }
}
if (!isLR0)
{
    MessageBox.Show("该文法不是LR0文法!");
    return;
}

// 显示项目族信息
button4.Enabled = true;
button5.Enabled = true;
button6.Enabled = true;

}

// 生成项目族信息 private void button4_Click(object sender, EventArgs e) { listView1.Columns.Clear(); listView1.Items.Clear(); listView1.View = View.Details;

// 添加列名
listView1.Columns.Add("状态", 150);
listView1.Columns.Add("项目集信息", 300);

// 添加数据
for (int i = 0; i < itemSets.Count; i++)
{
    ListViewItem item = new ListViewItem(i.ToString());
    item.SubItems.Add(itemSets[i].ToString());
    listView1.Items.Add(item);
}

listView1.GridLines = true;

}

// 构造LR分析表 private void button5_Click(object sender, EventArgs e) { BuildGotoTable(); BuildActionTable();

listView2.Columns.Clear();
listView2.Items.Clear();
listView2.View = View.Details;

// 添加列名
foreach (Symbol s in symbols)
{
    listView2.Columns.Add(s.Name, 50);
}

// 添加数据
foreach (int i in gotoTable.Keys.Select(k => k.Item1).Distinct())
{
    ListViewItem item = new ListViewItem(i.ToString());
    for (int j = 0; j < symbols.Count; j++)
    {
        Symbol s = symbols[j];
        if (s.IsTerminal)
        {
            if (actionTable.ContainsKey(new Tuple<int, Symbol>(i, s)))
            {
                item.SubItems.Add(actionTable[new Tuple<int, Symbol>(i, s)]);
            }
            else
            {
                item.SubItems.Add("");
            }
        }
        else
        {
            if (gotoTable.ContainsKey(new Tuple<int, Symbol>(i, s)))
            {
                item.SubItems.Add(gotoTable[new Tuple<int, Symbol>(i, s)].ToString());
            }
            else
            {
                item.SubItems.Add("");
            }
        }
    }
    listView2.Items.Add(item);
}

listView2.GridLines = true;

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

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