導航:首頁 > 源碼編譯 > 編譯原理文法梯度

編譯原理文法梯度

發布時間:2022-05-09 16:23:24

編譯過程分為哪幾個階段各階段的遵循的原則、識別機構、使用的文法編譯原理

編譯原理中的遍概念
編譯階段也常常劃分為兩大步驟,分析步驟和綜合步驟 分析步驟和綜合步驟 分析步驟是指對源程序的分析 -線性分析(詞法分析或掃描) -層次分析(語法分析) -語義分析 綜合步驟是指後端的工作,為目標程序的生成而進行的綜合

你分析過嗎?若按照這種組合方式實現編譯程序,可以設想,某一編譯程序的前端加上相應不同的後 端則可以為不同的機器構成同一個源語言的編譯程序。也可以設想,不同語言編譯的前端生成同一種中間 語言,再使用一個共同的後端,則可為同一機器生成幾個語言的編譯程序。

一個編譯過程可由一遍、兩遍或多遍完成。所謂"遍",也稱作"趟",是對源程序或其等價的中間語言程 序從頭到尾掃視並完成規定任務的過程。每一遍掃視可完成上述一個階段或多個階段的工作。例如一遍可 以只完成詞法分析工作;一遍完成詞法分析和語法分析工作;甚至一遍完成整個編譯工作。對於多遍的編 譯程序,第一遍的輸入是用戶書寫的源程序,最後一遍的輸出是目標語言程序,其餘是上一遍的輸出為下 一遍的輸入。

在實際的編譯系統的設計中,編譯的幾個階段的工作究竟應該怎樣組合,即編譯程序究竟分成幾遍, 參考的因素主要是源語言和機器(目標機)的特徵。比如源語言的結構直接影響編譯的遍的劃分;像 PL/1 或 ALGOL 68 那樣的語言,允許名字的說明出現在名字的使用之後,那麼在看到名字之前是不便為包含該名 字的表達式生成代碼的,這種語言的編譯程序至少分成兩遍才容易生成代碼。另外機器的情況,即編譯程 序工作的環境也影響編譯程序的遍數的劃分。遍數多一點,整個編譯程序的邏輯結構可能清晰些,但遍數 多即意味著增加讀寫中間文件的次數,勢必消耗較多時間,一般會比一遍的編譯要慢。

❷ 編譯原理中,形式語言里怎麼區分2型文法與3型文法

二型文法如下:
S->Ac
S->Sc
A->ab
A->aAb
三型文法如下:
S->aS
A->bA
B->cB
B->c
A->Bb
A、2型文法是上下文無關文法,表現在產生式上就是產生式的左部只有一個非終結符;3型文法從廣義上講包括左線形文法、右線形文法和正規文法 。
B、左線形文法產生式的右部要麼沒有非終結符,如果有非終結符也只能有一個,且必須位於產生式右部的最左端。
C、右線形文法產生式的右部要麼沒有非終結符,如果有非終結符也只能有一個,且必須位於產生式右部的最右端 。
D、正規文法是右線形文法的一個子集,其產生式右部只有三種情況:
1)空串
2)只有一個終結符
3)只有一個終結符後接一個非終結符
E、所有的3型文法都是2型文法。

❸ 在編譯原理中: 文法S——>SS+|SS*|a能產生什麼語言,並驗證! 求高人指導!

為了使問題簡化,我們考慮文法S->ss+|a,考慮s->ss*時,只要把+換成*即可。
0層遞歸是,s->a,文法的語言是{a}。是後綴表達式。
1層以內遞歸時,文法語言是{a,aa+}。是後綴表達式。
2層以內遞歸時,文法語言是{a,aa+}.{a,aa+}.{+}。其中.表示連接,是後綴表達式。
依此類推,多少層的遞歸都是後綴表達式。
把表達式的+換成*後依然為後綴表達式。
下面證明文法產生的語言是所有的以a為變數,以+和*為運算符的後綴表達式。
因為每個表達式都對應一個常規的表達式(如1*2+3就是常規表達式),下面只需證明語言能產生的後綴表達式對應所有的常規表達式。當常規表達式只有一個運算符,對應aa+或aa*。當常規表達式有兩個運算符,可寫成(表達式1).{+|*}.(表達式2),因為表達式1和2都只含一個運算符,所以可以用語言表示,上述常規表達式可用後綴表達式(表達式1).(表達式2).{+l*}表示。所以不管常規表達式有多少個運算符,都可以由語言的後綴表達式對應。

❹ 編譯原理的文法是什麼

