namespace byyljxfzxt public partial class Form5 Form public Form5 InitializeComponent; private ListProduction productions = new ListProduction;
// 判别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 著作权归作者所有。请勿转载和采集!