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; //分析成功,返回
}
2. 求編譯原理的名詞解釋題
詞法分析(Lexical analysis或Scanning)和詞法分析程序(Lexical analyzer或Scanner)
詞法分析階段是編譯過程的第一個階段。這個階段的任務是從左到右一個字元一個字元地讀入源程序,即對構成源程序的字元流進行掃描然後根據構詞規則識別單詞(也稱單詞符號或符號)。詞法分析程序實現這個任務。詞法分析程序可以使用lex等工具自動生成。
語法分析(Syntax analysis或Parsing)和語法分析程序(Parser)
語法分析是編譯過程的一個邏輯階段。語法分析的任務是在詞法分析的基礎上將單詞序列組合成各類語法短語,如「程序」,「語句」,「表達式」等等.語法分析程序判斷源程序在結構上是否正確.源程序的結構由上下文無關文法描述.
語義分析(Syntax analysis)
語義分析是編譯過程的一個邏輯階段. 語義分析的任務是對結構上正確的源程序進行上下文有關性質的審查, 進行類型審查.例如一個C程序片斷:
int arr[2],b;
b = arr * 10;
源程序的結構是正確的.
語義分析將審查類型並報告錯誤:不能在表達式中使用一個數組變數,賦值語句的右端和左端的類型不匹配.
Lex
一個詞法分析程序的自動生成工具。它輸入描述構詞規則的一系列正規式,然後構建有窮自動機和這個有窮自動機的一個驅動程序,進而生成一個詞法分析程序.
Yacc
一個語法分析程序的自動生成工具。它接受語言的文法,構造一個LALR(1)分析程序.因為它採用語法制導翻譯的思想,還可以接受用C語言描述的語義動作,從而構造一個編譯程序. Yacc 是 Yet another compiler compiler的縮寫.[回頁首]
源語言(Source language)和源程序(Source program)
被編譯程序翻譯的程序稱為源程序,書寫該程序的語言稱為源語言.[回頁首]
目標語言(Object language or Target language)和目標程序(Object program or Target program)
編譯程序翻譯源程序而得到的結果程序稱為目標程序, 書寫該程序的語言稱為目標語言.[回頁首]
中間語言(中間表示)(Intermediate language(representation))
在進行了語法分析和語義分析階段的工作之後,有的編譯程序將源程序變成一種內部表示形式,這種內部表示形式叫做中間語言或中間表示或中間代碼。所謂「中間代碼」是一種結構簡單、含義明確的記號系統,這種記號系統復雜性介於源程序語言和機器語言之間,容易將它翻譯成目標代碼。另外,還可以在中間代碼一級進行與機器無關的優化。
[回頁首]
文法(Grammars)
文法是用於描述語言的語法結構的形式規則。文法G定義為四元組(,,,)。其中為非終結符號(或語法實體,或變數)集;為終結符號集;為產生式(也稱規則)的集合;產生式(規則)是形如或 a ::=b 的(a , b)有序對,其中(∪)且至少含有一個非終結符,而(∪)。,和是非空有窮集。稱作識別符號或開始符號,它是一個非終結符,至少要在一條規則中作為左部出現。
一個文法的例子: G=(={A,R},={0,1} ,={A?0R,A?01,R?A1},=A) [回頁首]
文法分類(A hierarchy of Grammars)
著名語言學家Noam Chomsky定義了四類文法和四種形式語言類,文法的四種類型分別是0型、1型、2型和3型。幾類文法的差別在於對產生式施加不同的限制,分別是:
0型文法(短語結構文法)(phrase structure grammars):
設G=(,,,),如果它的每個產生式是這樣一種結構: (∪) 且至少含有一個非終結符,而(∪),則G是一個0型文法。
1型文法(上下文有關文法)(context-sensitive grammars):
設G=(,,,)為一文法,若中的每一個產生式均滿足|,僅僅 除外,則文法G是1型或上下文有關的。
2型文法(上下文無關文法)(context-free grammars):
設G=(,,,),若P中的每一個產生式滿足:是一非終結符,(∪) 則此文法稱為2型的或上下文無關的。
3型文法(正規文法)(regular grammars):
設G=(,,,),若中的每一個產生式的形式都是A→aB或A→a,其中A和B都是非終結,a是終結符,則G是3型文法或正規文法。
0型文法產生的語言稱為0型語言。
1型文法產生的語言稱為1型語言,也稱作上下文有關語言。
2型文法產生的語言稱為2型語言,也稱作上下文無關語言。
3型文法產生的語言稱為3型語言,也稱作正規語言。
3. 編譯原理LR分析法中的SLR(1)分析表和LR分析過程、語法樹怎麼求
第二題和第三題拿去,剛做的:
由B->cAa|c就可知該文法不是LR(0)文法了
4. 編譯原理---程序執行的兩種方式是什麼
由於web系統採用http協議在瀏覽器和伺服器之間傳輸數據,而http協議是一種無狀態的協議,如何在不同頁面之間傳遞數據,可以有一下幾種方式方式一:表單方式傳遞表單傳遞參數是一種最簡單,也是最基本的參數傳遞方式。注意:表單元素隱藏按鈕的使用方式二:帶參數的url方式傳遞帶參數的url寫法:url?參數名1=值1&參數名2=值2。方式三:請求request對象可以將數據綁定到request對象上,通過request對象getAttribute和setAttribute方法讀寫方式四:用戶會話session對象可以將數據綁定到session對象上,通過session對象getAttribute和setAttribute方法讀寫方式五:application對象可以將數據綁定到application對象上,通過application對象getAttibute方法和setAttribute方法讀寫方式六:cookie對象可以將數據寫到到客戶端瀏覽器cookie文件中。其中方式一,方式二隻能實現字元串參數的傳遞,方式三,四,五,六可以實現對象的傳遞(方式六需要對象序列化後進行存儲)方式一,方式二,方式三數據傳遞只能請求頁面獲取數據,而方式四,五,六可以在多個不同頁面獲取數據對象方式四和六保存的數據對象都是和某個用戶相關的信息,不同的是方式四將數據保存到伺服器內存中,方式六將數據保存到客戶端內存中。方式五保存的數據對象都是和所有用戶相關的信息,數據也是保存到伺服器內存中。
5. 有關編譯原理的幾個問題
最左推到就是從最左邊的非終結符開始替換,一個一個替換,直到替換為題目要求的。預測分析表什麼的太煩了,不高興寫。你按著書上例題步驟一步一步寫就可以了。給你寫個第五題。
6. 編譯原理全部的名詞解釋
書上有別那麼懶!。。。。
編譯過程的六個階段:詞法分析,語法分析,語義分析,中間代碼生成,代碼優化,目標代碼生成
解釋程序:把某種語言的源程序轉換成等價的另一種語言程序——目標語言程序,然後再執行目標程序。解釋方式是接受某高級語言的一個語句輸入,進行解釋並控制計算機執行,馬上得到這句的執行結果,然後再接受下一句。
編譯程序:就是指這樣一種程序,通過它能夠將用高級語言編寫的源程序轉換成與之在邏輯上等價的低級語言形式的目標程序(機器語言程序或匯編語言程序)。
解釋程序和編譯程序的根本區別:是否生成目標代碼
句子的二義性(這里的二義性是指語法結構上的。):文法G[S]的一個句子如果能找到兩種不同的最左推導(或最右推導),或者存在兩棵不同的語法樹,則稱這個句子是二義性的。
文法的二義性:一個文法如果包含二義性的句子,則這個文法是二義文法,否則是無二義文法。
LL(1)的含義:(LL(1)文法是無二義的; LL(1)文法不含左遞歸)
第1個L:從左到右掃描輸入串 第2個L:生成的是最左推導
1 :向右看1個輸入符號便可決定選擇哪個產生式
某些非LL(1)文法到LL(1)文法的等價變換: 1. 提取公因子 2. 消除左遞歸
文法符號的屬性:單詞的含義,即與文法符號相關的一些信息。如,類型、值、存儲地址等。
一個屬性文法(attribute grammar)是一個三元組A=(G, V, F)
G:上下文無關文法。
V:屬性的有窮集。每個屬性與文法的一個終結符或非終結符相連。屬性與變數一樣,可以進行計算和傳遞。
F:關於屬性的斷言或謂詞(一組屬性的計算規則)的有窮集。斷言或語義規則與一個產生式相聯,只引用該產生式左端或右端的終結符或非終結符相聯的屬性。
綜合屬性:若產生式左部的單非終結符A的屬性值由右部各非終結符的屬性值決定,則A的屬性稱為綜合屬
繼承屬性:若產生式右部符號B的屬性值是根據左部非終結符的屬性值或者右部其它符號的屬性值決定的,則B的屬性為繼承屬性。
(1)非終結符既可有綜合屬性也可有繼承屬性,但文法開始符號沒有繼承屬性。
(2) 終結符只有綜合屬性,沒有繼承屬性,它們由詞法程序提供。
在計算時: 綜合屬性沿屬性語法樹向上傳遞;繼承屬性沿屬性語法樹向下傳遞。
語法制導翻譯:是指在語法分析過程中,完成附加在所使用的產生式上的語義規則描述的動作。
語法制導翻譯實現:對單詞符號串進行語法分析,構造語法分析樹,然後根據需要構造屬性依賴圖,遍歷語法樹並在語法樹的各結點處按語義規則進行計算。
中間代碼(中間語言)
1、是復雜性介於源程序語言和機器語言的一種表示形式。
2、一般,快速編譯程序直接生成目標代碼。
3、為了使編譯程序結構在邏輯上更為簡單明確,常採用中間代碼,這樣可以將與機器相關的某些實現細節置於代碼生成階段仔細處理,並且可以在中間代碼一級進行優化工作,使得代碼優化比較容易實現。
何謂中間代碼:源程序的一種內部表示,不依賴目標機的結構,易於代碼的機械生成。
為何要轉換成中間代碼:(1)邏輯結構清楚;利於不同目標機上實現同一種語言。
(2)便於移植,便於修改,便於進行與機器無關的優化。
中間代碼的幾種形式:逆波蘭記號 ,三元式和樹形表示 ,四元式
符號表的一般形式:一張符號表的的組成包括兩項,即名字欄和信息欄。
信息欄包含許多子欄和標志位,用來記錄相應名字和種種不同屬性,名字欄也稱主欄。主欄的內容稱為關鍵字(key word)。
符號表的功能:(1)收集符號屬性 (2) 上下文語義的合法性檢查的依據: 檢查標識符屬性在上下文中的一致性和合法性。(3)作為目標代碼生成階段地址分配的依據
符號的主要屬性及作用:
1. 符號名 2. 符號的類型 (整型、實型、字元串型等))3. 符號的存儲類別(公共、私有)
4. 符號的作用域及可視性 (全局、局部) 5. 符號變數的存儲分配信息 (靜態存儲區、動態存儲區)
存儲分配方案策略:靜態存儲分配;動態存儲分配:棧式、 堆式。
靜態存儲分配
1、基本策略
在編譯時就安排好目標程序運行時的全部數據空間,並能確定每個數據項的單元地址。
2、適用的分配對象:子程序的目標代碼段;全局數據目標(全局變數)
3、靜態存儲分配的要求:不允許遞歸調用,不含有可變數組。
FORTRAN程序是段結構,不允許遞歸,數據名大小、性質固定。 是典型的靜態分配
動態存儲分配
1、如果一個程序設計語言允許遞歸過程、可變數組或允許用戶自由申請和釋放空間,那麼,就需要採用動態存儲管理技術。
2、兩種動態存儲分配方式:棧式,堆式
棧式動態存儲分配
分配策略:將整個程序的數據空間設計為一個棧。
【例】在具有遞歸結構的語言程序中,每當調用一個過程時,它所需的數據空間就分配在棧頂,每當過程工作結束時就釋放這部分空間。
過程所需的數據空間包括兩部分
一部分是生存期在本過程這次活動中的數據對象。如局部變數、參數單元、臨時變數等;
另一部分則是用以管理過程活動的記錄信息(連接數據)。
活動記錄(AR)
一個過程的一次執行所需要的信息使用一個連續的存儲區來管理,這個區 (塊)叫做一個活動記錄。
構成
1、臨時工作單元;2、局部變數;3、機器狀態信息;4、存取鏈;
5、控制鏈;6、實參;7、返回地址
什麼是代碼優化
所謂優化,就是對代碼進行等價變換,使得變換後的代碼運行結果與變換前代碼運行結果相同,而運行速度加快或佔用存儲空間減少。
優化原則:等價原則:經過優化後不應改變程序運行的結果。
有效原則:使優化後所產生的目標代碼運行時間較短,佔用的存儲空間較小。
合算原則:以盡可能低的代價取得較好的優化效果。
常見的優化技術
(1) 刪除多餘運算(刪除公共子表達式) (2) 代碼外提 +刪除歸納變數+ (3)強度削弱; (4)變換循環控制條件 (5)合並已知量與復寫傳播 (6)刪除無用賦值
基本塊定義
程序中只有一個入口和一個出口的一段順序執行的語句序列,稱為程序的一個基本塊。
給我分數啊。。。
7. 編譯原理,子集法將NFA確定為DFA,求問,表格中的部分都是怎麼來的
我也在看這個。
先以S開始,經過任意個ε得到的結點就是第一個I,這道題就是{X,1,2},
然後將{X,1,2}中的每一個字元經過a(中間可以有ε)後得到的結點加起來,X的Ia={1,2},
1的Ia={1,2},2的Ia是空集,所以這一行的Ia={1,2}。
後面的Ib也是一樣,只不過是經過b後得到的結點的集合。
然後分別將前面的Ia和Ib作為I計算新的Ia和Ib。
再將這些集合依次標號,這道題是{X,1,2}為X,{1,2}為1,{1,2,3}為2,{1,2,Y}為3,根據上面那個表就可以把圖畫出來了。
8. 編譯原理 文法
構造LR(1)語法分析表,沒有沖突就是了。
9. 把編譯程序設計原理(第二版)高等教育出版社的課後答案給我發一份 可以嗎
目錄
第1章編譯器概述
1.1為什麼要學習編譯技術
1.2編譯器和解釋器
1.3編譯器的功能分解和組織結構
1.4編譯器的夥伴
1.5編譯器的復雜性
1.6編譯器的設計與實現
1.7編譯器的測試與維護
第2章一個微型編譯器
2.1基礎知識
2.2ToyL語言
2.3ToyL語言詞法分析器
2.4ToyL語言語法分析器
2.5ToyL語言解釋器
2.6ToyL語言編譯器
第3章有窮自動機與詞法分析
3.1詞法分析基礎
3.1.1詞法分析器的功能
3.1.2單詞識別
3.1.3詞法分析的復雜性
3.1.4字元串
3.1.5保留字處理
3.1.6空格符、回車符、換行符
3.1.7括弧類配對預檢
3.1.8詞法錯誤修正
3.1.9詞法分析獨立化的意義
3.2有窮自動機
3.2.1確定有窮自動機的定義
3.2.2確定有窮自動機的實現
3.2.3非確定有窮自動機
3.2.4NFA到DFA的轉換
3.2.5確定有窮自動機的極小化
3.2.6自動機狀態轉換表的實現
3.3正則表達式
3.3.1正則符號串集
3.3.2正則表達式的定義
3.3.3正則表達式的局限性
3.3.4正則定義
3.3.5正則表達式到有窮自動機的轉換
3.4詞法分析器的構造
3.4.1用DFA人工構造詞法分析器
3.4.2詞法分析器的生成器Lex
練習
第4章文法與語法分析
4.1語法分析
4.1.1語法分析器的輸入
4.1.2語法分析的任務
4.1.3語法分析方法分類
4.2文法和文法分析
4.2.1上下文無關文法和語言
4.2.2最左推導和最右推導
4.2.3語法分析樹與二義性
4.2.4文法分析演算法
4.2.5自頂向下方法概述
4.2.6自底向上方法概述
4.3遞歸下降法——自頂向下分析
4.3.1遞歸下降法原理
4.3.2消除公共前綴
4.3.3代入
4.3.4消除左遞歸
4.4LL分析方法——自頂向下分析
4.4.1LL(1)文法
4.4.2LL(1)分析表
4.4.3LL(1)分析的驅動器
4.4.4LL(1)中的If-Then-Else問題
4.4.5LL(1)分析器的自動生成器LLGen
4.4.6LL(1)分析法與遞歸下降法的比較
4.4.7正則文法
4.5LR方法——自底向上分析
4.5.1句柄
4.5.2活前綴
4.5.3歸約活前綴識別器——LR(0)自動機
4.5.4LR(0)文法及其分析演算法
4.5.5SLR(1)文法及其分析演算法
4.5.6LR(1)文法
4.5.7LALR(1)文法
4.5.8二義性文法的處理
4.5.9另一種Shift-Rece分析技術:簡單優先法
4.5.10LL(1)和LALR(1)方法比較
4.6LR分析器的生成器
4.6.1LALR分析器的生成器YACC
4.6.2LALR分析器的生成器LALRGen
4.7語法錯誤處理
4.7.1錯誤恢復和修復
4.7.2遞歸下降分析的錯誤恢復
4.7.3LL分析的錯誤恢復
4.7.4LR分析的錯誤恢復
練習
第5章語義分析
5.1語義分析基礎
5.1.1語義分析內容
5.1.2標識符信息的內部表示
5.1.3類型信息的內部表示
5.1.4運行時值的表示
5.2符號表
5.2.1符號表查找技術
5.2.2符號表的局部化
5.2.3二叉式局部符號表
5.2.4散列式全局符號表
5.2.5嵌套式全局符號表
5.2.6符號表界面函數
5.3類型分析
5.3.1類型的等價性和相容性
5.3.2類型分析的總控演算法
5.3.3類型名分析
5.3.4枚舉類型分析
5.3.5數組類型分析
5.3.6記錄類型分析
5.3.7聯合類型分析
5.3.8指針類型分析
5.3.9遞歸類型分析
5.4聲明的語義分析
5.4.1聲明的語法結構
5.4.2標號聲明部分的語義分析
5.4.3常量聲明部分的語義分析
5.4.4類型聲明部分的語義分析
5.4.5變數聲明部分的語義分析
5.4.6過程、函數聲明的語義分析
5.5執行體的語義分析
5.5.1執行體的語義分析
5.5.2帶標號語句和轉向語句的語義分析
5.5.3賦值語句的語義分析
5.5.4條件語句的語義分析
5.5.5while循環語句的語義分析
5.5.6for循環語句的語義分析
5.5.7過程調用語句的語義分析
5.5.8表達式的語義分析
5.5.9變數的語義分析
練習
第6章運行時的存儲環境
6.1運行時的存儲空間結構與分配
6.1.1運行時的存儲空間基本結構
6.1.2靜態區的存儲分配
6.1.3棧區的存儲分配
6.1.4堆區的存儲分配
6.1.5堆區空間管理
6.2過程活動記錄與棧區組織結構
6.2.1過程活動記錄
6.2.2活動記錄的填寫
6.2.3棧區組織結構——AR鏈
6.3運行時的變數訪問環境
6.3.1可訪問活動記錄
6.3.2局部Display表方法
6.3.3靜態鏈方法
6.3.4全局Display表方法和寄存器方法
6.3.5無嵌套時的AR及訪問環境
6.4分程序和動態數組空間
6.4.1無動態數組時的分程序空間
6.4.2動態數組空間
練習
第7章面向語法的語義描述
7.1動作文法
7.1.1動作文法定義
7.1.2動作文法的遞歸實現
7.1.3動作文法的LL實現
7.1.4動作文法的LR實現
7.2動作文法應用
7.2.1用動作文法描述表達式計算
7.2.2用動作文法描述表達式抽象樹的構造
7.2.3用動作文法描述語句抽象樹的構造
7.3抽象動作文法及其應用
7.3.1抽象變數
7.3.2抽象動作文法
7.3.3棧式LL動作文法驅動器
7.3.4抽象動作文法到棧式LL動作文法的轉換
7.3.5棧式LR動作文法驅動器
7.3.6抽象動作文法到棧式LR動作文法的轉換
7.4屬性文法
7.4.1屬性文法定義
7.4.2屬性語法樹和屬性依賴圖
7.4.3計算順序
7.4.4屬性值的計算方法
7.4.5拷貝型屬性文法
7.5屬性文法在編譯器設計中的應用
7.5.1類型樹的屬性文法描述
7.5.2表達式中間代碼的屬性文法描述
7.5.3變數中間代碼的屬性文法描述
7.5.4語句中間代碼的屬性文法描述
7.5.5正則表達式到自動機轉換的屬性文法描述
7.6S-屬性文法及其屬性計算
7.6.1S-屬性文法
7.6.2S-屬性文法的遞歸實現
7.6.3S-屬性文法的LR實現
7.7L-屬性文法及其屬性計算
7.7.1L-屬性文法
7.7.2L-屬性文法的遞歸實現
7.7.3L-屬性文法的LR(1)實現
7.8語義分析器的自動生成系統
7.8.1YACC
7.8.2LALRGen
7.8.3Accent系統
練習
第8章中間代碼生成
8.1中間代碼
8.1.1中間代碼的種類
8.1.2後綴式中間代碼
8.1.3三地址中間代碼
8.1.4抽象語法樹和無環有向圖
8.1.5多元式中間代碼
8.1.6中間代碼分量ARG結構
8.2表達式的中間代碼生成
8.2.1表達式的語義信息
8.2.2表達式的中間代碼
8.2.3變數的中間代碼
8.2.4表達式的中間代碼生成
8.2.5變數的中間代碼生成
8.2.6布爾表達式的短路中間代碼
8.3原子語句的中間代碼生成
8.3.1輸入/輸出語句的中間代碼生成
8.3.2goto語句和標號定位語句的中間代碼生成
8.3.3return語句的中間代碼生成
8.3.4賦值語句的中間代碼生成
8.3.5函數(過程)調用的中間代碼生成
8.4結構語句的中間代碼生成
8.4.1條件語句的中間代碼生成
8.4.2while語句的中間代碼生成
8.4.3repeat語句的中間代碼生成
8.4.4for語句的中間代碼生成
8.4.5case語句的中間代碼生成
8.4.6函數聲明的中間代碼生成
練習
第9章中間代碼優化
9.1引言
9.1.1優化的目標和要求
9.1.2優化的必要性
9.1.3優化的內容
9.1.4局部優化和全局優化
9.1.5基本塊和程序流圖
9.2常表達式優化
9.2.1常表達式的局部優化
9.2.2基於常量定值分析的常表達式全局優化
9.2.3常量定值分析
9.3公共表達式優化
9.3.1基於相似性的公共表達式局部優化
9.3.2基於值編碼的公共表達式局部優化
9.3.3基於活躍代碼分析的公共表達式全局優化
9.3.4活躍運算代碼分析
9.4程序流圖循環
9.4.1循環的基本概念
9.4.2支撐結點
9.4.3自然循環
9.4.4可歸約程序流圖
9.4.5基於文本的循環及其處理
9.5循環不變代碼外提
9.5.1代碼外提的基本概念
9.5.2循環不變代碼的判定
9.5.3循環不變代碼外提的條件
9.5.4基於文本循環和定值表的不變代碼外提
9.5.5一種簡單的外提優化方案
9.5.6別名分析
9.5.7過程與函數的副作用分析
9.6循環內歸納表達式的優化
9.6.1歸納變數
9.6.2歸納變數計算的優化演算法原理
練習
第10章目標代碼生成
10.1目標代碼
10.1.1虛擬機代碼
10.1.2目標機代碼
10.1.3窺孔優化
10.2臨時變數
10.2.1臨時變數的特點
10.2.2臨時變數的存儲空間
10.2.3臨時變數的存儲分配
10.2.4變數狀態描述
10.3寄存器
10.3.1寄存器分類及其使用准則
10.3.2寄存器分配單位
10.3.3寄存器狀態描述
10.3.4寄存器分配演算法
10.4基於三地址中間代碼的目標代碼生成
10.4.1目標地址生成
10.4.2間接目標地址的轉換
10.4.3表達式中間代碼的目標代碼生成
10.4.4賦值中間代碼的目標代碼生成
10.4.5其他寄存器分配法
10.4.6標號和goto語句中間代碼的目標代碼生成
10.4.7return中間代碼的目標代碼生成
10.4.8變數中間代碼的目標代碼生成
10.4.9函數調用中間代碼的目標代碼生成
10.5基於AST的代碼生成
10.5.1三地址中間代碼到AST的轉換
10.5.2標記需用寄存器個數
10.5.3從帶寄存器個數標記的AST生成代碼
10.6基於DAG的代碼生成
10.6.1從AST到DAG的轉換
10.6.2DAG排序和虛寄存器
10.6.3從帶序號和虛寄存器標記的DAG生成代碼
10.7代碼生成器的自動生成
10.7.1代碼生成器的自動化
10.7.2基於指令模板匹配的代碼生成技術
10.7.3基於語法分析的代碼生成技術
練習
第11章對象式語言的實現
11.1引言
11.2SOOL語法
11.2.1程序
11.2.2分程序
11.2.3類聲明
11.2.4類型
11.2.5變數聲明
11.2.6函數聲明和方法聲明
11.2.7語句
11.2.8變數
11.2.9表達式
11.2.10程序示例
11.3SOOL語義
11.3.1聲明的作用域
11.3.2Class聲明的語義
11.3.3語句的語義
11.4SOOL語義分析
11.4.1標識符的符號表項
11.4.2符號表結構
11.4.3符號表的局部化
11.5SOOL目標代碼
11.5.1對象空間
11.5.2當前對象——self
11.5.3活動記錄
11.5.4成員變數的目標地址
11.5.5表達式的目標代碼
11.5.6Offset原理
11.5.7類的多態性
11.5.8目標代碼區
11.5.9方法的動態綁定
11.5.10快速動態綁定目標代碼
主要參考文獻
10. 編譯原理語法分析有哪幾種方法
語法分析有自上而下和自下而上兩種分析方法
其中
自上而下:遞歸下降,LL(1)
自下而上:LR(0),SLR(1),LR(1),LALR(1)