C# 语法分析器:使用栈实现句子分析
public class SentenceAnalyzer
{
private string text;
private Dictionary<string, Dictionary<char, string>> select;
private Stack<char> analyse;
private Stack<char> input;
private List<string> result_analys;
private List<string> result_input;
private List<string> result_parse;
public SentenceAnalyzer(string text, Dictionary<string, Dictionary<char, string>> selects)
{
this.text = text;
this.select = selects;
this.analyse = new Stack<char>();
this.input = new Stack<char>();
this.result_analys = new List<string>();
this.result_input = new List<string>();
this.result_parse = new List<string>();
AnalyzeResult();
}
private void AnalyzeResult()
{
analyse.Push('#');
analyse.Push(select.Keys.First()[0]);
input.Push('#');
for (int i = text.Length - 1; i >= 0; i--)
{
input.Push(text[i]);
}
result_analys.Add(GetString(analyse));
result_input.Add(GetString(input));
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(GetString(analyse));
result_input.Add(GetString(input));
continue;
}
else
{
result_parse.Add('失败');
return;
}
}
int flag = 0;
string nofinal = analyse.Peek().ToString();
string final = input.Peek().ToString();
foreach (var parse in select[nofinal])
{
if (parse.Value.Contains(final))
{
result_parse.Add($'{nofinal}->{parse.Key}');
analyse.Pop();
if (parse.Key != '#')
{
AddAnalyse(parse.Key);
}
result_analys.Add(GetString(analyse));
result_input.Add(GetString(input));
flag = 1;
break;
}
}
if (flag == 0)
{
result_parse.Add('失败');
return;
}
}
}
private void AddAnalyse(string t)
{
for (int i = t.Length - 1; i >= 0; i--)
{
analyse.Push(t[i]);
}
}
private static bool IsTerminal(char symbol)
{
return !char.IsUpper(symbol);
}
private string GetString(Stack<char> stack)
{
return new string(stack.Reverse().ToArray());
}
}
// 在button9_Click事件处理程序中使用SentenceAnalyzer类
private void button9_Click(object sender, EventArgs e)
{
listView4.Items.Clear();
SentenceAnalyzer analyzer = new SentenceAnalyzer(textBox1.Text, production);
for (int i = 0; i < analyzer.result_analys.Count; i++)
{
ListViewItem item = new ListViewItem((i + 1).ToString());
item.SubItems.Add(analyzer.result_analys[i]);
item.SubItems.Add(analyzer.result_input[i]);
item.SubItems.Add(analyzer.result_parse[i]);
listView4.Items.Add(item);
}
}
原文地址: https://www.cveoy.top/t/topic/fXN9 著作权归作者所有。请勿转载和采集!