編譯原理實驗,詞法分析,LL(1),LR(1)

代碼在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
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容