合工大 編譯原理 實驗三

2021-10-25 05:14:58 字數 1754 閱讀 2326

合工大 編譯原理 實驗三 lr(1) 分析法

本專案使用c++實現,利用windows api製作了簡易的ui介面。

具體功能如下:

支援檢視文法,專案族,lr(1) 分析表,句子歸約過程。

可使用包含左遞迴的文法且在過程中不生成新終結符

利用graphviz檢視dfa轉換圖

詳細功能、示例截圖、專案**請見github:lr(1)分析

//利用檢測firstset變動情況來求first集的函式,試圖忽視左遞迴與回溯,並不產生新的非終結符

void checklr1class:

:getfirstsets()

}}}for

(auto i = copyedgrammarformula.

begin()

; i != copyedgrammarformula.

end(

); i++)if

(vnset.

find

(i->first.at(

0))!= vnset.

end(

)&& firstset[i->first.at(

0)].

size()

!=0)}

if(isthishasincluded == false)}if

(isallhasincluded == false)}}

}}if(isfirstsetincreased == false)

}}

2.製作dfa分析

本函式使用佇列來進行生成dfa,佇列中儲存需要展開(求取其子節點)的專案族,每次取佇列中的隊首進行展開,並將其子節點新增到佇列中(前提為未曾在佇列**現過)。

void checklr1class:

:makeanalysedsheet()

; tmp.grammarvn = "0";

tmp.index = 0;*/

symbolset tmpsymbolset;

tmpsymbolset.

insert

('#');

= tmpsymbolset;

projectsentence tmp =

make_tuple

("0"

, string

, tmpsymbolset,0)

; initalstatusblock.projectitem.

insert

(tmp)

; initalstatusblock +

=getclosure

(initalstatusblock)

;//set> alreadyexpanedstatusblock; //已經展開過的狀態族集合的集合 由於statusblock結構中存在自增變數無法利用

stack searchingstack;

searchingstack.

push

(initalstatusblock)

;while

(searchingstack.

empty()

== false)}if

(isfinded==false )

//尚未進行展開

searchingstack.

push

(tmpfetchedstatusblock);}

}//該函式產生父節點與子節點之間的對應關係map,故後續需轉化輸出處理

}

南工大 編譯原理實驗

南工大 編譯原理實驗 一 上機實習目的 理解編譯程式的構造原理,掌握編譯程式的構造方法與技術。通過實習,使學生既加深對編譯原理基礎理論的理解,又提高動手能力,特別是提高軟體設計能力。二 上機實習要求 在理解編譯原理基本思想的基礎上,選擇乙個自己熟悉的程式語言,完成編譯程式的設計和實現過程。本上機實習...

合工大離散數學實驗 油管實驗

實驗準備 最小生成樹問題,求最小生成樹的prim演算法 實驗目的 運用最小生成樹思想和求最小生成樹程式解決實際問題 實驗過程 八口海上油井相互間距離如下表,其中1號井離海岸最近,為5km。問從海岸經1號井鋪設油管把各井連線起來,怎樣連油管長度最短 為便於檢修,油管只准在油井處分叉 prim演算法原理...

哈工大編譯原理實驗1 詞法分析

設計實現類高階語言的詞法分析器,基本功能如下 1 能識別以下幾類單詞 識別符號 由大小寫字母 數字以及下劃線組成,但必須以字母或者下劃線開頭 關鍵字 型別關鍵字 整型 浮點型 布林型 記錄型 分支結構中的if和else 迴圈結構中的do和while 過程宣告和呼叫中的關鍵字 運算子 算術運算子 關係...