📄 yufa.cs
字号:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace 语法分析042791
{
public partial class yufa : Form
{
//临时存放读入的内容
public char[] Arrayget = null;
//存放算符优先表
char[,] table = new char[10,9];
//变量
int i,j,k,l,m,s;
//判断标志符
int flag = -1;
int vt=0;
int t=0;
int find=-1;
//栈
char[] zhan = new char[50];
//指向下一个要读入的字符
char temp=' ';
//临时标志
char op=' ';
public yufa()
{
InitializeComponent();
}
//得到相应字符在优先表中的索引值
public int getid(char a)
{
int n;
for (n = 1; n < 9;n++ )
{
if (a == table[0, n]) //找到则返回索引
{
return n;
}
}
return 0;
}
private void Bfenxi_Click(object sender, EventArgs e)
{
TOut.Text = null;
string str= null;
str=T1.Text.ToString();
str = str + T2.Text.ToString();
str = str + T3.Text.ToString();
str = str + T4.Text.ToString();
str = str + T5.Text.ToString();
str = str + T6.Text.ToString();
str = str + T7.Text.ToString();
str = str + T8.Text.ToString(); //读入终结符
Arrayget = str.ToCharArray();
for (i = 1; i <= Arrayget.Length; i++)
table[0, i] = Arrayget[i - 1]; //终结符存入table表
str = T9.Text.ToString().Trim();
str = str + T10.Text.ToString();
str = str + T11.Text.ToString();
str = str + T12.Text.ToString();
str = str + T13.Text.ToString();
str = str + T14.Text.ToString();
str = str + T15.Text.ToString();
str = str + T16.Text.ToString(); //读入列向终结符
Arrayget = str.ToCharArray();
for (i = 1; i <= Arrayget.Length; i++)
table[9, i] = Arrayget[i - 1]; //终结符存入table表
for (i = 1; i <= Arrayget.Length; i++) //校对终结符的输入行列方向是否符合
{
if (table[0, i] != table[9, i])
{
MessageBox.Show(" 输入的终结符行向与列向不符,请重新校对输入 !");
flag = 0;
break;
}
else flag = 1;
}
if (flag == 1) //非终结符输入合法
{
str = a11.Text.ToString();
str = str + a12.Text.ToString();
str = str + a13.Text.ToString();
str = str + a14.Text.ToString();
str = str + a15.Text.ToString();
str = str + a16.Text.ToString();
str = str + a17.Text.ToString();
str = str + a18.Text.ToString();
Arrayget = str.ToCharArray();
for (i = 1; i <= Arrayget.Length; i++)
table[1, i] = Arrayget[i - 1]; //第1行优先级存入table表
str = a21.Text.ToString();
str = str + a22.Text.ToString();
str = str + a23.Text.ToString();
str = str + a24.Text.ToString();
str = str + a25.Text.ToString();
str = str + a26.Text.ToString();
str = str + a27.Text.ToString();
str = str + a28.Text.ToString();
Arrayget = str.ToCharArray();
for (i = 1; i <= Arrayget.Length; i++)
table[2, i] = Arrayget[i - 1]; //第2行优先级存入table表
str = a31.Text.ToString();
str = str + a32.Text.ToString();
str = str + a33.Text.ToString();
str = str + a34.Text.ToString();
str = str + a35.Text.ToString();
str = str + a36.Text.ToString();
str = str + a37.Text.ToString();
str = str + a38.Text.ToString();
Arrayget = str.ToCharArray();
for (i = 1; i <= Arrayget.Length; i++)
table[3, i] = Arrayget[i - 1]; //第3行优先级存入table表
str = a41.Text.ToString();
str = str + a42.Text.ToString();
str = str + a43.Text.ToString();
str = str + a44.Text.ToString();
str = str + a45.Text.ToString();
str = str + a46.Text.ToString();
str = str + a47.Text.ToString();
str = str + a48.Text.ToString();
Arrayget = str.ToCharArray();
for (i = 1; i <= Arrayget.Length; i++)
table[4, i] = Arrayget[i - 1]; //第4行优先级存入table表
str = a51.Text.ToString();
str = str + a52.Text.ToString().Trim();
str = str + a53.Text.ToString().Trim();
str = str + a54.Text.ToString().Trim();
str = str + a55.Text.ToString().Trim();
str = str + a56.Text.ToString().Trim();
str = str + a57.Text.ToString().Trim();
str = str + a58.Text.ToString().Trim();
Arrayget = str.ToCharArray();
for (i = 1; i <= Arrayget.Length; i++)
table[5, i] = Arrayget[i - 1]; //第5行优先级存入table表
str = a61.Text.ToString();
str = str + a62.Text.ToString();
str = str + a63.Text.ToString();
str = str + a64.Text.ToString();
str = str + a65.Text.ToString();
str = str + a66.Text.ToString();
str = str + a67.Text.ToString();
str = str + a68.Text.ToString();
Arrayget = str.ToCharArray();
for (i = 1; i <= Arrayget.Length; i++)
table[6, i] = Arrayget[i - 1]; //第6行优先级存入table表
str = a71.Text.ToString();
str = str + a72.Text.ToString();
str = str + a73.Text.ToString();
str = str + a74.Text.ToString();
str = str + a75.Text.ToString();
str = str + a76.Text.ToString();
str = str + a77.Text.ToString();
str = str + a78.Text.ToString();
Arrayget = str.ToCharArray();
for (i = 1; i <= Arrayget.Length; i++)
table[7, i] = Arrayget[i - 1]; //第7行优先级存入table表
str = a81.Text.ToString();
str = str + a82.Text.ToString();
str = str + a83.Text.ToString();
str = str + a84.Text.ToString();
str = str + a85.Text.ToString();
str = str + a86.Text.ToString();
str = str + a87.Text.ToString();
str = str + a88.Text.ToString();
Arrayget = str.ToCharArray();
for (i = 1; i <= Arrayget.Length; i++)
table[8, i] = Arrayget[i - 1]; //第8行优先级存入table表 优先级表构造完毕
//读入要分析的句子
str = Code.Text.ToString().Trim();
if (str.Length == 0)
{
MessageBox.Show("请输入要分析的句子");
}
string getin = str;
str = str + "#" + "!";
Arrayget = str.ToCharArray();
//句子输入不合法,报错
for (k = 0; k <= Arrayget.Length - 3; k++)
{
for (i = 1; i <= 8; i++)
{
if (Arrayget[k] == table[0, i])
{
find = 1;
break;
}
else
find = 0;
}
if (find == 0)
{
MessageBox.Show("输入的句子中含有未在优先表中定义的终结符!");
break;
}
}
//分析归约
k = 0;
zhan[k] = '#';
i = 0;
string putout = null;
putout = "输入的句子为: " + getin+ "\r\n";
putout = putout + "要分析的句子是: #" + getin + "# \r\n\r\n";
putout = putout + " 栈的内容为: #\r\n\r\n";
string arr;
do
{
arr = null;
temp = Arrayget[i]; //存放要读入的下一个字符
putout = putout + "将要读入的字符 " + temp+"\r\n";
vt = 0;
for (l = 1; l <= 8; l++)
{
if (zhan[k] == table[0, l])
{
j = k;
vt = 1;
break;
}
} // 查询zhan[k]是否是终结符,是则j=k,记录起点
if (vt == 0)
{
j = k - 1;
}// 是非终结符,则j=k-1,即跳过这个非终结符,以他前面的终结符为记录起点
while (table[getid(zhan[j]), getid(temp)] == '>')//比较起点与要读入的temp的优先级,若起点的优先级高
{
do
{
op = zhan[j]; //op暂存起点
t = 0;
for (l = 1; l <= 8; l++)
{
if (zhan[j - 1] == table[0, l])
{
j = j - 1;
t = 1;
break;
} //查询zhan[j-1]是否是终结符,是则j=j - 1,j-1成为新起点
}
if (t == 0)
{
j = j - 2; //不是,则再向前查询
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -