C# 语法分析器实现:自动推导分析算法
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Syntax_Analysis
{
public partial class Form1 : Form
{
Select select;
public Form1()
{
InitializeComponent();
select = new Select();
}
private void button1_Click(object sender, EventArgs e)
{
string[] productions = richTextBox1.Text.Split('
');
foreach (string production in productions)
{
if (production.Trim().Length != 0)
{
select.addproduction(production.Trim());
}
}
MessageBox.Show("添加完成");
}
private void button2_Click(object sender, EventArgs e)
{
listView1.Items.Clear();
var selects = select.getselects();
foreach (var select in selects)
{
ListViewItem item = new ListViewItem(select.Key);
item.SubItems.Add(select.Value.Keys.First());
item.SubItems.Add(string.Join(",", select.Value.Values.First()));
listView1.Items.Add(item);
}
}
private void button3_Click(object sender, EventArgs e)
{
string text = richTextBox2.Text;
analyse_sentence analyse = new analyse_sentence(text, select);
listView2.Items.Clear();
listView3.Items.Clear();
listView4.Items.Clear();
for (int i = 0; i < analyse.result_analys.Count; i++)
{
ListViewItem item1 = new ListViewItem((i+1).ToString());
item1.SubItems.Add(analyse.result_analys[i]);
listView2.Items.Add(item1);
ListViewItem item2 = new ListViewItem((i + 1).ToString());
item2.SubItems.Add(analyse.result_input[i]);
listView3.Items.Add(item2);
ListViewItem item3 = new ListViewItem((i + 1).ToString());
item3.SubItems.Add(analyse.result_parse[i]);
listView4.Items.Add(item3);
}
}
private void button4_Click(object sender, EventArgs e)
{
richTextBox1.Text = "";
select.clear();
MessageBox.Show("清空完成");
}
private void button5_Click(object sender, EventArgs e)
{
richTextBox2.Text = "";
}
private void button6_Click(object sender, EventArgs e)
{
listView1.Items.Clear();
}
private void button7_Click(object sender, EventArgs e)
{
//添加分析表达式
string[] productions = richTextBox1.Text.Split('
');
foreach (string production in productions)
{
if (production.Trim().Length != 0)
{
select.addproduction(production.Trim());
}
}
//获取需要分析的句子
string text = richTextBox2.Text;
//进行句子分析
analyse_sentence analyse = new analyse_sentence(text, select);
//将分析结果添加到listView4中
listView4.Items.Clear();
for (int i = 0; i < analyse.result_parse.Count; i++)
{
ListViewItem item = new ListViewItem((i + 1).ToString());
item.SubItems.Add(analyse.result_parse[i]);
listView4.Items.Add(item);
}
}
private void button8_Click(object sender, EventArgs e)
{
//清空分析表达式
select.clear();
//清空listView1中的内容
listView1.Items.Clear();
}
private void button9_Click(object sender, EventArgs e)
{
//清空需要分析的句子
richTextBox2.Text = "";
//清空listView2、listView3、listView4中的内容
listView2.Items.Clear();
listView3.Items.Clear();
listView4.Items.Clear();
}
}
}
上述代码完成了基本的语法分析功能,包括添加分析表达式、显示分析表达式、分析句子以及清空相关信息。
注意:
Select类用于存储分析表达式,需要根据实际情况进行实现。analyse_sentence类用于执行自动推导分析,并存储分析结果。Form1类包含了界面相关的代码,用于与用户交互。
使用方法:
- 在
richTextBox1中输入分析表达式,每个表达式占一行。 - 点击 "添加分析表达式" 按钮将表达式添加到
select对象中。 - 点击 "显示分析表达式" 按钮将
select对象中的表达式显示在listView1中。 - 在
richTextBox2中输入需要分析的句子。 - 点击 "分析句子" 按钮执行分析,并将分析结果显示在
listView4中。 - 可以点击 "清空分析表达式"、"清空句子" 以及 "清空结果" 按钮分别清空对应的内容。
示例:
分析表达式:
S->AB
A->a
B->b
句子:
ab
分析结果:
S->AB
AB->aB
aB->ab
成功
原文地址: https://www.cveoy.top/t/topic/oyjw 著作权归作者所有。请勿转载和采集!