合工大 編譯原理 實驗三 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 過程宣告和呼叫中的關鍵字 運算子 算術運算子 關係...