編譯原理子序列
㈠ 【編譯原理】第三章:詞法分析
語言
正則表達:
正則表達式可以由較小的正則表達式遞歸構建。每個正則表達式r定一個語言記作L(r)。
正則表達式優先順序為:克林閉包>連接>或。
簡單來說就是重定義。
例如:
letter -> 字母
number -> 數
d -> 整數
系統根據 當前狀態 與 當前的輸入信息 決定 後繼行為 。
每當處理完當前輸入後,狀態也發生改變。
如果給定輸入串x,如果存在對於該串 從初始狀態到某個終止狀態 的轉換序列,則該串被該FA 接收 。
例:對於FA
abbaabb 是被接收的,而 abbaaba 則不被接收。
重點: 轉換表 ;
一個有窮自動機可以由轉換表表示。
例:
以上兩種自動機都可以用正則表達式 來表示。
事實上, 正則表達式與有窮自動機是等價的 。
從人的角度看,NFA比DFA更加直觀;但對於程序來說,DFA比NFA容易實現。
直接從RE轉換到DFA是比較困難的,所以一般通過NFA作為中介。
DFA中的每個狀態都是NFA中狀態集合的一個子集。
即,先寫出NFA的轉換表,再通過新的狀態構建出DFA。
例:
記數字為 ,字母為 ,那麼標識符的正則表達式為:
這個正則表達式轉換為NFA,表示如下:
這個NFA同時也是一個DFA,所以不用再進行轉換。
記:
數字
數字串
小數部分
指數部分
數
即一個數由一個數字串+可選的小數部分+可選的指數部分構成。
轉換為NFA,表示如下:
通過子集構造法,將NFA轉換為DFA:
可以表示10進制、8進制、16進制的DFA:
㈡ 編譯原理簡單嗎
編譯原理主要是講了編譯器的實現。
那什麼是編譯器呢?
編譯器就是將 源程序→編譯器 →目標機器代碼的程序
本文將用一段最簡單的代碼進行說明
1 + 2 + 3
第一步. 詞法分析
當代碼從文件中被讀入到編輯器時,將會進行詞法分析
示例中的代碼最終會轉換為(下面為偽代碼)
1 ADD 2 ADD 3
第二步. 語法分析
這一步編譯器將會把詞法分析的結果轉換成AST(abstract syntax tree, 抽象語法樹)
所有的操作數將會作為子節點,所有的操作符將會作為父節點。(不知道的同學可以看一下樹的生成)
1 + 2 + 3 對應的樹
3. 生成目標代碼
對上面的樹進行後序遍歷,將會得到下面的偽代碼
((1 2 +) 3 +)
生成的匯編偽代碼為
START:
MOV VALUE, 0//初始化結果為0
ADD VALUE, 1
ADD VALUE, 2//(1 2 +)的匯編偽代碼
ADD VALUE, 3
RET VALUE
END
最終匯編代碼會被編譯成機器代碼,在計算機上執行。
下面為一般情況下的編譯流程
1. 詞法分析(生成代碼對應的token序列,使用正則表達式)
2. 語法分析(生成AST)
3. 語義分析(對代碼的語法進行檢查)
4. 代碼生成(生成可執行的代碼)
㈢ 什麼是編譯原理
問題一:什麼是編譯原理 編譯:就是將程序語言進行翻譯,生成可供用戶直接執行的二進制代碼,即可執行文件。
任務是個比較模糊的概念,指的是操作系統中正在進行的工作,既可以指進程,也可以指程序春坦灶。
程序指的是可以連續執行,並能夠完成一定任務的一條條指令的 *** 。
進程是程序在一個數據 *** 上運行的過程,它是傳統操作系統進行資源分配和調度的一個獨立單位。
線程是一個指令執行序列,是操作系統調度的最小單位。一個或多個線程構成進程,構成一個進激的線程之間共享資源。進程和線程之間的最大區別就是線程不能獨立擁有資源,進程擁有自己的資源。
問題二:編譯原理中V*是什麼意思 V是一個符號 *** ,假設V指的是三個符號a, b, c的 *** ,記為 V = {a, b, c }
V* 讀作「V的閉包」,它的數學定義是V自身的任意多次自身連接(乘法)運算的積,也是一個 *** 。
也就是說,用V中的任意符號進行意多次(包括0次)連接,得到的符號串,都是V*這個 *** 中的元素。
0次連接的結果是不含任何符號的空串,記為 ε
1次連接就是只有一個符號的符號串,比如,a,b, c
2次連接是兩個符號構成的符號串,比如,aa, ab, ac, ba, bb, bc,等等
……
n次連接是一個長度為n、由a、b、c三個符號構成的符號串,比如abaacbbac……
因此,V*包含一切由a,b,c三個符號連接而成的、任意長度的符號串(以及空串ε)
問題三:編譯原理 V+什麼意思,例如下面的例子。。。 v表示終結符和非終結符 *** 。
+表示 *** 中的一個或多個元素構成的串的 *** 。
所以v+表示由一個或多個終結符或非終結符構成的串的 *** 。比如如果a∈VT,A∈VN,那麼a,A,aA,Aa,aAA,AaA等都是v+中的元素。
問題四:誰能夠解釋下編譯原理中什麼是FIRSTVT,和LASTVT,盡量淺顯易懂點謝謝 Firstvt和Lastvt是為了畫算符優先關系表的(就是表裡面填優先大於小於等於的那個)。
然後要注意他們可都是終結符的 *** 。
Firstvt
找Firstvt的三條規則:如果要找A的Firstvt,A的候選式中出現:
A->a.......,即以終結符開頭,該終結符入Firstvt
A->B.......,即以非終結符開頭,該非終結符的Firstvt入A的Firstvt
攻 A->Ba.....,即先以非終結符開頭,緊跟終結符,則終結符入Firstvt
Lastvt
找Lastvt的三條規則:如果要找A的Lastvt,A的候選式中出現:
A->.......a,即以終結符結尾,該終結符入Lastvt
A->.......B,即以非終結符結尾,該非終結符的Lastvt入A的Lastvt
A->.....aB,即先以非終結符結尾,前面是終結符,則終結符入Firstvt
問題五:編譯原理 什麼是語義分析 在編譯原理中,語法規則和詞法規則不同之處在於:規則主要識別單詞,而語法主要識別多個單片語成的句子。詞法分析信孝和詞法分析程序:詞法分析階段是編譯過程的第一個階段。這個階段的任務是從左到右一個字元一個字元地讀入源程序,即對構成源程序的字元流進行掃描然後根據構詞規則識別單詞(也稱單詞符號或符號)。詞法分析程序實現這個任務。詞法分析程序可以使用lex等工具自動生成。語法分析(Syntax *** ysis或Parsing)和語法分析程序(Parser) 語法分析是編譯過程的一個邏輯階段。語法分析的任務是在詞法分析的基礎上將單詞序列組合成各類語法短語,如「程序」,「語句」,「表達式」等等.語法分扒扮析程序判斷源程序在結構上是否正確.源程序的結構由上下文無關文法描述.語義分析(Syntax *** ysis) 語義分析是編譯過程的一個邏輯階段. 語義分析的任務是對結構上正確的源程序進行上下文有關性質的審查, 進行類型審查.語義分析將審查類型並報告錯誤:不能在表達式中使用一個數組變數,賦值語句的右端和左端的類型不匹配.
問題六:編譯原理中,(E)是什麼意思? E→(E)? 10分 就是 字元本身 意思是F產生( E ) 或者 i 比如If語句的開頭 就是 帶括弧的 必須是 if(表達式)這樣的形式 丟了任何即括弧就是其 終結符 「(」 和 「)」.
問題七:大家覺得對編譯器及編譯原理需要掌握到一個什麼程度 我跟你說,編譯原理太有用了。
我是做手機游戲的,現在做一個游戲引擎。既然是引擎,就需要提供抽象的東西給上層使用。這里,我引入了腳本系統。
這個腳本系統包括一堆我根據實際需求自行設計的指令集,包括基本的輸入輸出,四則運算,系統功能調用,函數聲明,調用等等(其實你要是用過lua或者其他游戲腳本你就知道了。)整個結構包括指令集、編譯器、虛擬機等部分。這樣,引擎提供一些基礎服務,比如繪圖,計算位置等,腳本就可以非常簡單控制游戲。甚至快速構建新游戲。你應該知道QUAKE引擎吧?
這里提供給你一個計算器的小程序,應用了EBNF理論,支持表達式,比如(2+3*6)*4+4,你自己體驗一下它的簡潔和強大。
/*
simple integer arithmetic calculator according to the EBNF
-> {}
->+|-
->{}
-> *
-> ( )| Number
Input a line of text from stdin
Outputs Error or the result.
*/
#include
#include
#include
char token;/*global token variable*/
/*function prototypes for recursive calls*/
int exp(void);
int term(void);
int factor(void);
void error(void)
{
fprintf(stderr,Error\n);
exit(1);
}
void match(char expectedToken)
{
if(token==expectedToken)token=getchar();
else error();
}
main()
{
int result;
token = getchar();/*load token with first character for lookahead*/
result = exp();
if(token=='\n')/*check for end of line */
printf(Result = %d\n,result);
else error();/*extraneous cahrs on line*/
return 0;
}
int exp(void)
{
int temp = term();
while((token=='+')||(token=='-'))
switch(token)
{
case '+':
match('+');
temp+=term......>>
問題八:編譯原理中,自動機究竟是什麼. 形式語言
形式語言 是一個字母表上的某些有限長字串的 *** 。一個形式語言可以包含無限多個字串。
語言的形式定義
字母表 ∑ 為任意有限 *** ,ε 表示空串, 記 ∑ 0 為{ε},全體長度為 n 的字串為 ∑ n , ∑ * 為 ∑ 0 ∪∑ 1 ∪…∪∑ n ∪…, 語言 L 定義為 ∑ * 的任意子集。
注記:∑ * 的空子集 Φ 與 {ε} 是兩個不同的語言。
語言間的運算
語言間的運算就是 ∑ * 冪集上的運算。
字串 *** 的交並補等運算。
連接運算:L 1 L 2 = { xy | x 屬於L 1 並且 y 屬於L 2 }。
冪運算:L n = L … L (共 n 個 L 連接在一起),L 0 = {ε}。
閉包運算:L * = L 0 ∪L 1 ∪…∪L n ∪…。
(右)商運算:L 1 /L 2 = {x | 存在 y 屬於L 2 使得 xy 屬於L 1 }。
語言的表示方法
一個形式語言可以通過多種方法來限定自身,比如:
枚舉出各個字串(只適用於有限字串 *** )。
通過 形式文法 來產生(參見 喬姆斯基譜系 )。
通過正則表達式來產生。
通過某種自動機來識別,比如 圖靈機 、 有限狀態自動機 。
自動機
automata
對信號序列進行邏輯處理的裝置。在自動控制領域內,是指離散數字系統的動態數學模型,可定義為一種邏輯結構,一種演算法或一種符號串變換。自動機這一術語也廣泛出現在許多其他相關的學科中,分別有不同的內容和研究目標。在計算機科學中自動機用作計算機和計算過程的動態數學模型,用來研究計算機的體系結構、邏輯操作、程序設計乃至計算復雜性理論。在語言學中則把自動機作為語言識別器,用來研究各種形式語言。在神經生理學中把自動機定義為神經網路的動態模型,用來研究神經生理活動和思維規律,探索人腦的機制。在生物學中有人把自動機作為生命體的生長發育模型,研究新陳代謝和遺傳變異。在數學中則用自動機定義可計算函數,研究各種演算法。現代自動機的一個重要特點是能與外界交換信息,並根據交換得來的信息改變自己的動作,即改變自己的功能,甚至改變自己的結構,以適應外界的變化。也就是說在一定程度上具有類似於生命有機體那樣的適應環境變化的能力。
自動機與一般機器的重要區別在於自動機具有固定的內在狀態,即具有記憶能力和識別判斷能力或決策能力,這正是現代信息處理系統的共同特點。因此,自動機適宜於作為信息處理系統乃至一切信息系統的數學模型。自動機可按其變數集和函數的特性分類,也可按其抽象結構和聯結方式分類。主要有:有限自動機和無限自動機、線性自動機和非線性自動機、確定型自動機和不確定型自動機、同步自動機和非同步自動機、級聯自動機和細胞自動機等。
這可能有你想要的答案
./question/7218281?fr=qrl3
問題九:編譯原理中"(E)"表示什麼 字元( 表達式 字元)
㈣ 編譯原理中詞法分析和語法分析的任務分別是什麼
在編譯原理中,語法規則和詞法規則不同之處在於:規則主要識別單詞,而語法主要識別多個單片語成的句子。
詞法分析和詞法分析程序:
詞法分析階段是編譯過程的第一個階段。這個階段的任務是從左到右一個字元一個字元地讀入源程序,即對構成源程序的字元流進行掃描然後根據構詞規則識別單詞(也稱單詞符號或符號)。詞法分析程序實現這個任務。詞法分析程序可以使用lex等工具自動生成。
語法分析(Syntax analysis或Parsing)和語法分析程序(Parser)
語法分析是編譯過程的一個邏輯階段。語法分析的任務是在詞法分析的基礎上將單詞序列組合成各類語法短語,如「程序」,「語句」,「表達式」等等.語法分析程序判斷源程序在結構上是否正確.源程序的結構由上下文無關文法描述.
語義分析(Syntax analysis)
語義分析是編譯過程的一個邏輯階段. 語義分析的任務是對結構上正確的源程序進行上下文有關性質的審查, 進行類型審查.語義分析將審查類型並報告錯誤:不能在表達式中使用一個數組變數,賦值語句的右端和左端的類型不匹配.
㈤ 編譯原理課程設計-詞法分析器設計(C語言)
#include"stdio.h"/*定義I/O庫所用的某些宏和變數*/
#include"string.h"/*定義字元串庫函數*/
#include"conio.h"/*提供有關屏幕窗口操作函數*/
#include"ctype.h"/*分類函數*/
charprog[80]={'