導航:首頁 > 源碼編譯 > 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星號編譯原理相關的資料

熱點內容
蘋果手機文檔安卓上怎麼打開 瀏覽:521
如何做淘寶代理伺服器 瀏覽:662
gz壓縮文件夾 瀏覽:177
字母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