代碼在https://github.com/xuan45/Compiler-Principle
記得點(diǎn)個(gè)star哦
Introduction
編譯原理實(shí)驗(yàn)
- 詞法分析器和LL(1)文法核心代碼均采用C++實(shí)現(xiàn)异逐,服務(wù)端代碼使用Koa2實(shí)現(xiàn)捶索,前端可視化代碼使用React實(shí)現(xiàn)
js作為膠水層(node-ffi
)將c++運(yùn)行的結(jié)果轉(zhuǎn)發(fā)給前端,數(shù)據(jù)格式使用json - LR(1)文法我用的是JavaScript灰瞻,原因是我做LL(1)文法的時(shí)候腥例,要把預(yù)測(cè)分析表可視化出來,這樣去拼接json字符串給nodejs太麻煩了
于是我就用了JavaScript酝润,便于可視化圖表等燎竖,而且數(shù)據(jù)結(jié)構(gòu)也比C++好用
使用
npm install 安裝依賴
npm run server 開啟服務(wù)端
npm run dev 開啟react開發(fā)
npm start 同時(shí)啟動(dòng)server和dev
環(huán)境:
windows10 + vs2015 + nodejs-v8.9.3
- ffi引用dll庫時(shí)參考的文章
- ffi引入函數(shù)名錯(cuò)誤參考的文章
- 編譯dll的時(shí)候,在CompilersPrinciplesDll.cpp文件里面引入iostream, string等頭文件報(bào)錯(cuò)要销,將頭文件引入至stdafx.h即可解決
- ffi里面的string類型對(duì)應(yīng)c++是char* 類型的构回,而我需要使用string,直接使用string無法獲取參數(shù)和結(jié)果,所以寫了個(gè)函數(shù)轉(zhuǎn)換
- 其實(shí)可以不用ffi的纤掸,但是要安裝c++編譯器脐供,利用child_process.exec去執(zhí)行cpp文件,然后利用exec返回的子進(jìn)程進(jìn)行管道通信
// char* 可直接賦值給string
// string 轉(zhuǎn) char*,用來返回結(jié)果給nodejs
char* to_char_pointer(string str) {
int length = (int)str.length();
char *p = new char[length + 1];
for (int i = 0; i < length; ++i) {
p[i] = str[i];
}
p[length] = '\0'; //加上結(jié)束符
return p;
}
效果預(yù)覽
- 詞法分析
詞法分析我是利用循環(huán)來實(shí)現(xiàn)自動(dòng)機(jī)匹配標(biāo)識(shí)符借跪,數(shù)字等等
image.png
- LL(1)
LL的關(guān)鍵在于求出first集和follow集政己,求first集的時(shí)候要注意消除左遞歸,然后根據(jù)first集和follow集求出預(yù)測(cè)分析表
image.png
-
LR(1)
image.png