當前位置:首頁 » 編程軟體 » 編譯符號無用依賴

編譯符號無用依賴

發布時間: 2022-08-21 16:43:45

編譯原理全部的名詞解釋

書上有別那麼懶!。。。。
編譯過程的六個階段:詞法分析,語法分析,語義分析,中間代碼生成,代碼優化,目標代碼生成
解釋程序:把某種語言的源程序轉換成等價的另一種語言程序——目標語言程序,然後再執行目標程序。解釋方式是接受某高級語言的一個語句輸入,進行解釋並控制計算機執行,馬上得到這句的執行結果,然後再接受下一句。
編譯程序:就是指這樣一種程序,通過它能夠將用高級語言編寫的源程序轉換成與之在邏輯上等價的低級語言形式的目標程序(機器語言程序或匯編語言程序)。
解釋程序和編譯程序的根本區別:是否生成目標代碼
句子的二義性(這里的二義性是指語法結構上的。):文法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)刪除無用賦值
基本塊定義
程序中只有一個入口和一個出口的一段順序執行的語句序列,稱為程序的一個基本塊。

給我分數啊。。。

Ⅱ 很多編譯程序採用的基於屬性文法的語義處理過程稱為什麼

首先,我們給出語義屬性的定義。
定義 5.1一文法符號X∈VN∪VT的語義性質稱為該文法符號的語義屬性(Semantic Attributes),簡稱為屬性。我們用A(X)表示X的所有屬性的集合。每個屬性表示X的一個特定性質,並可任意指定其取值范圍。下面,我們將用X.a表示A(X)中的屬性a。
由定義5.1可知,文法符號的屬性就是它的語義性質。屬性可表徵諸如數、符號串、類型、存儲空間和其它需表徵的實體。就終結符號而言,它至少有一種屬性,即詞文。當然,它還可能具有其它屬性,例如,對3.2.1中所定義的無符號數,單詞「123」就是它的詞文;而其數值和類型(整型)是它的另外兩個屬性。一般來說,終結符號的屬性是其內在性質;當然也有些屬性將從其它符號的屬性中獲取。例如,變數標識符的類型屬性,將從類型定義語句中獲取,也就是說,它是通過語法樹從其它符號的屬性中獲取的。對非終結符號而言,其屬性之值均須從其它符號的屬性經計算而得,或者說,是由其它符號的屬性定義的。
可見,各個文法符號的屬性之間,可能存在某種依賴關系,這種依賴關系可用屬性規則(語義規則)來定義。
定義 5.2設p:X0→X1X2…Xn∈P是文法G的一個產生式,則與p相關聯的屬性規則集合
定義 5.3對每個產生式p:X0→X1X2…Xn∈P,設屬性定義性出現的集合為
AF(p)={Xi.a|Xi.a=f(Xk1.ak1,Xk2.ak2,…,Xkm.akm)∈R(p),而0≤kj≤n}
若Xi是產生式左部的非終結符號(即i=0),則稱屬性Xi.a是綜合屬性(Synthesized Attributes);若Xi出現在產生式的右部(即1≤i≤n),則稱Xi.a是繼承屬性(Inherited Attributes)。
如果在一棵語法樹中將每個結點均視為由若干個域組成的記錄(或結構),則可將其中的一些域用來存放相應文法符號諸屬性之值,並可用屬性來為這些域命名。通常我們將每個結點都標注相應屬性值的語法樹稱為加註語法樹(Annotated Syntax Tree)或染色樹(Decorted Syntax Tree)。於是,由定義5.3可知:在加註語法樹中,一個文法符號X在相應結點的綜合屬性之值,由其子結點的屬性和(或)X的其它屬性,通過相關屬性規則經計算而得,故綜合屬性的求值在語法樹中是按自下而上的方式進行的;X的繼承屬性之值則由X的父結點和(或)其它兄弟結點來定義,故繼承屬性的求值將按自上而下的方式進行。
在引入屬性的概念之後,我們就可以定義屬性文法了。
定義 5.4屬性文法AG是一個形如
AG=(G,A,R,B)
的四元組,其中:G=(VN,VT,P,S)是已簡化的前後文無關文法;A=∪X∈VA(X)是屬性的有限集合;R=∪p∈PR(p)是屬性定義規則的有限集;而B=∪p∈PB(p)是條件的有限集合,B(p)用於描述使規則R(p)有效的條件(請注意,並非每條規則R(p)都必須有條件B(p)。若B(p)預設,則意味著無條件使用該規則);且同時滿足:
(1) 對G中任意兩個不同的文法符號X和Y而言,屬性集合A(X)和A(Y)不相交,即
A(X)∩A(Y)=(X≠Y)
(2) 在G的任意一個語法樹中,對文法符號X的每一次出現,可用於計算X的每個屬性Xa(Xa∈A(X))之值的規則至多有一條。
由定義5.4可知,屬性文法實際上就是對前後文無關文法的一種拓廣。另外,定義還表明,每個產生式中的任一文法符號的屬性計算規則只能是惟一的,且任一文法符號的綜合屬性集與繼承屬性集不相交,即
AS(X)∩AI(X)=
其中:
AS(X)={X.a|p:X→α∈P,X.a∈AF(p)}
AI(X)={X.a|q:Y→μXυ∈P,X.a∈AF(q)}
下面,我們以一個簡單賦值語句的文法為例,來說明屬性文法的應用。為便於理解,我們用一英語單詞(或片語)而不再像前幾章那樣用字母表示文法符號。並且約定,用大寫字母開頭的符號為非終結符號,而用小寫字母開頭的符號為終結符號。

