C# 语法分析器:实现句子分析与可视化
public class 语法分析器
{
// ... 其他代码 ...
public void analyse_sentence(string text, selects)
{
this.text = text;
this.select = select;
this.analyse = new Stack<char>();
input = new Stack<char>();
result_analys = new List<string>();
result_input = new List<string>();
result_parse = new List<string>();
analyseresult();
}
void analyseresult()
{
var selects = select.getselects();
analyse.Push('#');
analyse.Push(selects.First().Key[0]);
input.Push('#');
for (int i = text.Length - 1; i >= 0; i--)
input.Push(text[i]);
result_analys.Add(new string(analyse.Reverse().ToArray()));
result_input.Add(new string(input.Reverse().ToArray()));
while (true)
{
//如果分析栈栈顶元素为终结符
if (IsTerminal(analyse.Peek()))
{
//当两个栈都只剩下#时,说明匹配成功
if (analyse.Peek() == input.Peek() && analyse.Count() == 1 && input.Count() == 1)
{
result_parse.Add('成功');
return;
}
if (analyse.Peek() == input.Peek())
{
result_parse.Add(''' + analyse.Peek() + ''匹配');
analyse.Pop();
input.Pop();
result_analys.Add(new string(analyse.Reverse().ToArray()));
result_input.Add(new string(input.Reverse().ToArray()));
continue;
}
else
{
result_parse.Add('失败');
return;
}
}
int flag = 0;
string nofinal = analyse.Peek().ToString();
string final = input.Peek().ToString();
foreach (var parse in selects[nofinal])
{
if (parse.Value.Contains(final))
{
result_parse.Add(nofinal + '->' + parse.Key);
analyse.Pop();
//当推出的产生式不为空时,对分析栈进行添加
if (!parse.Key.Equals('#'))
{
addanalyse(parse.Key);
}
result_analys.Add(new string(analyse.Reverse().ToArray()));
result_input.Add(new string(input.Reverse().ToArray()));
flag = 1;
break;
}
}
//说明该非终结符中没有可推导出该终结符的产生式
if (flag == 0)
{
result_parse.Add('失败');
return;
}
}
}
void addanalyse(String t)
{
for (int i = t.Length - 1; i >= 0; i--)
{
analyse.Push(t[i]);
}
}
static bool IsTerminal(char symbol)
{
return !char.IsUpper(symbol);
}
}
private void button7_Click(object sender, EventArgs e)
{
// 判断输入是否为空
if (string.IsNullOrWhiteSpace(textBox1.Text))
{
MessageBox.Show('输入为空,分析失败');
return;
}
string text = textBox1.Text;
Grammar grammar = new Grammar();
grammar.analyse_sentence(text, select);
listView4.Columns.Clear();
listView4.Items.Clear();
listView4.View = View.Details;
listView4.Columns.Add('步骤', 60, HorizontalAlignment.Center);
listView4.Columns.Add('分析串', 60, HorizontalAlignment.Center);
listView4.Columns.Add('剩余输入串', 80, HorizontalAlignment.Center);
listView4.Columns.Add('推导所用产生式或匹配', 150, HorizontalAlignment.Center);
button8.Enabled = true;
button9.Enabled = true;
}
private void button8_Click(object sender, EventArgs e)
{
if (result_analys.Count == 0 || result_input.Count == 0 || result_parse.Count == 0)
{
MessageBox.Show('请先进行语法分析');
return;
}
int step = listView4.Items.Count + 1;
string analys = result_analys[step - 1];
string input = result_input[step - 1];
string parse = result_parse[step - 1];
ListViewItem item = new ListViewItem(step.ToString());
item.SubItems.Add(analys);
item.SubItems.Add(input);
item.SubItems.Add(parse);
listView4.Items.Add(item);
}
private void button9_Click(object sender, EventArgs e)
{
listView4.Items.Clear();
result_analys.Clear();
result_input.Clear();
result_parse.Clear();
button8.Enabled = false;
button9.Enabled = false;
}
原文地址: https://www.cveoy.top/t/topic/fXNC 著作权归作者所有。请勿转载和采集!