文法是描述語言規則的形式規則。實際上就是用一個四元組G=(VT,VN,S,P)定義的一個推理方式。其中VT是終結符,VN是非終結符,S是開始符號,P是一組產生規則。

❺ 編譯原理這門課程第三章語法分析的知識點有哪些

編譯原理這門課第三章語法分析的知識點包含章節導引,第一節上下文無關文法,第二節語言和文法,第三節自上而下分析,第四節自下而上分析,第五節LR分析器,第六節二義文法的應用,課後練習,。

❻ 編譯原理,文法G1是不是算符優先文法

G1是算符優先文法,它是1)不含空產生式的上下文無關文法,2)沒有形如U-->...VW...其中V,W屬於非終結符。
0)S'->#S#
1)S->S-T
2)S->T
3)T->T/F
4)T->F
5)F->(S)
6)S->e
1. 找到『=』關系
由0和5得 #=# (=)
2. 找到」<「關系
#S,則:#<FirstVT(S)
-T,則:-<FirstVT(T)
/F,則:/<FirstVT(F)
(S,則:(<<FirstVT(S)
3. 找到」>「關系
S# ,則:LastVT(S)>#
S-,則:LastVT(S)>-
T/,則:LastVT(T)>/
S),則:LastVT(S)>)

S'的FirstVT={ # } LastVT = { # }
S的FirstVT={- / ( e} LastVT = { - / ) e}
T的FirstVT= { /( e} LastVT = { /) e}
F的FirstVT= { ( e} LastVT = { ) e}
| - | / | ( | ) | e | #
- | > | < | < | > | < |>
/ | > | > | < | > | < |>
( | < | < | < | = | < |>
) | > | > | | > | |
e | > | > | | > | |>
# | < | < | < | | < |=
證明:任意二個終結符間至多隻有一種算符優先關系存在,所以該文法為算符優先文法。

❼ 編譯原理中 文法 文法G定義為四元組(Vn ,Vt,P,S)這4個是什麼意思 另外 終結符和非終結符是什麼意思

文法G是一個四元式(Vt,Vn,S,P)
其中Vt是一個非空有限集,它的每個元素稱為終結符號
Vn是一個非空有限集,它的每個元素稱為非終結符號(Vt和Vn的交集為空)
S是一個非終結符號,稱為開始符號
P是一個產生式集合(有限),每個產生式的形式是P-->a

開始S必須在某個產生式的左部出現一次

終結符指組成語言的基本符號(如基本字、標識符、常數、算符、界符)
非終結符號(也稱語法變數)表示一定符號串的集合。

你看到小寫字母一般是終結符,大寫字母肯定是非終結符

不明白可以聯系。

❽ 編譯原理:考慮文法G[S]

