private void button2_Click(object sender, EventArgs e)
{
string[] lines = richTextBox1.Lines;
List nonTerminals = new List();
List terminals = new List();
List productions = new List();
foreach (string line in lines)
{
if (line.Contains("->"))
{
productions.Add(line);
string[] parts = line.Split(new string[] { "->" }, StringSplitOptions.RemoveEmptyEntries);
string left = parts[0].Trim();
if (!nonTerminals.Contains(left))
{
nonTerminals.Add(left);
}
string[] right = parts[1].Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
foreach (string symbol in right)
{
if (!nonTerminals.Contains(symbol) && !terminals.Contains(symbol))
{
terminals.Add(symbol);
}
}
}
}
LR0Parser parser = new LR0Parser(nonTerminals, terminals, productions);
if (parser.IsLR0Grammar())
{
MessageBox.Show("This is a LR0 grammar.");
}
else
{
MessageBox.Show("This is not a LR0 grammar.");
}
}
private void button4_Click(object sender, EventArgs e)
{
string[] lines = richTextBox1.Lines;
List nonTerminals = new List();
List terminals = new List();
List productions = new List();
foreach (string line in lines)
{
if (line.Contains("->"))
{
productions.Add(line);
string[] parts = line.Split(new string[] { "->" }, StringSplitOptions.RemoveEmptyEntries);
string left = parts[0].Trim();
if (!nonTerminals.Contains(left))
{
nonTerminals.Add(left);
}
string[] right = parts[1].Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
foreach (string symbol in right)
{
if (!nonTerminals.Contains(symbol) && !terminals.Contains(symbol))
{
terminals.Add(symbol);
}
}
}
}
LR0Parser parser = new LR0Parser(nonTerminals, terminals, productions);
List itemSets = parser.GetItemSets();
dataGridView1.Rows.Clear();
foreach (LR0ItemSet itemSet in itemSets)
{
dataGridView1.Rows.Add(itemSet.State, itemSet.ToString());
}
}
private void button5_Click(object sender, EventArgs e)
{
string[] lines = richTextBox1.Lines;
List nonTerminals = new List();
List terminals = new List();
List productions = new List();
foreach (string line in lines)
{
if (line.Contains("->"))
{
productions.Add(line);
string[] parts = line.Split(new string[] { "->" }, StringSplitOptions.RemoveEmptyEntries);
string left = parts[0].Trim();
if (!nonTerminals.Contains(left))
{
nonTerminals.Add(left);
}
string[] right = parts[1].Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
foreach (string symbol in right)
{
if (!nonTerminals.Contains(symbol) && !terminals.Contains(symbol))
{
terminals.Add(symbol);
}
}
}
}
LR0Parser parser = new LR0Parser(nonTerminals, terminals, productions);
List itemSets = parser.GetItemSets();
LR0Automaton automaton = new LR0Automaton(itemSets);
List symbols = new List();
symbols.AddRange(terminals);
symbols.AddRange(nonTerminals);
symbols.Add("$");
dataGridView2.Rows.Clear();
foreach (string symbol in symbols)
{
dataGridView2.Columns.Add(symbol, symbol);
}
for (int i = 0; i < automaton.States.Count; i++)
{
dataGridView2.Rows.Add();
dataGridView2.Rows[i].HeaderCell.Value = i.ToString();
for (int j = 0; j < symbols.Count; j++)
{
string action = automaton.GetAction(i, symbols[j]);
int gotoState = automaton.GetGoto(i, symbols[j]);
if (action != null)
{
dataGridView2.Rows[i].Cells[j].Value = action + gotoState.ToString();
}
}
}
}