C#实现语法分析器:解析句子结构
using System;
using System.Collections.Generic;
using System.Windows.Forms;
namespace 语法分析器
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private analyse_sentence analyse;
private void button7_Click(object sender, EventArgs e)
{
Select select = new Select();
analyse = new analyse_sentence(textBox1.Text, select);
listView4.Items.Clear();
for (int i = 0; i < analyse.result_analys.Count; i++)
{
ListViewItem item = new ListViewItem(new string[] { analyse.result_analys[i], analyse.result_input[i], '' });
listView4.Items.Add(item);
}
}
private void button8_Click(object sender, EventArgs e)
{
if (analyse != null && analyse.result_parse.Count > 0)
{
ListViewItem item = listView4.Items[analyse.result_parse.Count - 1];
item.SubItems[2].Text = analyse.result_parse[analyse.result_parse.Count - 1];
}
}
private void button9_Click(object sender, EventArgs e)
{
if (analyse != null)
{
for (int i = 0; i < analyse.result_parse.Count; i++)
{
ListViewItem item = listView4.Items[i];
item.SubItems[2].Text = analyse.result_parse[i];
}
}
}
}
class analyse_sentence
{
string text;
Select select;
Stack analyse;
Stack input;
public List<string> result_analys;
public List<string> result_input;
public List<string> result_parse;
public analyse_sentence(string text, Select select)
{
this.text = text;
this.select = select;
this.analyse = new Stack();
input = new Stack();
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(analyse.getString());
result_input.Add(input.getString());
while (true)
{
//如果分析栈栈顶元素为终结符
if (IsTerminal(analyse.peek()))
{
//当两个栈都只剩下#时,说明匹配成功
if (analyse.peek() == input.peek() && analyse.length() == 1 && input.length() == 1)
{
result_parse.Add('成功');
return;
}
if (analyse.peek() == input.peek())
{
result_parse.Add(''' + analyse.peek() + ''匹配');
analyse.pop();
input.pop();
result_analys.Add(analyse.getString());
result_input.Add(input.getString());
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(analyse.getString());
result_input.Add(input.getString());
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);
}
}
}
原文地址: https://www.cveoy.top/t/topic/fXKe 著作权归作者所有。请勿转载和采集!