代碼在https://github.com/xuan45/Compiler-Principle
記得點個star哦
Introduction
編譯原理實驗
- 詞法分析器和LL(1)文法核心代碼均采用C++實現(xiàn),服務端代碼使用Koa2實現(xiàn),前端可視化代碼使用React實現(xiàn)
js作為膠水層(node-ffi)將c++運行的結果轉發(fā)給前端,數(shù)據(jù)格式使用json - LR(1)文法我用的是JavaScript,原因是我做LL(1)文法的時候,要把預測分析表可視化出來,這樣去拼接json字符串給nodejs太麻煩了
于是我就用了JavaScript,便于可視化圖表等,而且數(shù)據(jù)結構也比C++好用
使用
npm install 安裝依賴
npm run server 開啟服務端
npm run dev 開啟react開發(fā)
npm start 同時啟動server和dev
環(huán)境:
windows10 + vs2015 + nodejs-v8.9.3
- ffi引用dll庫時參考的文章
- ffi引入函數(shù)名錯誤參考的文章
- 編譯dll的時候,在CompilersPrinciplesDll.cpp文件里面引入iostream, string等頭文件報錯,將頭文件引入至stdafx.h即可解決
- ffi里面的string類型對應c++是char* 類型的,而我需要使用string,直接使用string無法獲取參數(shù)和結果,所以寫了個函數(shù)轉換
- 其實可以不用ffi的,但是要安裝c++編譯器,利用child_process.exec去執(zhí)行cpp文件,然后利用exec返回的子進程進行管道通信
// char* 可直接賦值給string
// string 轉 char*,用來返回結果給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'; //加上結束符
return p;
}
效果預覽
- 詞法分析
詞法分析我是利用循環(huán)來實現(xiàn)自動機匹配標識符,數(shù)字等等

image.png
- LL(1)
LL的關鍵在于求出first集和follow集,求first集的時候要注意消除左遞歸,然后根據(jù)first集和follow集求出預測分析表

image.png
-
LR(1)
image.png