Ⅲ 在附加依賴項裡面已經添加了相應的lib文件,為什麼編譯鏈接的時候還是提示無法解析的外部符號

我在vs2008環境下面遇到了這個問題
總算自己解決了
如果選擇的是win32而非x64配置,對應的庫目錄一定要設置到x86而非x64
在win32配置下使用x64 directx 庫就會出現這種情況
解決方法:
假設directx目錄為 C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\
則對於win32配置
項目->屬性->C/C++->常規->附加包含目錄 添加 C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Include
項目->屬性->鏈接器->常規->附加庫目錄 添加 C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Lib\x86
然後選擇全部重新編譯
我就是這樣解決了這個問題

Ⅳ 頭文件預編譯用什麼

#號是官方定義的,用於和其他類型區別的,不用多考慮,你就看看我給你的鏈接看看官方的說法
條件編譯符號#define ???
#if、#elif、#else 和 #endif 指令提供的條件編譯功能是通過預處理表達式和條件編譯符號來控制的。
conditional-symbol:(條件符號:)
除 true 和 false 外的任何標識符或關鍵字
條件編譯符號有兩種可能的狀態:已定義的或未定義的。在源文件詞法處理開始時,條件編譯符號除非已由外部機制(如命令行編譯器選項)顯式定義,否則是未定義的。當處理 #define 指令時,在指令中指定的條件編譯符號在那個源文件中成為已定義的。此後,該符號就一直保持已定義的狀態,直到處理一條關於同一符號的 #undef 指令,或者到達源文件的結尾。這意味著一個源文件中的 #define 和 #undef 指令對同一程序中的其他源文件沒有任何影響。
當在預處理表達式中引用時,已定義的條件編譯符號具有布爾值 true,未定義的條件編譯符號具有布爾值 false。不要求在預處理表達式中引用條件編譯符號之前顯式聲明它們。相反,未聲明的符號只是未定義的,因此具有值 false。
條件編譯符號的命名空間與 C# 程序中的所有其他命名實體截然不同。只能在 #define 和 #undef 指令以及預處理表達式中引用條件編譯符號。
1

Ⅳ C#聲明符號

2.5.3 聲明指令
聲明指令用於定義或取消定義條件編譯符號。

pp-declaration:(pp 聲明:)
whitespaceopt # whitespaceopt define whitespace conditional-symbol pp-new-line(空白可選 # 空白可選 define 空白 條件符號 pp 新行)
whitespaceopt # whitespaceopt undef whitespace conditional-symbol pp-new-line(空白可選 # 空白可選 undef 空白 條件符號 pp 新行)
pp-new-line:(pp 新行:)
whitespaceopt single-line-commentopt new-line(空白可選 單行注釋可選 新行)
對 #define 指令的處理使給定的條件編譯符號成為已定義的(從跟在指令後面的源代碼行開始)。類似地,對 #undef 指令的處理使給定的條件編譯符號成為未定義的(從跟在指令後面的源代碼行開始)。

