永发信息网

编译原理中文法G[E]:E::=E+T|T T::=T*F|F F::=(E)|i输入输出的程序实现代码,急!!!!!

答案:1  悬赏:20  手机版
解决时间 2021-03-19 22:05
编译原理中文法G[E]:E::=E+T|T T::=T*F|F F::=(E)|i输入输出的程序实现代码,急!!!!!
最佳答案
我这里有个差不多的,不过加减乘除都有namespace 递归下降调用子程序法

你给我邮箱发个邮件 我吧程序法给你吧
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
textBox2.Select();
}
// A → BC
// C → (+|-)BC | ε
// B → ED
// E → (A)| i
// D → *ED | ε
private Stack<char> st = new Stack<char>();
bool j_j = false;//标识外7a64e58685e5aeb931333264653364层是否是减法,若是,则内层加减互换
bool c_c = false;//标识乘除的
private float A()
{
result += "A → BC\n";
float m = B();
if (st.Count != 0)
{
if (st.Peek() == '+')
{
return m + C();
}
else
if (st.Peek() == '-')
{
j_j = true;
return m - C();
}
else
{
C();
return m;
}
}
C();
return m;

}
private float B()
{
result += "B → ED\n";
float m = E();
if (st.Count != 0 && st.Peek() == '*')
return m * D();
else
if (st.Count != 0 && st.Peek() == '/')
{
c_c = true;
return m/D() ;
}
else
{
D();
return m;
}
}
private float C()
{
if (st.Count == 0)
result += "C →ε\n";
else
if (st.Peek() == '+' || st.Peek() == '-')
{
result += "C→" + st.Pop() + "BC\n";

float m = B();
if (st.Count != 0 && st.Peek() == '+')
{
if (j_j)//外层减法
{
j_j = false;//内层
return m - C();
}
else
return m + C();
}
else
if (st.Count != 0 && st.Peek() == '-')
{
if (j_j)
{
return m + C();
}
else
{
j_j = true;
return m - C();
}
}
else
{
C();
return m;
}
}
else //if(st.Peek()
result += "C →ε\n";
return 0;
}
private float D()
{
if (st.Count == 0)
{
result += "D →ε\n";
return 0;
}
if ((st.Peek() == '*') || (st.Peek() == '/'))
{
result += "D→" + st.Pop() + "ED\n";

float m = E();
if (st.Count != 0 && st.Peek() == '*')
{
if (c_c)
{
c_c = false;
return m / D();
}
else
return m * D();
}
else
if (st.Count != 0 && st.Peek() == '/')
{
if (c_c)
{
return m * D();
}
else
{
c_c = true;
return m / D();
}
}
else
{
D();
return m;
}
}
else
{
result += "D →ε\n";
}
return 0;
}
private float E()
{
if (st.Count == 0)
{
result += "错误,结尾应有数字或'('\n";
return 0;
}
if (isdigit(st.Peek()))
{
result += "E→i\n";
float num = 0;
while (st.Count != 0 && isdigit(st.Peek()))
{
num = num * 10 + float.Parse(st.Pop().ToString());
}
return num;
}
else
if (st.Peek() == '(')
{
result += "E→(A)\n";
st.Pop();
float m = A();
if (st.Count != 0)
{
if (st.Peek() == ')')
{
st.Pop();
}
else
result += "非法字符!";
}
else
result += "缺少“)”";

return m;
}
else
result += "错误,第" +(codeLength- st.Count+1).ToString() + "个字应有数字或'('\n";
return 0;
}
private bool isdigit(char d)
{
return d >= '0' && d <= '9';
}
private string result;
private int codeLength;
private void startbtn_Click(object sender, EventArgs e)
{
j_j = false;
c_c = false;
result = "";
label2.Text = "";
string s = textBox2.Text;
codeLength = textBox2.Text.Length;
for (int i = s.Length - 1; i >= 0; i--)
{
st.Push(s[i]);
}
string res = null;
try
{
res = A().ToString();
}
catch (Exception e1)
{
label2.Text = "出现错误:" + e1.Message;
return;
}
if (st.Count != 0)
label2.Text += result + "第" + (textBox2.Text.Length - st.Count + 1) + "个字符处有错误,请仔细查看\n";
else
label2.Text += result + "最终结果是:" + res;
}
}
}
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
石家庄北国对面的峨眉小镇现在怎么样呀?环境
《西湖》袁宏道 中"余游西湖始此"有什么言外
谁知道葡萄牙语“我是猪”怎么讲?
秦岭九龙潭风景区有什么好玩的?
有一桶水,连水加桶共重16kg,用去一半后还剩
怎么把人撂倒
Q弹芋圆的做法怎么做
英语中动词不定式的结构是什么样?都是to+...
电喷车的尿素液很费
安夷路/南环路(路口)我想知道这个在什么地方
杭州方少电子商务有限公司怎么样??
小明买了一盒东西老板找了5块,买两盒差14块,
诗词中形容男子美好
梦见自己救了别人
亚洲100米谁跑得最快
推荐资讯
徇私读音是什么
每月销售报表怎么做(很急用) 10分
武汉的桥是什么
云阳纹眉眉去那里好
快速食品、饮料进火车上卖,找什么火车站的那
一群大雁什么地飞在蓝天上?
春秋时期,越国的朝臣如何自称?老臣么?
旧制一两等于几钱
沧州明凯市政工程有限公司怎么去啊,有知道地
上古卷轴5科万琼德不显示已清理
奇鱼夫富硒烤鱼这个地址在什么地方,我要处理
遇到电脑显示"No sound device found"要怎样
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?