考慮文法:
(1)消去左遞歸後:
S→a|∧|(T)
T→ST』
T』 →,ST』|ε
(2)計算每個非終結符的FIRST集合和FOLLOW集合:
FIRST(S)={a,∧,(}
FIRST(T)={ a,∧,(}
FIRST(T』)={,ε}
FOLLOW(S)={,#}
FOLLOW(T)={ )}
FOLLOW(T』)={ )}
預測分析表如下:
\x09a\x09∧\x09(\x09)\x09,\x09#
S\x09S→a\x09S→∧\x09S→(T)\x09\x09\x09
T\x09T→ST』\x09T→ST』\x09T→ST』\x09\x09\x09
T』\x09\x09\x09\x09T』 →ε\x09T』 →,ST』\x09
構造的預測分析表中沒有多重入口,所以改造後的文法是LL(1)文法.

❾ 編譯原理文法分析

改完了,能文法分析出來了!!
大概 跟你說下 你的錯誤吧:
出錯地點:
1.聲明的stack[50]沒有初始化;
2.stack的入棧是錯誤的,按照你的方式,如果原來有TM,再加入T->FN,則M就被擠出來了.(這里很關鍵,你對照我給你改的再看看)
3.s指針在你入棧操作以後並沒有指向棧頂,而是保持了不變,這肯定是有問題的.(傳入push函數的時候直接傳參數s就好了.)
4.if(*s==*p){***}else{}的else的右括弧管轄的范圍 有錯誤

不嫌棄的話,可以去http://blog.csdn.net/fangguanya,我的BLOG,不怎麼充實,呵呵,有這個程序的運行結果的. 謝謝 呵呵.
總之你對照我給你改的再看看吧. 我把我的測試輸出 也給保留了.你好對照點.
(PS.我用的vs2005,用的時候你改下頭申明,其他一樣)

// grammar.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include<iostream>
using namespace std;

char * spush(char *stack,char *pt);
bool analyse(char *p);

void main()
{
//將分析串存放在二維數組中
char input[5][10]={"i+i#",
"i*(i+i)#",
"i*i+i#",
"i+*#",
"+i*i#"};
bool flag; //定義一個布爾型的標記量
for(int h=0;h<5;++h)
{
flag=analyse(input[h]);
if(flag) cout<<"恭喜你!"<<input[h]<<"語法分析成功,合法!"<<endl;
else cout<<"對不起!"<<input[h]<<"語法分析失敗,非法!"<<endl;
}
int aaa;
cin>>aaa;
}
//定義各一將串逆序入棧的函數
char * spush(char *stack,char *pt)
{
int l=0;
//while循環的作用是將指針指向字元串的末尾,然後再由後向前入棧,從而實現逆序
while(*pt!='\0')
{
pt++;
l++;
}

if (*stack == '#')
{
stack++;
}
while(l)
{
pt--;
char cTempIntoStack = (*pt);
*stack=cTempIntoStack;
stack++;
l--;
}
stack--; //由於前面向前加了一位,要返回
////////////////
return stack;
///////////////////////////////////

}

/*LL(1)分析表
i + * ( ) #
E TM +TM
F i (E)
M TM e e
N e *FN e e
T FN FN
*/

//分析函數
bool analyse(char *p){
char analyseTable[5][6][4]={
"TM", "", "", "TM", "", "",
"i", "", "", "(E)", "", "",
"", "+TM", "", "", "e", "e",
"", "e", "*FN", "", "e", "e",
"FN", "", "", "TN", "", ""
};
char *stack = new char[50]; //定義一個棧空間
for (int iStack = 0;iStack<50 ;iStack++)
{
stack[iStack] = 0;
}
char *s=stack; //用指針*s指向棧的起始地址
*s='#'; //將「#」入棧
s++; //指針加1
*s='E'; //將「E」入棧
//下面的while循環實現字元串的詞法分析操作

int count = 0;

while(*s!='#' || *p!='#'){
count++;
char * temp = s;
cout<<"NO."<<count<<endl;
cout<<"STACK"<<endl;
while (*temp != '#')
{
cout<<*temp<<" ";
temp--;
}
cout<<endl;

int x,y;
//若果棧頂數據和分析串的字元匹配,則將符號棧的棧頂數據出棧(即將棧頂指針減1)
if(*s==*p){
cout<<"Before :"<<*s<<endl;
s--;
p++;
cout<<"After :"<<*s<<endl;
}
//當符號棧和分析串的字元不匹配時,查分析表
else {
switch(*s){
case 'E':x=0;break;
case 'F':x=1;break;
case 'M':x=2;break;
case 'N':x=3;break;
case 'T':x=4;break;
default:return false;
}
switch(*p){
case 'i':y=0;break;
case '+':y=1;break;
case '*':y=2;break;
case '(':y=3;break;
case ')':y=4;break;
case '#':y=5;break;
default:return false;
}
//若果對應的為空,則分析串非法,退出
if(analyseTable[x][y][0]=='\0') return false;
//若查表所對應的為'e',則將符號棧的棧頂數據出棧
else if(analyseTable[x][y][0]=='e') s--;
//其它,這時將查表所得的項逆序入符號棧
else {
s=spush(s,analyseTable[x][y]);
}
}
}
return true; //分析成功,返回
}

閱讀全文

與編譯原理文法梯度相關的資料

熱點內容
梁箍筋未標注加密區 瀏覽:627
自家網路連不上上面顯示加密 瀏覽:386
編譯後無法運行圖片 瀏覽:592
linux系統修改文件命令 瀏覽:702
iphone如何安裝中國石化app 瀏覽:176
app怎麼寫簡歷 瀏覽:680
金蝶kis雲app怎麼樣 瀏覽:708
cad命令xr 瀏覽:295
f如何設置ftp伺服器 瀏覽:833
編程題兔子生兔子python 瀏覽:421
加密數字卡專利申請 瀏覽:783
我的世界命令方塊該怎麼拿 瀏覽:785
浙江容錯伺服器廠家雲空間 瀏覽:196
linuxpython3idle 瀏覽:741
程序員成就感從哪來 瀏覽:547
游資抄底源碼公式 瀏覽:804
用VF命令 瀏覽:950
解壓速度14m 瀏覽:332
php獲取httpheader 瀏覽:301
什麼軟體可以修改pdf文件 瀏覽:869