源文件中的任何 #define 和 #undef 指令都必須出現在源文件中第一個「標記」(第 2.4 節)的前面,否則將發生編譯時錯誤。直觀地講,#define 和 #undef 指令必須位於源文件中所有「實代碼」的前面。

示例:

復制代碼
#define Enterprise
#if Professional || Enterprise
#define Advanced
#endif
namespace Megacorp.Data
{
#if Advanced
class PivotTable {...}
#endif
}是有效的,這是因為 #define 指令位於源文件中第一個標記(namespace 關鍵字)的前面。

下面的示例產生編譯時錯誤,因為 #define 指令在實代碼後面出現:

復制代碼
#define A
namespace N
{
#define B
#if B
class Class1 {}
#endif
}#define 指令可用於重復地定義一個已定義的條件編譯符號,而不必對該符號插入任何 #undef。下面的示例定義一個條件編譯符號 A,然後再次定義它。

復制代碼
#define A
#define A#undef 指令可用於取消定義一個本來已經是未定義的條件編譯符號。下面的示例定義一個條件編譯符號 A,然後兩次取消定義該符號;第二個 #undef 沒有作用但仍是有效的。

復制代碼
#define A
#undef A
#undef A

Ⅵ C語言中,「$」符號有什麼用啊

$操作系統的處理符號,有時候跟系統通信的時候要用上,比如在UNIX理編譯某個文件可以用以下命令:$ CC pn.c

Ⅶ 用Vs編譯DriectDraw,總是說「無法解析的外部符號 _DirectDrawCreateEx@16「,求解答

一般出現LNK2019錯誤都是庫文件沒添加造成的。
項目--》屬性--》配置屬性--》鏈接器-》輸入--》附加依賴項 在其中加入所需庫文件,注意把庫文件寫進去,每個庫文件後加分號,同時在「鏈接器--》常規--》附加庫目錄」中填入相應庫所在目錄。

Ⅷ 編譯原理這個符號表示什麼 如圖~~~~

剪頭上加一個星號:S-*->aPb
表示從S可以推出含有非終結符P的形如aPb的句型。
剪頭上加一個加號:S-+->a
表示從S可以推出終結符a。

Ⅸ 編譯dll時調用其他第三方dll,編譯通過但鏈接時提示無法識別的外部符號

「編譯後在Release中輸出打包的DLL」這個說法是不對的,或者說,是不行的。如果使用了MFC的dll和其它第三方(包括自定義)DLL文件,那麼需要發布的時候,就需要製作一個「軟體安裝包」,這兒軟體安裝包打包了EXE,dll和你需要的其它數據文件(具體打包什麼是由你自己指定的),軟體打包工具軟體,VisualStudio自帶了一個,叫做:InstallShieldforVC6。這個程序使用比較復雜(需要自編代碼)也很靈活,簡單的安裝包製作軟體也有,你可以網上搜索一下,很多。另外,如果說,你只需要打包MFC標准DLL,那麼,就不是打包的問題了,很簡單,在RELEASE編譯模式設置(project菜單)中,選擇MFC為靜態庫,那麼編譯之後的程序,就不需要拷貝MFC的標准DLL(或者vc環境)支持了。

熱點內容
開源庫編譯管理員 發布:2025-02-06 09:39:14 瀏覽:914
臉書怎麼注冊安卓 發布:2025-02-06 09:36:47 瀏覽:381
車用安卓導航無線打不開什麼原因 發布:2025-02-06 09:27:50 瀏覽:790
安卓與蘋果如何互相傳送文件 發布:2025-02-06 09:27:40 瀏覽:26
華為伺服器盤符如何分配 發布:2025-02-06 09:26:41 瀏覽:560
傳奇h5源碼下載 發布:2025-02-06 09:26:06 瀏覽:78
編譯uclibc 發布:2025-02-06 09:09:04 瀏覽:152
用gcc編譯16位匯編 發布:2025-02-06 09:06:07 瀏覽:823
什麼低端安卓手機不卡 發布:2025-02-06 09:03:32 瀏覽:14
我的世界伺服器卡領地 發布:2025-02-06 08:50:45 瀏覽:256