导航:首页 > 源码编译 > e星号编译原理

e星号编译原理

发布时间:2022-12-24 02:47:37

编译原理中文法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;//标识外层是否是减法,若是,则内层加减互换
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;
}
}
}

② 编译原理这个符号表示什么 如图~~~~

剪头上加一个星号:S-*->aPb
表示从S可以推出含有非终结符P的形如aPb的句型。
剪头上加一个加号:S-+->a
表示从S可以推出终结符a。

③ 编译原理中"(E)"表示什么

字符"(" 表达式 字符")"

④ e=*(S.top-1)是什么意思啊,最好详细一点。而且为什么有个星号呢急需懂啊

看类SqStack的定义
其中变量top和base应该是一个指针
S.top-1表示指针数组中前一个指针
*(S.top-1)表示取该指针所指向的变量的值

这个函数判断是否可以出栈
如果栈空,返回错误
否则,返回栈顶元素

⑤ 编译原理中文法二义性问题

二义性文法

【定义】 若文法中存在这样的句型,它具有两棵不同的语法树,则称该文法是二义性文法。

二义性文法会引起歧义,应尽量避免之!

E E

E + E E * E

i E * E E + E i

i i i i

都可以表示i+i*i

所以G(E):E -> E+E | E*E | (E) | i ;文法具有二义性。

文法二义性的消除:

【方法1】不改变文法的原有规则,加进一些非形式规定。

加进运算符的优先顺序和结合规则对G(E),规定*优于+,*和+服从左结合

【方法2】构造一个等价的无二义性文法,将排除 二义性的规则合并到文法中

G(E) -> G´(E) : E -> E+T | T T -> T*F | F F -> (E) | i ;

⑥ 编译原理求解答案

编译原理是计算机软件专业中的非常重要一门课程。例如:如何把我们编写的高级语言源程序,翻译成机器可执行的目标程序,这个就需要用到编译原理技术。

但是学习编译原理这门课程时,是需要头脑中对编译原理课程中涉及到的所有概念必须是相当清楚的,别人才能够对你的这些问题进行准确的回答。而不是看到这些似曾亲切的内容就敢于回答你的内容的。
故我个人的建议还是:你可以向专门讲授编译原理的老师请教你的问题。
以上就是我很多年前学习编译原理的亲身体会。

⑦ 编译原理中,在文法G中,E'的follow集为什么会含有右括号,题和答案如图,求解答

这个问题中的一个产生式E’→+TE’| e,应该是E->+TE’ |ε这样吧!否则不可能获得如此结果.
关于求follow集合,龙书中说得很清楚,依据三条规则即可:
1、任何FOLLOW(S)都包含输入终止符号,其中S是开始符号.
适用该条,因此FOLLOW(E’)中包含终止符号#.
2、如果存在产生式,A->αBβ,则将FIRST(β)中除ε以外的符号都放入FOLLOW(B)中.
该条不适用,因为在上述所有产生式中不存在形如E‘->αE’β这样的产生式.
3、如果存在产生式,A->αB,或A->αBβ,其中FIRST(β)中包含ε,则将FOLLOW(A)中的所有符号都放入FOLLOW(B)中.
适用该条,因为存在这样的产生式E->+TE’,使得FOLLOW(E’)=FOLLOW(E)成立.而FOLLOW(E)适用上述第二条,根据产生式F→(E)可求得为FOLLOW(E)={#,)}.
综上,FOLLOW(E’)=FOLLOW(E)={#,)}.

⑧ 编译原理 正则语言 二义文法 急~

这个没有一个好老师,自己咬文嚼字看懂是很累的
二义性文法

【定义】 若文法中存在这样的句型,它具有两棵不同的语法树,则称该文法是二义性文法。

二义性文法会引起歧义,应尽量避免之!
G(E):E -> E+E | E*E | (E) | i
这两种展开
E E
E + E E * E
i E * E E + E i
i i i i

都可以表示i+i*i

所以;文法具有二义性。

⑨ 量子力学中波函数右上角的*号是什么意思

你还没有学过复数吧。

*是对复数取复共轭的符号。一个复数分为实部和虚部,复共轭运算后实部不变,虚部变号。

⑩ 编译原理中,(E)是什么意思 E→(E)

这里的括号 就是他自身, 意思就是两个终结符 之间一个表达式就如同 S-> ‘(’ E ‘)’

阅读全文

与e星号编译原理相关的资料

热点内容
gz压缩文件夹 浏览:176
字母h从右往左跑的c语言编程 浏览:127
安卓手机如何拥有苹果手机横条 浏览:765
业余编程语言哪个好学 浏览:137
按照文件夹分个压缩 浏览:104
航空工业出版社单片机原理及应用 浏览:758
如何在电信app上绑定亲情号 浏览:376
安卓的怎么用原相机拍月亮 浏览:805
配音秀为什么显示服务器去配音了 浏览:755
c盘清理压缩旧文件 浏览:325
app怎么交付 浏览:343
图虫app怎么才能转到金币 浏览:175
如何做征文app 浏览:446
用什么app管理斐讯 浏览:169
安卓如何下载宝可梦剑盾 浏览:166
编译器开发属于哪个方向 浏览:940
megawin单片机 浏览:687
以色列加密货币监督 浏览:909
程序员前端现在怎么样 浏览:499
服务器和接口地址ping不通 浏览:557